toString() 与 valueOf() 在 if 判断中的区别

66 阅读2分钟

if条件判断

原始类型之间相比较

null: “空值”,指代一个空对象指针,使用typeof运算得到 "object",可认为它是一个特殊的对象值。
undefined: 声明了一个变量但并未为该变量赋值,此变量的值默认为undefined。

Javascript规定null与undefined宽松相等(==),并且都与自身相等,但是与其他所有值都不宽松相等

let a = 123, b = [4, 5, 6], c = { x: 1, y: { z: 2 } }, d = function () { console.log("d") }
const a1 = a.toString()
const b1 = b.toString()
const c1 = c.toString()
const d1 = d.toString()

const a2 = a.valueOf()
const b2 = b.valueOf()
const c2 = c.valueOf()
const d2 = d.valueOf()
console.log(a, b, c, d) // 123  [4, 5, 6],{ x: 1, y: { z: 2 } }  [Function: d]
console.log(a1, b1, c1, d1) // 123 4,5,6 [object Object]  function () { console.log("d") } 
console.log(a2, b2, c2, d2) // 123  [4, 5, 6],{ x: 1, y: { z: 2 } }  [Function: d]

console.log(new Date(2015, 4, 4).toString()); // Mon May 04 2015 00:00:00 GMT+0800
console.log(new Date(2015, 4, 4).valueOf()); //  1430668800000

String(null)  // "null"
String(undefined) // "undefined"
String(true)  // "true"
String(false)  // "false"
String(11)  // "11"
String(11e20)  // "1.1e+21"
String([])  // ""
String([1, null, 2, undefined, 3])  // 1,,2,,3
String(function a() { })  // "function a(){}"
String({})  // "[object,object]"
String({ name: 'zhang' })  // "[object,object]"

Boolean(null)  // false
Boolean(undefined)  // false
Boolean(0)  // false
Boolean(false)  // false
Boolean("false")  // true
Boolean(NaN)  // false
Boolean("")  // false
Boolean([])  // true
Boolean({})  // true

Number(null)  // 0
Number(undefined)  //NaN
Number(true)  //1
Number(false)  //0
Number("11")  //11
Number("1.1e+21") //1.1e+21
Number("abc")  //NaN
Number([])   // 0
Number([0])  // 0
Number([1])  // 1
Number(["abc"])  // NaN
Number({})  // NaN

对象与原始类型相比较

对象与原始类型相比较时,会把对象按照对象转换规则转换成原始类型,再比较:

  • 当对象转为其他原始类型时,会先调用对象的valueOf()方法,如果valueOf()方法返回的是原始类型,则直接返回这个原始类型

  • 如果valueOf()方法返回的是不是原始类型或者valueOf()方法不存在,则继续调用对象的toString()方法,如果toString()方法返回的是原始类型,则直接返回这个原始类型,如果不是原始类型,则直接报错抛出异常。


{} == 0 // false
{} == '[object object]' // true 
{}.valueOf()  //{}
{}.toString() // '[object object]'


[] == false // true 
[1,2,3] == '1,2,3' // true

[].valueOf() // []
[].toString() //""
[1,2,3].toString() // "1,2,3"