面试题一:
var arr = [1, 2, 3, 4]
问:arr[1] = ?; arr['1'] = ?
答:arr[1] = 2; arr['1'] = 2
这里可以再分为两个问题:
1、数组赋值
var arr = [1, 2, 3, 4]
arr[1] = 10; // 数字场景
arr['10'] = 1; // 字符串场景
arr['a'] = 1; // 字符串场景
arr[true] = 2; // 布尔值
arr[undefined] = 3; // undefined
arr[null] = 4; // null
arr[Symbol] = 5; // Symbol
arr[new Object()] = 6; // 对象
arr[function(){}] = 7 // 函数
打印结果:
结果说明,修改数组的值的过程中,下标index
如果是数字,那么,就是正常的数组赋值。
如果是非数字,那么会将其转换为字符串,其实数组也是对象,那么,非数字就相当于给对象arr
的key
键定义的value
值。
2、数组取值
通过上述方式先为数组赋值,然后再通过以下方式取值:
console.log(arr[1]); // 10
console.log(arr['10']); // 1
console.log(arr[true]); // 2
console.log(arr[undefined]); //3
console.log(arr[null]); // 4
console.log(arr[Symbol]); // 5
console.log(arr[new Object()]); // 6
console.log(arr[function(){}]); // 7
由打印的结果可以看出,数组在取值时索引是数字,按照数组取值方式获取。
如果索引位置是非数字,会将其转换成字符串,通过对象的方式取值。
所以题目中的arr['1']
会转换成arr[1]
,最终获取到的值为2
。
面试题二:
var obj = {0: 1,1: 2,2: 3
}
问:obj[1] = ?; obj['1'] = ?
答:obj[1] = 2; obj['1'] = 2
这里也可以再分为两个问题:
1、对象赋值
var obj = {0: 1,1: 2,2: 3
}
obj[1] = 10; // 数字场景
obj['10'] = 1; // 字符串场景
obj['a'] = 1; // 字符串场景
obj[true] = 2; // 布尔值
obj[undefined] = 3; // undefined
obj[null] = 4; // null
obj[Symbol] = 5; // Symbol
obj[new Object()] = 6; // 对象
obj[function () {}] = 7 // 函数
打印结果:
2、对象取值
通过上述方式先为对象赋值,然后再通过以下方式取值:
console.log(arr[1]); // 10
console.log(arr['10']); // 1
console.log(arr[true]); // 2
console.log(arr[undefined]); //3
console.log(arr[null]); // 4
console.log(arr[Symbol]); // 5
console.log(arr[new Object()]); // 6
console.log(arr[function(){}]); // 7
由打印的结果可以看出,对象在取值时,如果当前key值不是字符串,会将其转换成字符串,再取值。
所以题目中的arr[1]
会转换成arr['1']
,最终获取到的值为2
。
总结
对象的下标如果不是字符串,会将其先转换成字符串,再去求值。数组的下标如果不是数字,先将其尝试转成数字去取值;如果转不成数字,则会利用
数组也是对象
的特点,将其转换成字符串,再去取值。
最后
最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。
有需要的小伙伴,可以点击下方卡片领取,无偿分享