==和===的使用说明

作者: XJBT | 来源:发表于2019-06-13 20:07 被阅读0次

===的使用

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. 对于引用数据类型,需要两个指向同一个地址

具体的判定规则如下:

  • 如果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操作的时候分两种情况:

  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]'

相关文章

  • 无标题文章

    # Markdown ****语法和**** MWeb ****写作使用说明 ## Markdown ****的设...

  • ==和===的使用说明

    ===的使用 JavaScript的数据类型:六种原始类型:number、string、boolean、undef...

  • Markdown语法

    一标题 使用说明:# + 空格 + 标题文字。 标题2 使用说明:## + 空格 + 标题文字。 二引用 使用说明...

  • 2019-06-04

    RedisTemplate常用集合使用说明(一) RedisTemplate常用集合使用说明-opsForValu...

  • Flutter-Column的使用说明

    Flutter-Column的使用说明 Column定义 Column和Container,Row,Stash基本...

  • 大脑使用说明书-思维导图

    家用电器都配有使用说明,但是作为当下已知的最复杂“系统”-我们的大脑,“出厂”时却没有配备使用说明。通过学前教育和...

  • Android基础知识整理

    Android基础 AIDL介绍以及使用说明 HandlerThread介绍及使用说明 IntentService...

  • test

    # Markdown 语法和 MWeb 写作使用说明## Markdown 的设计哲学> Markdown 的目標...

  • ios-[NSBundle mainBundle] infoDi

    使用说明

  • 科学100+

    使用说明

网友评论

    本文标题:==和===的使用说明

    本文链接:https://www.haomeiwen.com/subject/rryefctx.html