关于‘==’

作者:某猫    发布于:

相同的数据类型

在抽象相等的比较中,如果左右两边比较的是同种数据类型的话,那和完全相等的比较规则是相同的:基础类型比较值是否相等,引用类型比较是否引用到同一个对象;

[] == [] // false
// 比较的是两个不同的空数组 和[] === []没有什么不同 都是false
+0 == -0 // true 0 和 -0 在完全相等中也是返回true

特别要注意的:等号运算符(== 和 ===) 不能被用来判断一个值是否是 NaN。必须使用 Number.isNaN() 或 isNaN() 函数。在执行自比较之中:NaN,也只有NaN,比较之中不等于它自己。

空:null和undefined

null == undefined // true

其他任何值与null和undefined比较,都为false

不同基础类型之间的比较(number, string, boolean)

number == string

把string转换为number 等同于:number == ToNumber(string)

number == boolean

把boolean转换为number 等同于:number == ToNumber(boolean)

string == boolean

同时转换为number 等同于:ToNumber(string) == ToNumber(boolean)

总结来说,就是把比较的值全部转为number之后再比较

引用类型与基础类型之间的比较

首先会通过内置的toString以及valueOf两种用来转换数据类型的方法,将对象转换为基础数据类型,如果此时两边数据类型相同,可以直接判断,反之用’不同基础类型之间的比较’中的方法继续比较;

扩展:如何转化为基础类型?
在抽象相等的比较规则下,被转化的对象会优先调用valueOf方法(此方法如果不存在则忽略),如果没有得到基础数据类型,继续调用toString(此方法如果不存在则忽略),如果仍然没有得到基础数据类型,则报错
需要注意的是:如果是Date类型的话,会优先调用toString

有趣的是,以前在看博客时会有人说使用==会导致数据类型转换,从而影响被比较对象本身的值;然而实际上,只要不擅自修改原型上的toString以及valueOf,就不会对比较对象产生任何影响

但是我们依旧推荐用完全等于

format_list_numbered

(无)

  1. 1. 相同的数据类型
  2. 2. 空:null和undefined
  3. 3. 不同基础类型之间的比较(number, string, boolean)
    1. 3.1. number == string
    2. 3.2. number == boolean
    3. 3.3. string == boolean
  4. 4. 引用类型与基础类型之间的比较
  5. 5. 但是我们依旧推荐用完全等于
vertical_align_top

Copyright © 2017 某猫のBlog

Powered by Hexo & Theme - Vateral