一 、arguments
(function(){
return typeof arguments; //object
})();
arguments
是每个函数都有的内置对象,和数组十分相似,但又不是数组,arguments
对应的是函数传入的参数列表。
二、函数名
var f=function g(){return 1;};
typeof g(); //报错 g is not defined
一个名字为g
的函数被赋值给了f
,f
可以随意变动,g
不可以,g
只可以在函数内部被访问,在函数外部访问的话会报错。
三、delete
(function(x){
delete x;
return x; //1
})(1)
delete
用于删除对象中的属性,但是必须基于对象删除,正确用法如下:
delete obj.x;
delete obj["x"];
delete
操作符只能作用在对象上,对函数名和变量操作无效,所以delete x;是没有作用的。
注:delete
操作符并不能直接释放内存,他只是中断了对象的引用。
四、赋值
var y=1,x=y=typeof x;
console.log(x); //undefined
赋值表达式从右向左执行,分析上述代码的步骤:
1.定义变量y
,x
2.给y
赋值1
,给x赋值时从右向左看,将typeof x
赋值给y
,再将y
的值赋给x
,typeof x
为undefined
,所以y
为undefined
,x
为undefined
。
五、函数
(function f(f){
return typeof f(); //number
})(function(){return 1;})
函数内部typeof f()
中的f()
是传入的参数,即function(){return 1;}
,参数的返回值为1
,所以typeof 1
返回number
。
六、this
var foo={
bar:function(){return this.baz;},
baz:1
};
(function(){
return typeof arguments[0](); //undefined
})(foo.bar)
js中传递参数为值传递,所以foo.bar
为function(){return this.baz;}
,在函数中执行这个内部函数时没有所在的作用域没有baz
变量,所以为undefined
。
七、this
var foo={
bar:function(){return this.baz;},
baz:1
};
typeof (f=foo.bar)(); //undefined
原理和上面一样,foo.bar赋值给f是将bar的值赋值,this不在指向foo。
八、逗号操作符
var f=(function f(){return '1';},function g(){return 2;});
typeof(f); //number
逗号操作符,对他的每个操作对象求值(从左到右),然后返回最后一个操作对象的值。
所以(function f(){return '1';},function g(){return 2;})
返回的就是2
,typeof 2
为number
。
九、 函数名
var x=1;
if(function f(){}){
x+=typeof f;
}
console.log(x); //1undefined
原理同第二题,函数f()
的函数名在外部是不能访问的,所以typeof f
是'undefined'
,x=x+'undefined'
所以x
为'1undefined'
。
注:typeof
返回的是字符串类型。.
十、 函数名
var x=[typeof x,typeof y][1];
typeof typeof x; //string
- 没有声明过变量
y
,所以typeof y
为'undefined'
x
的值为typeof y
即是'undefined'
typeof x
为'string'
typeof 'string'
为'string'
十一、视觉错误
(function(foo){
return typeof foo.bar; //'undefined'
})({foo:{bar:1}})
传入的参数foo
对象为{foo:{bar:1}}
,其中并不存在bar
属性,唯一的属性为foo
。
十二、函数声明
(function f(){
function f(){return 1;}
return f(); //2
function f(){return 2;}
})()
js中所有的函数声明都会被提前到代码执行之前,上面声明的两个名为f的函数,后面的会覆盖前面的,所以f()
为2
。
十三、new操作符
function f(){return f;}
new f() instanceof f; //false
注:instanceof
操作符用于检测一个某个对象是不是另一个对象的实例。
new
操作符:
1. 创建一个新对象。
2. 将构造函数的作用域赋给新对象(this指向新对象)
3. 执行构造函数中的代码(为新对象添加属性)
4. 返回新对象
注:一般构造函数不返回值,如果构造函数中返回一个对象,那将会覆盖上述生成的对象。
上述的new f()
返回了一个函数,这个函数是函数f
本身,他并不是函数f
的一个实例,所以instanceof
返回值为false
。
十四、with操作符
with (function(x,undefined){})
console.log(length); //2
with用于设置代码在特定作用域对象中的作用域。
输出length时,解释程序会先寻找length是否为本地属性,然后寻找是否是function(x,undefined){}的属性,因为function(x,undefined){}是个函数,所以length属性为传入参数的数量,值为2.