配置Node.js环境:
1.下载64位Node.js
2.打开CMD查询是否安装成功或者版本号 node -v
=======================================
IDE :subline
=======================================
文件夹隐藏扩展名=》在文件名选项修改或者勾选文件扩展名
设置默认编辑器=》选择打开方式修改
===========================================
可以解析执行js:node,浏览器(脚本语言只有解析,不用编译)
node解析步骤:
1书写js文件
2在js文件的文件夹内 shift+右键=》window PowerShell
3输入dir查看js信息
4输入node main.js 点Tab自动补齐
注意 :保存文件并且js语句开头要小写
注释:// 多行注释 /* */
win10编辑卡顿 =》右键属性,取消快速编辑
windos PowerShell 命令缓存=》 上下键
==========================================
变量 :自动内存分配
js变量只存该语言类型的数据和引用
js使用var定义变量 var a1=8 ; var a2=7.5 ;var a3=true;
通过行数,提示原因找错误
undefine :未定义,即使定义了变量不赋值或者赋值不对也会报错
var a=null(允许)
取得变量类型
var b=false
type of b
注意变量使用范围
===============================================
表达式:
赋值=
算术:+-*/ % 括号
判断: >= <= == != <>
字符连接
console.log(re,re+4) :没有改变re的值
简化表达 :
+= -=
-- ++
=================================================
条件 :
if()
{
}
else {}
多条件:
if(条件)
else if(条件)
else if (条件)
else
逻辑运算符 :&& ||
注意 :尽量不要在判断语句中做运算
num+=1
if(num)
//多条件,case
swich (value)
{
case 1:
{}
break;
case 2:
{}
break ;
case 3:
{}
break;
defalut :
{}
break ;
}
循环 :
while (条件)
{
}
for(初始化语句;条件判断;迭代递增或者递减)
{
}
var i=4;
var j=5;
for(i=5,j=6;i+j<80;i=i+1,j=j+1)
{}
循环控制 :运用场景:for,while
continue(跳出本次循环)
break 终止循环
===============================================
字符串 :
var str=“XXX”;
var str=‘XXX’;
var array=【】;空数组
array=【1,2,3,4】; 数字
array=【1,true,“Hello“,【1,2,3】】 数组嵌套
0作为数组索引开始
注意索引是否越界
===============================================
表
var table=
{
age:14;
name: "XXX";
arrayxxx:【1,2,3,{
adrr:”127.0.0.1“,
port:6000
}]
}】
table :
{
XXX :XXX
X
}
array2;array
}
表可以存放所有的数据类型 , 数组内可以存表 ,表存数组
表的访问 =》key本质字符串
array2【”XXX“】
array2.XXX;
整数key只能 表对象【整数值】 或者【”整数值“】访问
增加表成员 :表对象.XXXkey=XXX;
==========================================
函数:
fuction XXX(参数)
{
代码块
}
function XXX(a1,a2)
{
XXXXXXXX;
retun XXX;(返回并跳出方法)
}
调用 :
XXX(3,4);
存放结果:
var ret=XXX(3,4);
引用传递 :
var my_add=XXX;
ret =my_add(3,4);
表中存方法=》
var mathabc={
my_add:XXXXXXXX;
func_key :fuction()
{
XXXXXXXX
}
}
var ret =mathabc.my_add(3,5);
mathabc.func_key();
=======================================================
Math函数:
Math.PI ;圆周率
Math.random(); [0,1) 0到1 不包含1的小数
var value=min+(max-min+1)*Math.random();
向下取整:
Math.floor();
三角函数 sin ,cos,tan
value =Math.sin(XXXXXXXX);//传入弧度
var degree=r*180/Math.PI ( 传入r 为弧度,转为角度)
var r=(degrees/180)*Math.PI; (传入degrees为角度,转为弧度)
反三角函数
value =Math.asin() //传入弧度
atan2 :返回坐标角度 范围(-180,180]=>(-PI,PI]
var r=Math.atan2(1,1);
value =rad2deg(r);转角度
Math.sqrt();开根号
====================================================
数组高级使用 :
array .length;
for(var index in array)
{
}
for(var i=0;i<array_data.length;i++)
{
}
数组添加对象
array_data.push(100);
array_data.push("Hello");
array_data.push({
key :"value"
})
找索引:
var array_data.indexOf(300)//填写的是数组的值
参数=>从2索引开始,删除个数
var data2=array_data.splice(2,2);
数组排序:
array_data=[1,2,3,4];
sort传入方法
array_data.sort(
function(Ihs,rhs)
{
if(Ihs>rhs)
{
return -1;
}
else if (rhs>Ihs)
{
return 1;
}
else
{
return 0;//Ihs==rhs
}
})
随机排序
array_data.sort(
function ( Ins,rhs)
{
if(Math.random()<=0.5)
{
return -1;
}
else
{
return 1;
}})
抽取随机:
value =array_data[0]
=============================================
表的高级使用:
删除对应的key
delete XXX["XX "]
delete XXX.sss;
==============================================
字符串高级 :
var str="XXXX "
str.length;
str.indexOf("X") 首次出现位置索引
var new_str= str.replace("X","3q")//替换,产生新对象
大小写并产生了新对象
str.toLowerCase();
str.toUpperCase();
============================================
require("./XXX")
第一次加载js文件并执行=>如果加载过就不执行,但都返回一个module.exports对象,需要在被加载的文件中定义module.exports对象,没有定义则返回{}
加载的文件通过util可以调用被加载的js中的对象
加载:
var util=require("./XXX")
被加载:
var utils=
{
add:add,
test:test,
};
module.exports=util;//util为对象
一般用类名定义接收,易于查找
============================================
function fun1(a1,a2)
{
this;
}
1.this的显式传递=>上层决定this
函数.call :
fun1.call({ XXXX },3,4) this={XXXX} 可以是表或者任意对象
2.this的隐式传递=>
var tools=
{
fun1:fun1,
}
表的函数key() tools.fun1=>this=表
3.this的强制传递 =>底层决定this,优先级最高
var new_fun=fun1.bind({name ;"blake'});
new_fun(3,4);
tools.fun1=new_fun;
tools.my_fun(3,4); 结果this依旧为强制表
fun1(3,4) //fun1为原方法,因为bind生成了新的方法对象,该相关的this为强制表,所以本this还是和环境有关的值console
new_fun.call({name :"" },3,4)//this还是强制表
结论:
强制的表显示call,隐式也无法改变
=============================================
构造函数=>
function:可以填充表字段对象
function person(name,age)
{
this.name=name;//增加属性
}
person.prototype : 函数的表 ,函数未初始时为空表,可以填充方法,类的原型
person.prototype.get_age=function()
{
return this.age;
}
var blake=new person("blake");
//step1:产生一个新表,调用person的方法,相当于显示call传递this=》this表示新表
step2:同时会产生一个对象 (新表._proto_),并复制prototype表的内容
var ret=blake.get_age();
注意点
1会先去blake表中去寻找是否有get_age()key,没有就去新表._proto_下去找
2如果没有强制的this绑定, 新表.方法=>this为新表
3只有新表的字段属性和_proto_是属于新表的,其他的如方法只是new 新对象添加字段的手段,prototype是方法的复制手段
等价于=>
function new_person(name)
{
var instance={};
person.call(instance,name);//把instance作为this ,this.name为instance表添加key
instance._proto_={};
for(var key in person.prototype)
{
instance._proto_[key]=person.prototype[key];
}
return instance;
}
var xiaohong =new_person("xiaohong")
var ret=xiaohong.get_age();
等价于=》
var my_person=
{
name:"XXXX";
age :12,
_proto_ :
{
get_name:person.prototype.get_name,
get_age:person.prototype.get_age,
}
}
===========================================================
错误 :
Invalid or unexpected token(无效或者意外标记)=》格式不正确=》注意逗号,括号
==============================================================
subline快捷键:
https://blog.csdn.net/mycms5/article/details/70194045/
多行注释 ctrl+ “+”+ /
==============================================================
类:通过构造方法和xxx.prototype(类的成员函数)组成类,一类组成结构相同的对象
构造函数和成员函数中的this为各自的类,可以完成各自的逻辑。
Enemy.js:
function Enemy(name ,age)
{
this.name=name;
this age=age;
}
Enemy.prototype.acctack_player=fuction()
{
consele.log("attack_player",this);//this代表Enemy新表
}
module.exports=Enemy;//Enemy为方法
main.js:
var Enemy=require(“./Enemy”)
var e1=new Enemy("hao",12);
e1.attack_player();
var e2=new Enemy("jj",16);
e2.attack_player();
=========================================================
类的继承=>获取原型方法,扩展方法
错误写法 :BossEnemy.prototype=Enemy.prototype =>
原因: 只是传递了Enemy.prototype的引用,并没有复制对象到BossEnemy.prototype中,改变表值会改变
Enemy.prototype的值
方法和字段的继承和扩展
方法1: 循环复制对象
function BossEnemy(name,age)
{
Enemy.call(this,name,age)//this为新表,,无表名
//扩展字段
this.blood=90;
}
BossEnemy.prototype={}
for(var i in Enemy.prototype)
{
BossEnemy.prototype[i]=Enemy.prototype[i];
}
方法2: 利用new机制复制
var a =function(){}//空表,只有prototype对象 ,通过中间者传输
a.prototype=Enemy.prototype;
BossEnemy.prototype=new a(); =>a._proto_=>Enemy.prototype
扩展方法:
BossEnemy.prototype.boss_attack=fuction()
{
XXX;
}
var boss=new BossEnemy(“你好”,45);
boss.boss_attack();
boss.acctack_player(); //acctack_player方法中的this为新表,无表名
==========================================
函数重载:
BossEnemy.prototype.attack_player=function()
{
Enemy.prototype.attack_player.call(this);//调用父类的attack_player,传入的是boss表
return this.name;
}
boss.attack_player();
===========================================
继承函数=>实现类的继承和扩展
Class方法=》构造函数=》传递参数为表
Class(
{
extend :Enemy, //继承对象
init :function()
{
}
boss_attack:function()
{
},
add:function()
{
}
}
);
var BossEnemy2 =function Class(Class_desic)//传入Class参数表引用
{
var new_class=function(name,age)//new_class的构造函数,可以传入参数
{
//字段继承
if(Class_desic.extend)
{
Class_desic.extend.call(this,name,age)//调用基类构造函数
}
//字段扩展
if(Class_desic.init)
{
Class_desic.init.call(this);//调用新类Class的初始函数
}
}
//方法继承
if(Class_desic.extend)
{
var a=fnction (){};
a.prototype=Class_desic.extend.prototype;
new_class.prototype=new a();
}
else
{
new_class.prototype={};
}
//方法扩展
for(var i in Class_desic)
{
if(i=="extend")
{ continue;}
new_class.prototype[i]=Class_desic[i];
}
return new_class;// BossEnemy2=new_class
}
var b2=new BossEnemy2("whhw",32); //生成新表 ,调用Class方法,传递 this, this为新表
总结:new 和方法有关,单一new构造函数和new 类 不同
============================================
代码规范:
快捷方式: ctrl+c, ctrl+v
跳过单词;ctrl+left or right;
选择单词 ctrl+shift+left or right
选中一行:shift+home or end
选中多行:shift+ up or down
win+E
shift+右键
缩进:一个Tab
命名:
1驼峰 getName();
2匈牙利 GetName,要加上类型标识 :iAge fDistance
3Linux命名 get_age
空格注意整齐
for(var i=0; i<=10,i++)
var utils=require("utils") //脚本名称和定义的名称相同可以方便寻找脚本对象
util.abc();
注意语法错误提示