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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 写在前面的话 近期刷了点js的面试题,发现很多基础知识已经模糊,于是重新回去看了一下《javascript权威指南...
    栗子酥小小阅读 4,185评论 0 0
  • 原文 有意思的 JavaScript 原始值到原始值的转换 原始值转化为布尔值所有的假值(undefined、nu...
    蛮吉大人123阅读 2,224评论 0 0
  • javaScript类型转换 标签(空格分隔): 未分类 隐式转换 当遇到以下几种情况,JavaScript会自动...
    时修七年阅读 3,188评论 0 0
  • 本文是lhyt本人原创,希望用通俗易懂的方法来理解一些细节和难点。转载时请注明出处。文章最早出现于本人github...
    lhyt阅读 2,682评论 0 1
  • 司命和叠风走后,凤九和少绾各执一封请柬,回了狐狸洞中,坐到了石桌边,气氛有些微妙,有些不自然,熟知内情的人,都会认...
    转角花开阅读 7,972评论 2 32

友情链接更多精彩内容