对象
- 下面代码输出了什么?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b]);
答案为456,因为键名只能为字符串,传入对象只会被转为字符串[object Object],a[b],a[c]都等价于a[“[object Object]”]。
数组
- 控制台输出了啥?
var arr = [];
arr['a'] = a;
console.log(arr.length);
arr['2'] = 2;
console.log(arr.length);
arr.length = 0;
console.log(arr);
答:0, 3, [];
‘a’, ‘2’作为arr的索引值都会被自动转化成整数类型。’a’转为NaN,存不进去,数组长度不变。’2’转为arr,数组长度就变为3,即便前两个值没有被赋值。
字符串
- 考察字符串对象的类型
function judge(val) {
switch(val) {
case "A":
console.log(1);
break;
case "string":
console.log(2);
break;
case "undefined":
console.log(3);
break;
case undefined:
console.log(4);
break;
default:
console.log(5);
break;
}
}
judge(new String("A"));
答:5;
new的方式创建出一个object,虽说new String(“A”) == ’A’,但switch语句判定用的是全相等
异步编程、作用域链
- 下述代码输出什么 ?
- 为什么 ?
<button>No.1</button>
<button>No.2</button>
<button>No.3</button>
<script>
const btns = document.getElementsByTagName('button')
for(var i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
console.log(i)
}
}
</script>
- 输出全是 3
- 原因:事件绑定是 异步编程,当触发点击行为绑定方法执行的时候外层循环已经结束;方法执行产生私有作用域,用到变量 i 不是私有的变量,按照 作用域链 的查找机制找到的是全局作用域下的 i ( 此时全局的 i 已经成为最后一次循环的结果 3 )
- 解决方案:
- 自定义属性
- 闭包
- ES6 块级作用域 let 声明变量
- ES5 中只有函数有私有作用域;ES6 中 let 创建变量会形成块级作用域,当前案例中每一轮循环都会有一个自己的块级作用域
EventLoop
setImmediate(_ => {
console.log(0)
})
setTimeout(_ => {
console.log(1)
})
console.log(2)
new Promise(resolve => {
console.log(3)
resolve()
}).then(_ => {
console.log(4)
})
setImmediate(_ => {
console.log(5)
})
process.nextTick(_ => {
console.log(6)
})
console.log('end')
- 知识点:node 事件循环机制中的 nextTick 和 setImmediate 执行时机
网友评论