‘skill-check’ JS 测验
Source: Dev.to
问题 1:类型强制转换
下面的代码在控制台会输出什么?
console.log(0 == '0');
console.log(0 === '0');
答案: true,随后 false
解释: 搜索 “JavaScript Type Coercion” 以了解为什么 == 会进行类型转换,而 === 不会。
问题 2:箭头函数的 this
在下面的代码片段中,会打印出什么?
const user = {
name: 'Alex',
greet: () => {
console.log(`Hi, I'm ${this.name}`);
}
};
user.greet();
答案: Hi, I'm undefined(在某些环境下可能是空字符串)
解释: 箭头函数会从其外层词法作用域继承 this(全局对象或模块),而不是从定义它的对象继承。若想访问 user.name,应使用普通函数表达式。
问题 3:var 与 let 在异步循环中的表现
这段代码的执行结果是什么?
for (var i = 0; i console.log(i), 1);
}
答案: 3, 3, 3
解释: var 是函数作用域的,所以循环在 setTimeout 回调执行之前已经结束,i 的值为 3。如果将 var 换成 let,则会分别输出 0, 1, 2,因为 let 为每次迭代创建了新的绑定。
问题 4:数组引用行为
list2 会怎样?
let list1 = [1, 2, 3];
let list2 = list1;
list1.push(4);
console.log(list2.length);
答案: 4
解释: 数组是按引用传递的对象。list2 并不是副本,而是指向与 list1 相同的底层数组。
问题 5:typeof null
typeof null 的结果是什么?
答案: "object"
解释: 这是 JavaScript 最初版本留下的一个长期存在的怪癖,为了向后兼容仍然保留至今。