JavaScript是基于词法作用域(lexical 是从平)的顶级对象,而不是动态划分作用域的。
JavaScript的原型链特性:原型继承,对象直接从其他对象继承属性
JavaScript只有一种数字类型,相当于Java中的double,避免强类型语言中的短整型溢出和各种由数字类型引发的问题
NaN是一个数值,表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。可以用isNaN(number)来检测NaN。
JavaScript在被创建的时候Unicode是一个16位的字符集,所以JavaScript中的所有字符都是16位的。
JavaScript没有字符类型。var str="";
字符有一个length属性,"seven".length=5;
*JavaScript中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不是在代码块中。
在判定时,一下值为假:
false
null
undefined
空字符串''
数字0
数字NaN
注:(if(-1) 判定为true; 双引号中有空格,判定为true)
for(variable in object){block};
for in 语句,会枚举一个对象的所有属性名(或键名)。在每次循环中,object的下一个属性名字符串被赋值给variable。
//通常
要检测obj.hasOwnProperty(myvar)来确定这个属性名是该对象的成员,还是来自于原型链:
for(myvar in obj){
if(obj.hasOwnProperty(myvar){
block;
})
}
return语句会导致从函数中提前返回。如果没有指定的返回表达式,那么函数的返回值为undefined
JavaScript中的”%“是”求余运算“,而不是数学意义上的”求模运算“当两个运算数都是整数时,这两种运算的结果相同,但存在负数时则同。
JavaScript的简单数据类型:(不可改变)
数字,字符串,布尔值(true个false),null,undefined
其他所有的值都是对象!
JavaScript中的对象是可变的键控集合(keyed collection)。
在对象字面量中,如果属性名是一个合法的JavaScript标识符且不是保留字,则并不强制要求用引号括住属性名。
"first-name":必须 first_name 可选
JavaScript的标识符中包含连接符(-)是不合法的,(_)就合法
"||" 运算符可以用来为对象属性填充默认值:
var middle=stooge["middle-name"]||"(none)";
var status=flight.status||"unknow";
尝试从undefined的成员属性中取值将会倒是TypeError异常。这时可以通过&&运算符来避免错误。
对象通过“引用”来传递,永远不会被复制
当创建一个新对象时,可以选择某个对象作为它的原型。
每个对象都链接到一个原型对象,并且它可以从中继承属性。
所有通过对象字面量的对象都链接到Object.prototype,它是JavaScript中的标配对象。
//如果对象之前没有拥有那个属性么,那么该属就被扩充到对象中。
if(typeof Object.beget !==’function‘){
Object.create=function(o){
var F=function(){};
F.roototype=o;
return new F();
};
}
原型链在更新时是不起作用的,当我们对某个对象做出改变时,不会触及该对象的原型;
原型链只有在检索值的时候才会被用到。
目标对象->原型对象->原型对象->.......->Object对象->undefined
该过程称之为:委托
hasOwnProperty()方法不会检查原型链
使用for in 时,属性出现的顺序是不确定的,要对任何可能出现的顺序有所准备。
最小化的使用全局变量的方法之一:为你的应用只创建一个唯一的全局变量:
var MYAPP={};
该变量此时变成了你的应用容器
函数也可以被定义在其他函数中,一个内部函数除了可以访问他自己的参数和变量,同时也能自由访问把他嵌套在其中的富含鼠的参数个变量。
除了声明时定义的形式参数,每个函数还接受两个附加的参数:this和arguments(实际传入的参数,个数可能不等于形参个数)。
当传入的实际参数个数大于形参个数时,函数执行时会忽略后面多余的参数,但若多余的参数是表达式,表达式依旧会执行。不过表达式产生的影响不会在本次函数调用中起作用,会对下次函数调用产生影响(如果该表达式改变原形参值的话);
如果实际参数的值过少,缺失的值会被替换成undefined。
arguments使得编写一个无需指定参数个数的函数成为可能。(但是arguments只是个array-like对象,没有数组方法!)
var sum=function(){
var i,sum=0;
for(i=0;iarguments.length;i+=1){
sum+=arguments[i];
}
return sum;
};
JavaScript的4种调用模式:(在如何初始化关键参数this上有差异)
方法调用模式:函数定义在对象内部,this到对象的绑定发生在函数调用时,实现超级延时绑定。
函数调用模式:当一个函数并非对象属性时,为函数模式调用,this绑定在全局对象上(这是语言设计上的错误!!)this仍然应该绑定到外部函数的this变量!
解决方案:
myObject.double=function(){
var that=this;//解决方法
var helper=function(){
that.value=add(that.value,that.value);
};
helper();
};
构造器调用模式:如果一个函数的创建目的就是结合new来调用,则被称为构造器函数。(不推荐使用)
Apply调用模式:apply方法允许选择this的值,可将它绑定到目标对象上,使用时需要向apply(Object,array)传递两个参数:绑定this的对象,参数数组。
如果函数调用时在前面加了new前缀,且返回值不是一个对象,则返回新对象的this
throw的exception对象:
{
name:'TypeError',
message:'message'
}
扩展基本类型函数:
Function.prototype.method=function(name,fnc){
this.prototype[name]=func;
return this;
}
自己创建整型:
Number.method('integer',function(){
return Math[this<0?'ceil':'floor'](this);
});
document.writeln((-10/3).integer());
移除字符串首尾空白:
String.method('trim',function(){
return this.replace(/^\s+||s+$/g,'');
});