欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js中容易掉坑的几道面试题

程序员文章站 2022-06-09 18:45:56
...

今天看了几道面试题,有点易错,嗯,整理出来,大家一起看喽

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/





相关标签: js面试题