让前端飞Web前端之路JavaScript 进阶营

==和===的使用说明

2019-06-13  本文已影响0人  XJBT

===的使用

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
```
  1. 对于基本数据类型中的number、string、boolean、undefined、null、symbol中需要两个值完全相同
    注意:虽然typeof null === 'object',但是我们认为null也是一种原始数据类型

  2. 对于引用数据类型,需要两个指向同一个地址

具体的判定规则如下:

==的使用

判定规则

总结一条,当==两边出现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操作的时候分两种情况:

  1. Date类型,默认先取toString方法,如果返回的不是原始类型的值就再取valueOf方法,如果返回的还不是原始类型就报错
  2. 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]'

上一篇 下一篇

猜你喜欢

热点阅读