js中容易掉坑的几道面试题
今天看了几道面试题,有点易错,嗯,整理出来,大家一起看喽
1、看题:
(function(){
var a = b = 3;
})();
console.log("a defined? " + (typeof a !== 'undefined'));//a defined? false
console.log("b defined? " + (typeof b !== 'undefined'));//b defined? true
解释:
因为声明var a = b = 3;相当于
b = 3;
var a = b;
并且var a = b; b最终成为一个全局变量(因为它不在var关键字后面),因此它仍然在作用域内,即使在封闭函数之外。
注意,在严格模式下(即,使用strict),语句var a = b = 3;会产生一个ReferenceError的运行时错误:b没有定义,从而避免了可能导致的任何头headfakes/bugs。 (这就是为什么你应该在你的代码中使用strict,一个重要的例子!)2、看下面的题,先不要看答案,猜猜打印的结果是什么?
var d ={};
var arr = ["leo","donna"];
arr.forEach(function(k) {
d[k] = undefined;
});
console.log(d);
console.log(arr);
嗯嗯,先想想…………………………………………………………………………………………………………………………………………………………
ok,公布答案:
console.log(d);//{leo: undefined, donna: undefined}
console.log(arr);//["leo", "donna"]
看解释如下
上面显示的代码片段在对象d上设置了两个属性。理想情况下,对具有未设置键的JavaScript对象执行的查找评估为未定义。但是运行这段代码会将这些属性标记为对象的“自己的属性”。
这是确保对象具有一组给定属性的有用策略。将该对象传递给Object.keys将返回一个包含这些设置键的数组(即使它们的值未定义)。
3、再看一个比较考眼力的题:
function foo1()
{
return {
bar: "hello"
};
}
function foo2()
{
return
{
bar: "hello"
};
}
console.log(foo1());
console.log(foo2());
友情提示,在作答之前一定要看清题哦!
嗯、公布答案
console.log(foo1());//{bar: "hello"}
console.log(foo2());//undefined
有没有想到呢?坦白说,当我看到这个答案的时候,我就在想,为什么?一样一样的,为什么结果不一样?
嗯、先看解释(原文的解释很长,但我觉得关键的是下面的,而且越多,反而看不到重点)
在foo2()中遇到包含return语句的行(没有其他内容)时,会在return语句之后立即自动插入分号。
所以:第二个函数相当于:
function foo2()
{
return ;
{
bar: "hello"
};
}
这么看,确实返回undefined,所以我们自己写代码的时候也要注意哦
4、再看一个容易掉坑的题:
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
猜猜看,结果是什么?10,5?……………………no no no
正确答案为:10 2
一脸懵?哈哈, 且看解释(只提炼关键解释)
返回10就没什么好疑问了,如果不会,那就要好好看看基础了。主要解释的是为什么结果是2
我们知道我们可以使用arguments []数组访问JavaScript函数中的任意数量的参数。
因此arguments[0]只不过是调用fn()。在fn里面,这个函数的作用域成为参数数组,并且记录参数[]的长度将返回2。
如果有什么不懂的,或者,想要了解更多,请看:http://web.jobbole.com/94523/
上一篇: 苏康码黄码怎么变绿码需要几天?苏康码黄码变绿码的条件
下一篇: 为权臣堕胎的元朝太后,此人是谁?
推荐阅读