第1题 — 原型
function Animal() {
this.type = "animal"
}
function Dog() {
this.name = "dog"
}
Dog.prototype = new Animal()
var PavlovPet = new Dog();
console.log(PavlovPet.__proto__ === Dog.prototype) // true
console.log(Dog.prototype.__proto__ === Animal.prototype) //true
题解:_proto_ 每个对象下都有这给属性 ,他指向我们构造函数的原型对象。
第2题 — 小心“排序”
var arr = [5, 22, 14, 9];
console.log(arr.sort());
抱歉,答案不是 [5, 9, 14, 22] 。如果不传入排序函数,sort 函数会将每个元素转换成字符串,然后根据它们的 UTF-16 值排序。
解决 console.log(arr.sort((a,b)=>a-b));
第3题 — 异步循环
for (let i = 0; i < 3; i++) {
const log = () => {
console.log(i) // 0 1 2
}
setTimeout(log, 100)
}
哈哈哈 是不是一下掉坑里了(我会这不就是同步任务和异步任务吗? 输出3 3 3)可是你注意到我是用let声明的变量吗?
let 声明变量是块级作用域。即在 for 循环或 if 中用 let 定义变量,在外面是访问不到的。
相当于:每一次的循环在每次迭代时都为 i 创建一个新变量。
第4题 — numbers里面有啥?
const length = 4
const numbers = []
for (var i = 0; i < length; i++); {
numbers.push(i + 1)
}
console.log(numbers) [5]
这太简单了吧,不就是输出[1,2,3,4]嘛 要看仔细啊,看到小括号和大括号之间有个 ;吗?
第5题 — 长度为0
const clothes = ['shirt', 'socks', 'jacket', 'pants', 'hat']
clothes.length = 0
console.log(clothes[3]) //undefined
没坑 就是undefined ,将数组的长度设成 0 等价于把数组中的所有值都删除了。
第6题 — 变量提升
var a = 1
function output() {
console.log(a) // undefined
var a = 2
console.log(a) // 2
}
console.log(a) // 1
output()
console.log(a) // 1
变量提升(只提升变量的声明,不提升变量的赋值) 函数提升
等价于下面代码
var a
function output(){
var a
console.log(a);
a = 2
console.log(a);
}
a = 1
console.log(a);
output()
console.log(a);
第7题 — 找到值了吗
function foo() {
let a = b = 0
a++
return a
}
foo()
console.log(typeof a) // undefined
console.log(typeof b) // number
// let a 是一个局部变量 在函数外未被声明 所以typeof a 检查的是未声明的变量。
// b 是个全局变量,它在 foo 函数中被赋值。
第8题 — 类型转换
console.log(+true) // 1
console.log(!"LOVEcoding") // false
//+ 运算符首先会尝试将 boolean 类型转换为数字类型,true 被转换为 1,false 被转换为 0。
// 字符串 'ConardLi' 是一个真值,所以 !'LOVEcoding' 为 false。