JS面试蛋疼题

虽然到了年底,可是求职者还是不在少数。公司往往都会出其不意的出一些令人蛋疼的面试题,屡试不爽。接下来我为大家讲几道另类美的面试题,让大家过过瘾。知识有限,有错误的地方希望大家指正哦~

1、arguments是一个对象

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

2、这里将函数声明g()赋值给变量f,使之成为一个函数表达式。在这种情况下,原来的函数名g已经不可用,要通过f来调用。

var f = function g() {
    return 23;
};
console.log(g);//error
typeof g();//undefined

3、在讲之前先普及一下delete属性。

3.1 对象属性删除

function fun(){
    this.name = 'mm';
} 
var obj = new fun();
console.log(obj.name);//mm
delete obj.name;
console.log(obj.name); //undefined

3.2 变量删除(直接用delelte删除不了变量)

var name = 'lily';
delete name;
console.log(name); //lily    

3.3 删除不了原型链中的变量

fun.prototype.age = 18;
delete obj.age;
console.log(obj.age) //18

那么我们来看一下下面的面试题,答案显而易见。

(function (x) {
    delete x;//变量删除(直接用delelte删除不了变量)
    return x;//1
})(1);

4、这里var声明了y、x,分别给y赋值1,x的typeof赋值给y,再连续复制给x。这里补充一点,typeof检测出的类型是string类型。

var y = 1,
    x = y = typeof x;
console.log(x.length);//9,说明x是一个字符串,有自己的length    
console.log(x);//'undefined'

5

(function f(f) {
    return typeof f();//number
})(function () {
    return 1;
});

首先这是一个匿名函数f(),执行的时候传入一个参数,这个参数也是一个匿名函数,但是没有执行。所以就相当于:

(function f() {
    return typeof function () {
                        return 1;
                    }();//number
})();

执行结束后,typeof为number。
6

var foo = {
    bar: function () {
           return this.baz;
    },
    baz: 1
};
(function () {
       return typeof arguments[0]();//undefined
})(foo.bar);

接下来我们就该分析一下这段代码,首先foo是一个obj对象,下面是一个匿名函数,并且执行了。匿名函数传入的参数是foo.bar。在第一题我们提到arguments是一个对象,所以arguments0相当于argumentsfoo.bar,也就是arguments.foo.bar()。所以就相当于:

arguments.foo.bar();
bar = function(){
    return this.baz;
}

此时,bar函数是arguments对象的一个属性,所以,bar函数中的this指向arguments对象,然而arguments对象中并没有一个baz属性,所以返回undefined。
7

var foo = {
    bar: function () {
        return this.baz;
    },
    baz: 1
};
console.log(typeof (f = foo.bar)());//undefined

这一题和上一题有些相似,个人觉得比上一道题目容易理解一些。首先,一样foo是一个对象,有两个属性:bar、baz,(f = foo.bar)())其实就相当于f();如下:

function f(){
    return this.baz;
}();

这是一个普通的函数调用,this指向windows,windows中没有baz属性,undefined。
8、当()中有超过一个’参数’的时候,只解读最后面一个。

var f = (function f() {
    return "1";
}, function g() {
    return 2;
})();
console.log(typeof f);//number

9、f()因为if(),从函数声明变成了函数表达式,因此函数名fn不可用,当找不到fn时,报错。所以typeof出的是undefined。

var x = 1;
if (function f() {}) {
    x += typeof f;
}
console.log(x);//undefined

10、这一题没有什么可以说的,看注释就可以明白的。

var x = [typeof x,typeof y][1];
console.log(typeof x);//string
console.log(typeof y);//y没有定义,undefined
console.log(typeof typeof x);//string

11、这里执行语句中传入一个对象作为参数,该对象中有一个foo属性,也是一个对象。在function中调用该参数时,由于该参数没有名字,可以理解为foo作为该对象的名字。调用时不可以直接跨级调用。

(function (foo) {
    return typeof foo.foo.bar;//number
    return typeof foo.bar;//undefined
})//匿名函数
({
    foo: {
        bar: 1
    }
});//执行语句

12

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

JS在解析前要将函数声明赋值,由于函数名相同,所以该函数相当于:

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

由于知识有限,以下题目不做解释,知道的同学可以一起探讨。

function f() {
    return f;
}
new f() instanceof f;//false