标了一些不理解的部分用问号显示!希望有人能解答
1、JS是一种动态类型的,面向对象的脚本语言,他运行在宿主环境之中,他的宿主环境通常是一个WEB浏览器。
2、JS没有类的概念,使用原型实现继承
3、JS还具有函数式程序语言的特性:闭包,将函数作为第一类(first-class)对象,匿名函数,高阶函数.....
4、在JS中,所有数值都是64位双精度的,取值范围从-5e-324到1.7976931348623157e308
5、JS中整数和浮点数都是number类型
>typeof 1;
>typeof 1.5;
6、所有JS数值都会按照IEEEE-754双精度二进制数标准进行表示。
>.1+.2
0.30000000000000004
7、JS没有内置的十进制数据类型,但是JS为数值提供了两个方法:toFixed,toPrecision,这两个方法可以按照固定数的小数来格式化数值
num.toFixed(2);//保留两位小数
num.toPrecision(8);//共保留8位
8、如果使用了超出64位范围的数值或者获得一个超出64位范围的值,JS返回一个特殊数值:Infinity无穷大,-Infinity。其他特殊值还有NaN
9、有内置的isNaN(x);
10、JS支持八进制(基数8,0开头)和十六进制(基数16,x开头)
???
Math.round((.1+.2)*100)/100
0.3
11、充分利用内置对象可以节省时间,提高效率
12、使用字符串,字符串是一个由0或者多个16位unicode字符组成的系列。字符串也是不可变得对象,常用方法比如说
“zifuchuan”.indexOf("z")
0
"zifuchuan".charAt(0)
z
13、空字符串,NaN值,null,undefined,数值0和关键字false都是false
14、typeof NaN 得到number
15、==会在比较值钱进行强制类型转换
16、日期(建议使用Date.js库)
var thisMoment=new Date();
console.log(thisMoment);
console.log(thisMoment.getFullYear());
输出:
Tue Nov 07 2017 15:18:19 GMT+0800 (中国标准时间)
2017
17、避免出现undefined因为undefind可以被重新赋值
18、null是JS的一个内置对象
19、Js支持的数据类型:Number,String,Boolean,Object,Function,Array,Date,RegEx,Null,Undefined
20、各种不同的error类型:Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError
21、如果使用var关键字来声明变量,那么该变量是持久的,且不能删除该变量。隐式(没有var)声明的变量是全局作用域。
22、数组,函数,正则表达式,数值字符串布尔值都是对象(红字是不可变),两种方式实例化对象
(1)通过new
var myObkect=new Object();
new关键字会调用构造函数(构造器),this关键字引用当前对象,
不能对他赋值,但是可以把this关键字的值赋给另一个变量?//构造函数
function Zombie(name){
this.name=name;//这样不算赋值么??
}
var smallZombile=new Zombile(“book”);
(2)对象字面量方式
var myObject={
"prop1":"prop1value",
"prop2":"prop2value"
};
获取:
myObject['prop1']
“prop1value”
myObject.prop2
"prop2value"
23、因为是动态语言所以更新一个属性只需要重新赋值,移除一个属性只需要delete,遍历用for...in
for(var i in 对象){}
24、JS使用原型继承
原型继承:对象直接从其他对象继承。原型就是其他对象的模型
一个内置对象Object.prototype位于继承层次的顶端,所有其他对象都继承了该对象。在继承树中的每一个对象,都可以通过prototypr属性连接起来。
25、获取属性通过delegation,如果属性不存在那么会通过原型对象查找该属性,如果还是没有会通过圆形原型树向上查找,直到查到原始的Object.prototype,再找不到返回undefined
26、可以通过将函数添加到原型对象来创建方法,也可以直接将函数添加到对象。方法总是具有名为this的参数,this是对调用该方法的对象的一个引用
function Monster(type){
this.type=type;
}
Monster.prototype.getType=function(){
return this.type;
}
function Zombie(name){
this.name=name;
}
Zombie.prototype=new Monster();
Zombie.prototype.eatPeople=function(){
console.log("taste like chicken");
}
没有输出?
27、引用reference是一个指向对象实例位置的指针。Object是引用类型,由于所有对象都是通过引用传递的,修改绑定于一个原型的属性,将修改基于该原型的所有其他对象的原型
smallZombie.eatPeople().//smallZombie是哪里的?
delete Zombie.prototype.eatPeople;//写了这句才会执行taste like chicken,不知道为什么?
28、初始化对象
//引用同一个对象
var obj1=obj2={};
//obj1和obj2引用的是不同的对象
var obj1-{};
obj2={};
29、要检查对象的属性是否存在可以使用
hasOwnProperty()返回的是布尔值
30、减少冲突的方法
(1)使用单个全局变量作为顶层对象
ZOMBIE_GENERATOR={}
ZOMBIE_GENERATOR.Zombies={
smallZombie:'bb',
largeZombie:'bue'
}
(2)使用闭包
31、函数没有返回值那么就返回undefined
32、JS是第一类的(first-class)意味着可以像处理其他js对象一样处理js函数,可以给函数赋一个变量,或者保存在另外一个数据结构中(数组或者对象)
33、第一类函数两个特性非常重要->对于jQuery来说
(1)将函数作为参数传递给其他函数
(2)匿名函数
->立即调用的函数表达式IIFE或者称为自执行匿名函数
(function(x,y){
console.log(x+y);
})(5+6);
11
包装在圆括号里面会把function(){}块识别成一个函数表达式
34、IIFE
var x=42;
console.log(x);
var message=(function(x){
return function(){
console.log("x is "+x);
}
})(x);
message();
x=12;
console.log(x);
message();
无论在外部作用域中x的值发生了什么变化,闭包将记住函数执行时变量x的值
35、理解执行上下文
执行上下文是一种对象,代码在执行上下文环境中执行。可以通过this关键字访问执行啥执行上下文,this关键字是对当前执行上下文对象的引用。
36、除了不能访问this关键字和参数之外,嵌套函数可以访问外部函数中定义的变量,这一机制是通过闭包来实现的,她指的是即使在外部函数结束执行之后,内部嵌套的函数继续保持它对外部函数的引用。闭包还有助于名称空间的冲突。
37、每次调用一个包裹的函数时,虽然函数的代码并没有改变,但是js将为每一次调用创建一个新的作用域。
function getFunction(value){ return function(value){ return value; } } var a=getFunction(),b=getFunction(),c=getFunction(); console.log(a(0));//0 console.log(b(1));//1 console.log(c(2));//2 console.log(a===b);//false
38、当定义一个独立函数(不绑定任何对象的时候),this关键字绑定于全局名称空间。作为一个最直接的结果,挡在一个方法内创建一个内部函数时,内部函数的this关键字将绑定于全局名称空间,而不是绑定于该方法。为了解决这一问题,可以将包裹方法的this关键字简单赋值给that(中间变量)
??
obj={}; obj.method=function(){ var that=this; this.counter=0; var count=function(){ this.counter+=1; console.log(that.counter); } count(); count(); console.log(this.counter); } obj.method();
//书上1 1 2运行0 0 0,除非把this改成that?
39、在js中可以实现与私有或者专有属性类似的访问级别效果,要实现私有访问或者属性,请使用闭包
40、声明一个名称空间,将有关函数绑定于该名称空间,并定义私有成员和专有成员即可function TimeMachine(){ //私有变量 var destination="october 5,1959"; //公有变量 this.getDestination=function(){ return destination; }; } var delorean=new TimeMachine(); console.log(delorean.getDestination()); console.log(delorean.destination);
要有设置器和访问器
41、JS数组,两种方式创建
(1)Array()
(2)数组字面量
42、扩展类型???
String.prototype.boolean=function(){ return "true"==this; }; var t='true'.boolean(); var f='false'.boolean(); console.log(t); console.log(f);
每次反复输入prototype显得累赘,因此有简洁的method方法可以扩充Function.prototype
Function.prototype.method=function(name,func){
this.prototype[name]=func;
return this;
};
43、使用parsetInt最好指定基数或者用加号String.method('boolean',function(){ return "true" == this; });
parseInt("010",10);
+"010"
44、尽量用===,避免意料之外的类型转换
45、尽量不用eval(),里面的字符串会作为js代码执行
46、构造函数尽量首字母大写,其他函数不要大写
47、不要使用with语句
?原因