公众号上看的每日一题,搬砖来记录下,会把一些重点的评论摘抄下来。
下面输出什么???
1、
function sayHi() {
console.log(name)
console.log(age)
var name = 'Lydia'
let age = 21
}
sayHi()
- A: Lydia 和 undefined
- B: Lydia 和 ReferenceError
- C: ReferenceError 和 21
- D: undefined 和 ReferenceError
2、
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
- A: 0 1 2 和 0 1 2
- B: 0 1 2 和 3 3 3
- C: 3 3 3 和 0 1 2
3、
const shape = {
radius: 10,
diameter() {
return this.radius * 2
},
perimeter: () => 2 * Math.PI * this.radius
}
- A: 20 and 62.83185307179586
- B: 20 and NaN
- C: 20 and 63
- D: NaN and 63
4、
+true;
!"Lydia";
- A: 1 and false
- B: false and NaN
- C: false and false
5、哪个正确
const bird = {
size: 'small'
}
const mouse = {
name: 'Mickey',
small: true
}
- A: mouse.bird.size是无效的
- B: mouse[bird.size]是无效的
- C: mouse[bird[“size”]]是无效的
- D: 以上三个选项都是有效的
答案和解答:
1、D
知识点:变量提升
一:undefined
(1) var 存在变量提升,所以name等于undefined
(2) let 不存在变量提升,并且支持块级作用域、禁止重复声明、暂时性死区
二:ReferenceError
(1)let 声明的变量存在暂时性死区。
使用 let/const 声明的变量,会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。
2、D
知识点:闭包、变量提升
var声明无块级作用域,let有块级作用域;同时settimeout为异步函数。等循环到最后,var的值被覆盖掉成最后一个值,而let每个值对应一块执行区域。 这里说明下,for循环是很快的,并不会等异步函数执行完当前操作才进行下一个哟。 所以说循环的时候用let百分百不会出现var声明的问题呢!
3、B
知识点为:箭头函数与普通函数的差别
1,shape定义所在环境,是window对象。
2,diameter方法中的this指向方法调用者,即shape。perimeter方法中的this指向方法调用者所在的环境,即window对象。
4、A
知识点:运算符之间的转换
1、true或false前面加上 + 或者 - 都会将其转变为对应的Number值.
2、字符串的话,前面加 !(非) ,会将其转变为Boolean值。非空字符串为true,加上!后,即转换为false.
5、A
知识点:对象获取属性的方式
获取属性的方式:
1、a.b
2、a[b].
key属性用中括号可以动态获取,获取属性两种方式.和[],[]里面可以写变量或者字符串