1、typeof null为什么是object
null就是一个bug 根据 type tag信息,他的低位是 000 ,所以null被判定为一个对象。这个就是typeof null为object的原因了
在ES6中曾提出有关修复这个bug的问题,但是提议被否定了,自从typeof null不是一个bug了 而是一个特征,并且永远不会被修复
2、0.1+0.2为什么不等于0.3?
0.1和0.2在二级制中是一个无限循环小数
在双精度浮点数中 需要遵循 0舍1入的原则 要保留53位然后再把他们相加起来就得到了0.30000000000000004
3、await在等待什么?
一般来说 都认为await在等待一个async函数的完成。不过语法来看 await是在等待一个表达式,整个表达式的结果取决于promise对象或其他值
await表达式的结果取决于他等得是什么?
1、如果等的不是promise对象 那么await表达式的东西就是他等到的东西
2、如果是promise对象 await就忙起来了 他会阻塞后面的代码,等着promise给他resolve 然后得到resolve 作为await的返回结果
function testAsy(x){
return new Promise(resolve=>{setTimeout(() => {
resolve(x);
}, 3000)
}
)
}
async function testAwt(){
let result = await testAsy('hello world');
console.log(result); // 3秒钟之后出现hello world
console.log('cuger') // 3秒钟之后出现cug
}
testAwt();
console.log('cug') //立即输出cug
4、var x = [typeof x, typeof y][1];typeof typeof x; 结果是string
var x = [typeof x,typeof y][1] //因为y没有定义也没有值 所以 x就返回为undefined
typeof x // 因为x为 'undefined' 所以typeof x就为 string
typeof string // 这个也就是等于 string了
5、|| 和 &&操作符的返回值
|| 如果第一个为真返回第一个 否则返回第二个
var x = 1;
y = x || 2
console.log(y) // 1
&& 当第一个表达式为真的时候才会执行第二个表达式
var a = 10
var b = a==10&&5
console.log(b) // 5
//等同于
if(a==10) {
b = 5
}
6、2 == [[[2]]]
这两个的结果是相等的 因为在进行两个值比较的时候 会尝试强制转换成数字,在进行比较
而数组强制转换成数字的过程,会先调用 toString 方法转成字符串,然后在转数字 最后 [2]就转换成 ‘2’ 然后递归调用 最终 [[[2]]] 转换成‘2’