S001-输出什么
1.
let a = {},
b = '0',
c = 0;
a[b] = '唐诗';
a[c] = '宋词';
console.log(a[b]);
答案
宋词
解析
js 中对象的 key 只能是 string、symbol a[b] 与 a[c] 都可看做是 a['0'], 最后一次赋值是 宋词 所以结果也就是 宋词
2.
let a = {},
b = {
n: '1'
},
c = {
m: '2'
};
a[b] = '唐诗';
a[c] = '宋词';
console.log(a[b]);
答案
宋词
解析
会调用对象的 toString 方法, 所以 b、c 都等于 [object Object]
3.
var test = (function (i) {
return function () {
alert(i *= 2);
}
})(2);
test(5);
答案
'4'
解析
如果你的回答是 4 也没啥毛病,但是准确些应该是 '4',因为 alert 只能输出字符串类型的值 test 是一个立即执行函数, 传入了 2 所以等于 4 调用 test(5) 时,实际上是在调用 test 变量所引用的匿名函数。这个匿名函数在定义时,已经通过闭包的方式访问了立即执行函数中的变量 i。在匿名函数中直接使用 i 这个变量而不需要通过参数来传递。所以test(5) 传递的参数无效
Symbol
let a = {},
b = Symbol('0'),
c = Symbol('0');
a[b] = '唐诗';
a[c] = '宋词';
console.log(a[b]);
答案
唐诗
解析
Symbol 作为 key 的时候,是不可以重复的,所以 a[c] 不会覆盖 a[b], Symbol 创建的数据是唯一的与里面的值无关