等于==、不等于!=

首先会判断两者类型,相同直接比较是否全等,类型不相同的话,就会进行类型转换,按以下规则:

  • 布尔->数值
  • 字符+数值->数值
  • 对象->valueof
  • null==undefined
  • 遇到NaN直接不等

全等===不全等!==

类型不相同时不会转换类型,直接返回false

  • null===undefined //true

Object.is()

除了特殊情况一般和===相同

  • Object.is(NaN,NaN) //true
  • Object.is(0,-0) //false

转为数值

  • null->0
  • undefined->NaN
  • true->1 false->0
  • 数字字符串->数字
  • 字符串包含非数字->NaN
  • ""->0
  • Symbol->报错
  • 对象->valueOf()??toString() []->0 [1]->1 [1,1]->NaN {}->NaN

转为布尔

记住以下false假值:

  • undefined
  • null
  • +0、-0
  • NaN

转为字符串

  • null->"null"
  • undefined->"undefined"
  • true->"true"、false->"false"
  • 数值->"数值"
  • 对象->toString()方法,该方法会被重写,未重写Object.prototype.toString->"[object 具体类型]"
  • Symbol->只能强制转换,隐式转换报错

加法

数值+数值:

  • NaN+*=NaN
  • Infinity+-Infinity=NaN
  • -Infinity+-Infinity=-Infinity
  • -0+-0=-0
  • 0+-0=0
    只要有一个操作数是字符串,则转换为字符串进行拼接
  • []+{}="[object Object]" {}+[]=0

减法

  • NaN-*=NaN
  • Infinity-Infinity=NaN
  • -Infinity--Infinity=NaN
  • 操作数是字符串、布尔、null、undefined->数值
  • 对象->valueOf()??toString()

>和<

  • 字符串比较->逐个比较字母编码
  • 有一个是数值->将另一个转为数值
  • 对象-》valueof().toString()
  • 布尔->数值
  • NaN->返回false

valueOf()、toString()

  • [1,'a'].valueOf() -> [1,'a']
  • [1,'a'].toString() -> '1,a'
  • {}.valueOf() -> {}
  • {}.toString() -> '[Object Object]'

arguments

在严格模式或使用...args的的情况下arguments不再追踪参数的变化。

最后修改:2021 年 09 月 11 日
你的赞赏是我前进的动力