使用 var 声明:
如果var出现在函数体内,是一个局部变量,如果出现在顶层,是一个全局变量,全局变量是全局对象的一个属性,和其他全局对象不同的是:用var声明的变量是无法通过 delete 删除的。
如果var语句中变量没有指定初始化表达式,这个变量初始化为 undefined.
变量声明语句会被提前到脚本或者函数的顶部。但是初始化操作还是在原来var语句的位置执行。在初始化之前的变量值是undefined。这里要注意的是在for中定义的变量同样会提前并在整个函数中可见。注意多次声明同一个变量是无所谓的。
function :
两种声明方式的不同:通过var变量声明只有变量提前,通过函数声明语句声明的函数,函数名称和函数体都被提前。
switch :
case表达式判断是通过 "===" 运算符进行比较的。
for/while :
在包含continue语句的情况下,while不能安全模拟for,因为在执行continue后for会进行增量++。
术语 :
内置对象(native object) : 是由ECMAScript规范定义的对象或类.例如:数组、函数、日期和正则表达式。
宿主对象(host object) : 是由javascript解释器所嵌入的环境( 如web浏览器 )定义的.如HTMLElement对象。
原型 :
对象创建方式 : {}、new object()、Object.create()。
{}创建的对象具有同一个原型对象,可以通过Object.prototype获取原型对象的引用。
通过new 构造函数调用创建的对象的原型就是构造函数的prototype属性的值。
使用new 构造函数调用时如果不传参数可以省去() 如 : new Object() 可以写成 new Object。
Object.create()创建一个新对象,第一个参数是这个对象的原型,第二个参数(可选)用以对对象的属性进行描述。
Object.create(null); //会创建一个没有原型的对象。
类属性 :
对象的类属性是一个字符串,用以表示对象的类型信息。对象默认的toString()方法返回对象的类信息如:[object Class]。但是对象继承的toString()方法被重写了的话,为了获取类信息,必须间接调用Function.call()方法如 : Object.prototype.toString().call()。
数组 :
delete 数组元素,并不影响数组的长度。也不会将元素从高索引处移下来填充已删除属性留下的空白,而是变成稀疏数组。
this :
var o = {
m : function(){
f();
function f(){
console.log( this ); // this 是全局对象 或 undefined
}
}
}
o.m();
arguments :
function f(x){
x = 1; // 也会改变arguments[0] 的 值 取决于调用方法的方式
console.log(x); // f(1) : 1, f() : 1
console.log(arguments[0]); // f(1) : 1 , f() : undefined
arguments[0] = 3; //也会改变 x 的值 取决于调用方法的方式
console.log(x); // f(1) : 3, f() : 1
console.log(arguments[0]); // f(1) : 3 , f() : 3
}
函数length :
function check(args){
var actual = args.length;
var ex = args.callee.length;
console.log(ex +','+actual); // 3,2
}
function f(x,y,z){
check(arguments);
}
f(1,2);
Function() 构造函数 :
var scope = 'global';
function cf(){
var scope = 'local';
return new Function('return scope');
}
cf()(); // "global" Function 创建的函数体代码的编译总是会在顶层函数执行
constructor属性 :
每个js函数都自动有一个prototype属性。这个属性的值是一个对象,这个对象包含唯一一个不可枚举的属性
constructor。constructor属性的值是一个函数对象:
var F = function(){}; // 这是一个函数对象
F.prototype.constructor === F; // true
构造函数的原型中存在constructor属性,这意味着对象继承的constructor指代它的构造函数。
var o = new F(); //创建类F的一个对象
o.constructor === F; // true : 对象从原型继承的constructor属性指代他的构造函数
一个例子:
function R( name ){
this.name = name;
}
// 指定一个新对象原型
R.prototype = {
toString:function(){}
};
var r = new R('ss');
console.log( r.constructor ); // function Object()
例子中这个新原型对象不含有constructor属性,因此R的实例对象也不含有constructor属性,可以通过设置函数的
的反向引用来补救。
R.prototype = {
constructor : R // 显示设置构造函数的反向引用
}
另一个解决方法是使用预定义的原型对象,该对象包含constructor属性,然后给原型对象添加方法.
R.prototype.toString = function(){};