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。