JS容易出现误区的运算符
Last updated
Last updated
==
==
在比较前将两个被比较的值转换为相同类型。在转换后(等式的一边或两边都可能被转换),最终的比较方式等同于全等操作符===
的比较方式。
记住下面这张表即可,特别注意的是Boolean
值和String
值被比较时,会ToNumber
转换, Object
会根据情况做隐式转换。
Object.is(A,B)
Object.is()
主要是和===
在NaN
、+0
、-0
上面有区别,其他场景一样。
Object.is()
判断NaN
是相等的,+0
和-0
是不相等的,刚好和 ===
相反
下面单独聊一聊隐式转换
ToPrimitive()
默认用法:
如果input
是基本数据类型,则不转化,如果是object
, 则按照下面方式转化
如果没有传入PreferredType
参数,则让hint的值为'default'
否则,如果PreferredType
值为String
,则让hint的值为'string'
否则,如果PreferredType
值为Number
,则让hint的值为'number'
如果input对象有@@toPrimitive
方法,则让exoticToPrim
的值为这个方法,否则让exoticToPrim
的值为undefined
如果exoticToPrim
的值不为undefined
,则
让result
的值为调用exoticToPrim
后得到的值
如果result
是原值,则返回
抛出TypeError
错误
否则,如果hint的值为'default'
,则把hint的值重新赋为'number'
返回OrdinaryToPrimitive(input,hint)
input的数据类型是对象,hint的数据类型是字符串,并且hint的值要么是"string",要么是"number"。该抽象操作的步骤如下:
如果hint的值为'string',则
调用input
对象的toString()
方法,如果值是原值则返回
否则,调用input
对象的valueOf()
方法,如果值是原值则返回
否则,抛出TypeError
错误
如果hint的值为'number'
,则
调用input
对象的valueOf()
方法,如果值是原值则返回
否则,调用input
对象的toString()
方法,如果值是原值则返回
否则,抛出TypeError
错误
稍微总结一下:在没有改写或自定义@@toPrimitive方法的条件下,
如果是Date
对象求原值,则PreferredType
是String
,其他均为Number
。
PreferredType
是String
,则先调用toString()
,结果不是原始值的话再调用valueOf()
,还不是原始值的话则抛出错误;
PreferredType
是Number
,则先调用valueOf()
再调用toString()
。
总结来讲就是:如果是对Date
对象做隐式转化,先调用toString
, 如果不是原始值的话,调用valueOf()
,还不是原始值的话则抛出错误; 对其他对象做隐式转化的话,则先调用valueOf()
再调用toString()
。
+
-
++
--
运算符在加法的过程中,首先把等号左右两边进行了求原值ToPrimitive()
操作,然后如果两个原值只要有一个是String类型,就把两个原值都进行转化字符串ToString()
操作,进行字符串拼接;否则把两个原值都进行转化数字ToNumber()
操作,进行数字相加。
下列表达式输出什么
运算过程注意一下几点:
多个数字和数字字符串混合运算时,跟操作数的位置有关
数字字符串之前存在数字中的正负号(+/-)时,会被转换成数字,同样,可以在数字前添加''
,将数字转为字符串
对于运算结果不能转换成数字的,将返回 NaN
&&
与 ||
需要注意的是返回结果
A && B
与运算,会做boolean转换,当A为false时返回A的结果,当A为true时返回B的结果,
A || B
或运算,当A为true时返回A的结果,当A为false时返回B的结果。
在JS中,采用的是双精度版本(64位),十进制的数都是使用二进制表示的,0.1在二进制中表示为
所以0.1表示的二进制与0.2表示的二进制相加,在转化为十进制就变成了0.30000000000000004
。
解决方案:parseFloat((0.1 + 0.2).toFixed(10))