强行搞懂JS的刁钻问题

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’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值