考察JS基础的一些题目

一 、arguments

(function(){
    return typeof arguments;      //object
})();

arguments是每个函数都有的内置对象,和数组十分相似,但又不是数组,arguments对应的是函数传入的参数列表。

二、函数名

var f=function g(){return 1;};
typeof g();         //报错 g is not defined

一个名字为g的函数被赋值给了ff可以随意变动,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.定义变量yx
2.给y赋值1,给x赋值时从右向左看,将typeof x赋值给y,再将y的值赋给xtypeof xundefined,所以yundefined,xundefined

五、函数

(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.barfunction(){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;})返回的就是2typeof 2number

九、 函数名

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
  1. 没有声明过变量y,所以typeof y'undefined'
  2. x的值为typeof y即是'undefined'
  3. typeof x'string'
  4. 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值