乐趣区

平时遇到的JS笔试题

  1. 下面代码的输出是什么?
    for (var i = 0; i < 3; i++) {setTimeout(() => console.log(i), 1);
    }

    for (let i = 0; i < 3; i++) {setTimeout(() => console.log(i), 1);
    }

答案:
由于 JavaScript 中的事件执行机制,setTimeout 函数真正被执行时,循环已经走完。
由于第一个循环中的变量 i 是使用 var 关键字声明的,因此该值是全局的。在循环期间,我们每次使用一元运算符 ++ 都会将 i 的值增加 1。
因此在第一个例子中,当调用 setTimeout 函数时,i 已经被赋值为 3。
在第二个循环中,使用 let 关键字声明变量 i:使用 let(和 const)关键字声明的变量是具有块作用域的(块是 {} 之间的任何东西)。
在每次迭代期间,i 将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。

  1. 下面代码的输出是什么?
    const shape = {
      radius: 10,
      diameter() {return this.radius * 2},
      perimeter: () => 2 * Math.PI * this.radius};
    
    shape.diameter();
    shape.perimeter();

请注意,diameter 是普通函数,而 perimeter 是箭头函数。
对于箭头函数,this 关键字指向是它所在上下文(定义时的位置)的环境,与普通函数不同!
这意味着当我们调用 perimeter 时,它不是指向 shape 对象,而是指其定义时的环境(window)。没有值 radius 属性,返回 undefined。

3. 下面代码的输出是什么?

    +true;
    !"Lydia";

一元加号会尝试将 boolean 类型转换为数字类型。true 被转换为 1,false 被转换为 0。

字符串 ’Lydia’ 是一个真值。我们实际上要问的是“这个真值是假的吗?”。这会返回 false。

退出移动版