前端每日一题搬运(1~5)
1.输出是什么?
D:
undefined
和ReferenceError
用var声明的变量存在声明提升,而let不会×会提升,但不会被初始化,所以在输出时name相当于声明未赋值状态,age处于不能被访问状态function sayHi() { var name; console.log(name); console.log(age); name = 'Lydia'; let age = 21; } sayHi();
2.输出是什么?
C:
3 3 3
和0 1 2
setTimeout()是异步函数,需要等待同步for执行结束后才开始执行,此时用var声明的变量 i 暴露在全局作用域下,已经被递增为3,所以输出三次的值相同;
用let声明的变量拥有块级作用域({}内),每次遍历得到的值会被保护起来,不被覆盖,所以各自输出递增后的新值
3.输出是什么?
B:
20
和NaN
diameter方法中的this.radius写在常规函数中,this指向当前调用的对象shape,结果10*2 = 20;
perimeter方法中的this.radius由于写在箭头函数中,不存在块级作用域,所以this指向当前周围作用域,因为该方法外没有其他常规函数,所以this指向全局对象window,结果2* Math.PI*undefined = NaN
4.输出是什么?
A:
1
和false
+触发隐式转换,true会被隐式转换为1;
!表示取反,字符串是真值,取反为false
5.哪一个是正确的?
A:
mouse.bird.size
是无效的
. 和 [“ ”] 都能访问对象中属性名对应的属性值,[" "] 还可以为对象添加任意属性名;
访问对象中不存在的属性名是无效的,而[ ]会解释完[ ]里面的内容再计算,所以mouse[bird.size]相当于mouse[“small”],为true