javascript烧脑题,[null]==0,[undefined]==0真假

查看:124
本文介绍了javascript烧脑题,[null]==0,[undefined]==0真假的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

以下返回又是什么鬼?希望有大神解释清楚。

[1,null,3].map(x=>x+1)

[1,undefined,3].map(x=>x+1)

以及

[1,,3].map(x=>x+1)

各返回什么?

解决方案

标题讨论的是相等运算符==么?
相等运算符的语法行为多变,其中的算法和+有些不同,无法为后面的返回结果提供参考,在这里便不赘述。
相等运算符的规则复杂,推荐参考资料
http://es6.ruanyifeng.com/#docs/spec
中第二部分--相等运算符,当中详细讲解了==的算法。

下面解释一下输出结果

[1,null,3].map(x=>x+1); \\[2, 1, 4]
[1,undefined,3].map(x=>x+1);\\[2,NaN, 4]
[1,,3].map(x=>x+1);\\[2,,4] 中间的空位是map函数直接跳过此项执行的结果

map(x=>x+1)返回一个将原数组所有元素+1的数组,这里最重要的行为是x+1,要讨论的是+号。+优先考虑字符串连接,当操作数都不是类字符串类型时,进行加法运算。这个过程中涉及类型转换(原始值转换)。

具体过程如下:

a + b
//判断是否需要转化为原始值
if(typeof a== 'object' || typeof b=='object'){//进行原始值转换
   if(a instanceof Date){
     a = a.toString();  
   }else{
     a = a.valueOf?a.valueOf():a.toString?a.toString():a;
   }
   if(b instanceof Date){
     b = b.toString();  
   }else{
   b = b.valueOf?b.valueOf():b.toString?b.toString():b;
   }
}
if(typeof a == 'string' || typeof b == 'string'){
  return String(a)+String(b);//字符串连接
}else{
  return Number(a)+Number(b);//加法运算
}

在题主提供的代码中,执行的是加法运算Number(a)+Number(b);//加法运算
这就涉及到类型转化

这篇关于javascript烧脑题,[null]==0,[undefined]==0真假的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆