js类型转换

记录一些常见的坑

js中的6个假值

false, null, undefined, 0, NaN, ''

https://www.jb51.net/article/122992.htm

隐式类型转换规则

ToPrimitive对原始类型不发生转换处理,只针对引用类型(object)的,其目的是将引用类型(object)转换为非对象类型,也就是原始类型。

ToPrimitive 运算符接受一个值,和一个可选的 期望类型作参数。ToPrimitive 运算符将值转换为非对象类型,如果对象有能力被转换为不止一种原语类型,可以使用可选的 期望类型 来暗示那个类型

/**
* @obj 需要转换的对象
* @type 期望转换为的原始数据类型,可选
*/
ToPrimitive(obj,type)

type不同值的说明

type为string:

先调用obj的toString方法,如果为原始值,则return,否则第2步调用obj的valueOf方法,如果为原始值,则return,否则第3步抛出TypeError 异常

type为number:

调用obj的valueOf方法,如果为原始值,则返回,否则下第2步调用obj的toString方法,如果为原始值,则return,否则第3步抛出TypeError 异常

type参数为空)

该对象为Date,则type被设置为String 否则,type被设置为Number
为空时,date类型的先调用toString(),其他引用类型先调用valueOf()

总结

  • 比较运算符中,两边都会转为number类型

  • +运算时,若包含引用类型,则转为字符串类型

  • +-开头的一元运算法,会转为number类型,undefined会转为NaN

验证

// ### 含有引用类型
1+{} // "1[object Object]"
{}+1 // 1,前面的{}被当作空代码块,若为表达式,则转为[object Object]
1+[] // "1"

// ### 比较
[] == false // '' == false -> 0 == 0
[] == ![] // '' == false -> 0 == 0
false == undefined // 0 == NaN

// 特例
null == undefined //true

### +, -
+{} // NaN
-'123' // -123
+true // 1

对象的valueOf和toString

var obj = {
    toString: function() {
        return "a"
    },
    valueOf: function() {
        return "b"
    }
}
//先调用valueOf,若返回原始类型,则返回
//若只重写toString方法,则直接调用toString
console.log(1 + obj) //"1b"

Date对象的特别说明

var d = new Date()

console.log(d == d.toString()) // toString() == Sat Nov 16 2019 23:24:45 GMT+0800
console.log(d == d.valueOf) // valueOf() == 1573917885718

console.log(d - 1) // 1573917989664

测试

[] == ![] //true
NaN !== NaN //true
null == undefined //true
 
1 == true //true
2 == true //false
"2" == true //false
 
null > 0 //false
null < 0  //false
null == 0  //true
null >= 0 //true
 

true + 1 //2
undefined + 1 //NaN 
 
let obj = {};
 
// 代码块
{} + 1 // 1
{ 1 + 1 } + 1 //1
 
// 表达式
obj + 1 //[object Object]1
{} + {} //chrome [object Object][object Object], fireFox NaN
 
[] + {} //[object Object]
[] + obj //[object Object]
+ [] //0
{} + [] //0
obj + [] [object Object]
 
[2,3] + [1,2] //"2312"
[2] + 1 //"21"
[2] + (-1) //"2-1"
 

[2] - 1 //1
[2,3] - 1 //NaN
{} - 1 //-1
1-{} //NaN

你可能感兴趣的:(js类型转换)