博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS 加法知多少?
阅读量:6716 次
发布时间:2019-06-25

本文共 1738 字,大约阅读时间需要 5 分钟。

今天收到一个问题

var a = +[]

别用控制台,能说出来是多少?

一下没反应过来,不知道你说对了没

反正我说错了,哈哈哈~

好了,先公布结果

console.log(+[]) // 0 console.log(0 + []) // '0'console.log(0 - []) // 0console.log([] + []) // ''console.log({} + []) // '[object Object]'

下面好好分析分析到底是啥原理。

加法运算

1、加号运算符只能用于原始数据类型,对于对象类型的值,需要进行数据转换

2、在转换后,如果其中一个运算元出现原始数据类型是“字符串”类型值时,则另一运算元强制转换为字符串,然后做字符串的连接运算

3、在其他情况时,所有运算元都会转换为原始数据类型的“数字”类型值,然后作数字的相加

Number() 转换规则

  1. 如果是 Boolean 值,truefalse 将分别转换为 1 和 0。
  2. 如果是数字值,只是简单的传入和返回。
  3. 如果是 null 值,返回 0。
  4. 如果是 undefined ,返回 NaN
  5. 如果是字符串,遵循下列规则:

    (1) 如果字符串截去开头和结尾的空白字符后,不是纯数字字符串,那么最终返回结果为 `NaN`。    (2) 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);    (3) 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);    (4) 如果字符串中包含有效的十六进制格式,例如 `0xf`,则将其他转换为相同大小的十进制整数值;    (5) 如果字符串是空的(不包含任何字符),则将其转换为 0;    (6) 如果字符串中包含除上述格式之外的字符,则将其他转换成 `NaN`。
  6. 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()
    方法,然后再次依照前面的规则转换返回的字符串值。

示例

console.log(Number(undefined)) // NaNconsole.log(Number(null)) // 0console.log(Number(NaN)) // NaNconsole.log(Number('')) // 0console.log(Number({})) // NaNconsole.log(Number({a:1})) // NaNconsole.log(Number([])) // 0console.log(Number([1])) // 1console.log(Number([1,2])) // NaNconsole.log(String(undefined)) // 'undefined'console.log(String(null)) // 'null'console.log(String(NaN)) // 'NaN'console.log(String({})) // '[object Object]'console.log(String({a:1})) // '[object Object]'console.log(String([])) // ''console.log(String([1])) // '1'console.log(String([1,2])) // '1,2'

分析

  1. +[][] 是对象,依据第六条规则,转换的结果是 NaN,然后调用对象的 toString() 方法,得到 '' 空字符串,Number('') => 0,所以 +[] => 0,结果为数字 0
  2. 0 + [],得到 0 + '' => '0' ,结果为字符串 0
  3. {} + [],得到 '[object Object]' + '' => '[object Object]',结果为字符串 [object Object]

其他以此类推可得。

懂了没~

转载地址:http://vxelo.baihongyu.com/

你可能感兴趣的文章
甲骨文拒绝SAP 2.72亿美元赔偿要求重审
查看>>
我的友情链接
查看>>
linux非交互式生成秘钥
查看>>
SQL Server数据库镜像搭建(无见证无域控)
查看>>
C练习小代码-20151108
查看>>
Mac os X 10.11 sudo 指令出问题了么?
查看>>
互联网协议入门(2)
查看>>
DataSource的可配参数有哪些,有哪些DataSource可以用
查看>>
本地文件共享服务(nfs samba ftp)
查看>>
scp通过代理proxy传输文件
查看>>
数据段、代码段、堆栈段、BSS段的区别
查看>>
WebService之Axis2快速入门(5): 管理会话(Session)
查看>>
以太坊RPC接口使用
查看>>
普通html标签<form>和struts2<s:form>的区别
查看>>
安装NTFS For Mac时显示文件已损坏怎么办
查看>>
-webkit-line-clamp实现多行文字溢出隐藏显示省略号
查看>>
配置sunspot tomcat结合sunspot_rails
查看>>
飞信系统4月29日升级后飞信机器人无法使用的解决办法
查看>>
Canonical今天宣布推出Plex Media Server作为Snap Store中的Snap应用程序
查看>>
Font Awesome
查看>>