前端面试题第二篇

#javascript一些蛋疼的语法特性

##昨天晚上,百无聊赖,突然在百度工具栏里输入蛋疼二字,结果度娘引导我走入了这篇文章,看完之后,什么蛋啊节操啊的全都碎了一地,不信你看

成功,唯有积累,没有奇迹

01.

(function () {  
    return typeof arguments;  
})();  
A. "object"
B. "array"
C. "arguments"
D. "undefined"

答案:A 注释:arguments本身就是对象,它的proto就是object,第一题感觉还可以是吧,往下看,你就看不到边儿了…………远远的全是坑……

02.

var f = function g() {
        return 23;
    };
typeof g();
A. "number"
B. "undefined"
C. "function"
D. Eorror

答案:D 注释:其运行结果为Uncaught ReferenceError: g is not defined 上面的是一个函数表达式,我们是不可以跨过f找到g的

03.

(function (x) {
    delete x;
    return x;
})(1);
A. 1
B. null
C. undefined
D. Error

答案:A delete运算符可以删除对象的属性;delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性;delete只能删除自有属性,不能删除继承属性!

04.

var y = 1,
    x = y = typeof x;
console.log(x);
A. 1
B. "number"
C. undefined
D. "undefined" 

答案: D 注释:首先第一个坑就是第二行与第一行之间的逗号,所以第二行仍然是var的赋值运算,其相当于var x = y = typeof x ;大体就是说 先typeof x 然后赋值给y再然后赋值给x ,故覆盖上面的 y=1 ,typeof x 又找不到,故为’undefined’值

05.

(function f(f) {
    return typeof f();
})(function () {
    return 1;
});
A. "number"
B. "undefined"
C. "function"
D. Error

答案:A

06.

var foo = {
    bar: function () {
        return this.baz;
    },
    baz: 1
};
(function () {
    return typeof arguments[0]();
})(foo.bar);
A. "undefined"
B. "object"
C. "number"
D. "function"

答案:A 注释:下面是一个匿名函数,函数有返回值,是0号参数的typeof,然后找到foo.bar,发现foo.bar是一个函数,其返回值是this.baz,这个this指针明显指向了对象foo,可是犹豫foo.bar并没有执行,故也没有返回值,答案就明显是undefined了

07.

var foo = {
    bar: function () {
        return this.baz;
    },
    baz: 1
};
typeof (f = foo.bar)();
A. "undefined"
B. "object"
C. "number"
D. "function"

答案:A 注释:这一道题的foo.bar仍然没有执行,它只是把foo.bar又重新赋值给一个f 使之成为一个函数表达式,相当于 var f = function(){return this.baz;}而后面的执行方式相当于f(),所以里面的foo.bar并没有执行,此时的this显然指向了全局,而全局里面并没有baz这个属性,所以答案就是”undefined”了

本题涉及到的知识点:

对象的属性函数调用时,this指向该对象,如果是函数正常调用,this则指向全局

08.

var f = (function f() {
    return "1";
}, function g() {
    return 2;
})();
typeof f;
A. "string"
B. "number"
C. "function"
D. "undefined"

答案: B 这个题我也不太懂,大家就用排除法吧,首先typeof得出的值不可能是undefined,而里面有两个匿名函数,总要运行一个的吧,现在有两种比较能说通的解释,1.function g离()这个运行比较近,所以就是B答案。2.运行后,后面的匿名函数覆盖了前面的匿名函数,所以是B答案。大家参考一下自己选择或验证吧。

09.

var x = 1;
if (function f() {}) {
    x += typeof f;
}
console.log(x);
A. 1
B. "1function"
C. "1undefined"
D. NaN

答案: C 注释:if()里面是没有作用域的,js预解析会把里面的function(){}提到上面,作用于全局,相当于var f; f = function(){}这样一个没有内容的函数表达式,而typeof f就是’undefined’的字符串,x = x + ‘undefined’,任何值和字符串相加仍然是字符串,所以答案就是’1undefined’的字符串了。

本题涉及的知识点:

1.if里面的变量没有作用域限制,相当于全局变量

2.函数声明在预解析时会提到当前作用域的最顶端

3.任何值和字符串相加,其结果仍然是字符串

10.

var x = [typeof x, typeof y][1];
typeof typeof x;
A. "number"
B. "string"
C. "undefined"
D. "object"

答案: B 注释:第一行相当于 x = typeof y 其值为字符串类型的’undefined’;下面的typeof x 就变成了’string’,然后再来一个typeof ‘string’其结果仍然是’string’

本题涉及知识点:

1.利用脚码调用数组中的属性

2.undefined的值是’undefined’的字符串,再经过几个typeof仍然是’string’

11.

(function (foo) {
    return typeof foo.bar;
})({
    foo: {
        bar: 1
    }
});
A、“undefined” 
B、“object” 
C、“number” 
D、Error

答案: A 注释:题中的整体是一个匿名函数,有一个foo的参数,但是后面的()中有一个大坑,就是foo:{bar:1}外面还有一个{}它是一个没有名字的对象,所以在上面的函数中是调用不到foo.bar的(无法跨级调用,若想调用,得在外面加一个对象名)
本题涉及的知识点:

1.{}是一个没有名字的对象,但是它的存在感还是很强的,千万不可以忽略他的存在

2.对象属性的调用必须逐级通过函数名调用,不可以跨越

12.

(function f() {
    function f() {
        return 1;
    }
    return f();
    function f() {
        return 2;
    }
})();
A、1 
B、2 
C、Error (e.g. “Too much recursion”) 
D、undefined

答案:B 注释:本题的外面仍然是一个匿名函数,在函数内部的函数声明会在预解析中提到当前作用域的顶端,后面的function f 覆盖前面的function f 方法,所以上面的函数就变成如下

(function f() {
        function f() {
            return 2;
        }
        return f();

})();

这样答案就明显是2了。

本题涉及知识点:

1.函数声明会在预解析中提到当前作用域的顶端

2.后面的重名函数会覆盖前面重名的函数

13.

function f() {
    return f;
}
new f() instanceof f;
A、true 
B、false

答案:B 注释:一般我们都会用一个变量来接住从f()中new出的实例(对象),直接写new f()指的就是f()本身,它本身instanceof它本身,肯定是不可能的,所以是false
本题涉及的知识点:

1.return f;指返回值是函数本身;

2.new出的实例没有对象接住时,指的是创建对象的函数本身

3.A instanceof fn,指 A 是从fn中new出的一个实例。

14.

with (function(x, undefined){}) length;
A、1 
B、2 
C、undefined 
D、Error

答案:B

下面是本文作者的寄语:

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1593