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"