===的使用
JavaScript的数据类型:
六种原始类型:number、string、boolean、undefined、null、symbol;(typeof NaN === 'number')
一种引用类型:object
但是引用类型除了object以外还有function,array,date,regexp,引用类型是一种指向地址的数据类型
```
function f() {}
typeof f === 'function'
let a = []
typeof a === 'object'
let d = new Date()
typeof d === 'object'
typeof null === 'object'
null === null
NaN != NaN
```
-
对于基本数据类型中的number、string、boolean、undefined、null、symbol中需要两个值完全相同
注意:虽然typeof null === 'object',但是我们认为null也是一种原始数据类型 -
对于引用数据类型,需要两个指向同一个地址
具体的判定规则如下:
- 如果Type(x)和Type(y)不同,返回false
- 如果Type(x)和Type(y)相同
- 如果Type(x)是Undefined,返回true
- 如果Type(x)是Null,返回true
- 如果Type(x)是String,当且仅当x,y字符序列完全相同(长度相同,每个位置上的字符也相同)时返回true,否则返回false
- 如果Type(x)是Boolean,如果x,y都是true或x,y都是false返回true,否则返回false
- 如果Type(x)是Symbol,如果x,y是相同的Symbol值,返回true,否则返回false
- 如果Type(x)是Number类型
- 如果x是NaN,返回false
- 如果y是NaN,返回false
- 如果x的数字值和y相等,返回true
- 如果x是+0,y是-0,返回true
- 如果x是-0,y是+0,返回true
其他返回false
==的使用
判定规则
- 如果Type(x)和Type(y)相同,返回x===y的结果
- 如果Type(x)和Type(y)不同
- 如果x是null,y是undefined,返回true
- 如果x是undefined,y是null,返回true
- 如果Type(x)是Number,Type(y)是String,返回 x==ToNumber(y) 的结果
- 如果Type(x)是String,Type(y)是Number,返回 ToNumber(x)==y 的结果
- 如果Type(x)是Boolean,返回 ToNumber(x)==y 的结果
- 如果Type(y)是Boolean,返回 x==ToNumber(y) 的结果
- 如果Type(x)是String或Number或Symbol中的一种并且Type(y)是Object(包含function),返回 x==ToPrimitive(y) 的结果
- 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回 ToPrimitive(x)==y 的结果
- 其他返回false
总结一条,当==两边出现Boolean时(只有一个Boolean),先将Boolean转化为number类型,再继续进行后面的转化
所以我们可以看看下面这些结果:
true == null // false
false == null // false
!null == true // true 取反操作之前先要将被取反的对象转化为Boolean,所以左边相当于 !null => !Boolean(null) => !false => true
[] == true // false, 先是右边true => Number(true) => 1,然后左边 [] => toPrimitive([]) => '' => Number('') => 0
![] == [] // true, 先是左边![] => !Boolean([]) => !true => false => Number(false) => 0, 然后右边 [] => toPrimitive([]) => '' => NUmber('') => 0
true == 2 // false 左边true => Number(true) => 1
对于复杂类型进行toPrimitive操作的时候分两种情况:
- Date类型,默认先取toString方法,如果返回的不是原始类型的值就再取valueOf方法,如果返回的还不是原始类型就报错
- function、object、array等类型是先valueOf再toString
var x = 1; var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}} console.log(obj == 0) // Error: Cannot convert object to primitive value // 两个方法执行之后都没返回原始类型的数据
引申:
==操作甚至会引发副作用,在你重写了toString或是valueOf方法的时候
```
var x = 1;
var obj = {valueOf: function(){ x = 2; return 0 }}
console.log(obj == 0, x) // true, 2
```
Object.prototype.toString.call([]) === '[object Array]'
网友评论