美文网首页
JS 面试实战

JS 面试实战

作者: 行走的蛋白质 | 来源:发表于2020-04-21 16:14 被阅读0次

对象

  • 下面代码输出了什么?
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 执行时机

相关文章

网友评论

      本文标题:JS 面试实战

      本文链接:https://www.haomeiwen.com/subject/xpxpihtx.html