Thanks to visit codestin.com
Credit goes to github.com

Skip to content

[JavaScript] 看懂 ==运算符的世界 #19

@zgfang1993

Description

@zgfang1993

== 是对JavaScript值的一个比较运算符,首先我们看一下JavaScript值的类型

JavaScript的值类型

  • 原始类型(Primitive):Undefined、Null、Boolean、Number和String
  • 对象类型(Object)

Undefined类型:只有一个值,undefined
Null类型:只有一个值,null
Boolean类型:有两个值,true、false
Number类型: 值有很多
String类型: 值理论上有无数个
Object类型: 所有对象都有valueOf()和toString()方法,继承自Object,也可能被子类重写

可以分为有值世界和无值世界,如下图

image

无值世界

  • undefined
  • null
undefined == null //true

null: 一般表示没有赋值的Object typeof null //Object
undefined: 一般表示没有赋值的原始类型

有值世界

  • Object
  • String
  • Boolean
  • Number

首先,如规则2说的,所有有值世界里的比较,最后都要转换为数字比较。
Object → Number
image

  1. 计算obj.valueOf(),如果结果为原始类型,则返回此结果;
  2. 计算obj.toString(),如果结果是原始类型,则返回此结果;
  3. 抛出异常。
    备注:Date类型的对象,会先调用toString()方法,再调用valueOf()方法。

String → Number

image

规则:

  • 去掉空白字符 \r\n\t \v\f
  • 去掉引号

例子:

Number('123');                     // 123
Number('1.2e3');                  // 1200
Number('123abc');              // NaN
Number('\r\n\t123\v\f');     // 123

//例外
Number('');                    // 0
Number('\r\n\t \v\f');    // 0

Boolean → Number

  1. true → 1
  2. false → 0

例子

[''] == false;   //true

解释:
['']为Object对象,首先使用valueOf(),不是原始类型,继续调用toString(),为空字符串"",Number('')为0,
false也为0,即 0 == 0,所以最终为true。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions