美文网首页我爱编程
js 隐式类型转换

js 隐式类型转换

作者: Xinxing_Li | 来源:发表于2018-06-08 19:45 被阅读0次

关系操作符(<, >, <=, >=)

与上述操作符一样,关系操作符的操作值也可以是任意类型的,所以使用非数值类型参与比较时也需要系统进行隐式类型转换:
(1)如果两个操作值都是数值,则进行数值比较
(2)如果两个操作值都是字符串,则比较字符串对应的字符编码值
(3)如果只有一个操作值是数值,则将另一个操作值转换为数值,进行数值比较
(4)如果一个操作数是对象,则调用valueOf()方法(如果对象没有valueOf()方法则调用toString()方法),得到的结果按照前面的规则执行比较
(5)如果一个操作值是布尔值,则将其转换为数值,再进行比较
注:NaN是非常特殊的值,它不和任何类型的值相等,包括它自己,同时它与任何类型的值比较大小时都返回false。

相等操作符(==)

相等操作符会对操作值进行隐式转换后进行比较:
(1)如果一个操作值为布尔值,则在比较之前先将其转换为数值
(2)如果一个操作值为字符串,另一个操作值为数值,则通过Number()函数将字符串转换为数值
(3)如果一个操作值是对象,另一个不是,则调用对象的valueOf()方法,得到的结果按照前面的规则进行比较
(4)null与undefined是相等的
(5)如果一个操作值为NaN,则相等比较返回false
(6)如果两个操作值都是对象,则比较它们是不是指向同一个对象

测试用例

function Person(){}
Person.prototype = {
         toString() { return "ooo";},
         valueOf() { return 123;}
}
var p = new Person() ;
// ️ result in chrome

可以看出,与前文所述隐式类型转换相符

BUG(或者说暂时未能完美解释的地方)
2019/8/02更新:不是bug,解释见文末

var date = new Date("1970/1/2 8:00:00");
date.valueOf() ; //console of Chrome : 86400000
date.toString(); //console of Chrome : "Fri Jan 02 1970 08:00:00 GMT+0800 (CST)" 

// '<=' '<' '==' don't have self-consistent
date <= 86400000 //console of Chrome : true
date <  86400000 //console of Chrome : false
date == 86400000 //console of Chrome : false 
// Oh! It's awesome!

//This make sense
date == date.toString() //console of Chrome : true
date <= date.toString() //console of Chrome : false
// Oh! It really make sense because 864000 <= "string" is equal to 864000 <= 0

所以总结一下
date 在遇到'<' '<='的时候会默认转换至.valueOf() ,
而它遇到 '==' 的时候明明有.valueOf()却还是选择转换为 .toString()

解决该疑惑可以看https://juejin.im/post/5a7172d9f265da3e3245cbca#heading-6

相关文章

  • js中的类型转换

    在js中数据转换分为3种:隐式类型转换,强制类型转换,函数转换 1.隐式类型转换 (1):运算符转换 js中的值在...

  • 类型转换

    js的类型转换分成显示和隐式,显式转换常用类型转换函数进行转换,隐式最多用在条件判断,通常是把字符转为布尔型。类型...

  • JS里的数据类型转换

    在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换。 1, 显式数据类型转换 a:转数字: 1)Numb...

  • JavaScript类型转换

    在js中数据类型转换一般分为两种,即强制类型转换和隐式类型转换(利用js弱变量类型转换)。 强制类型转换 即通过使...

  • 隐式转换的规则

    问题:隐式转换的规则是什么 说起JS的隐式转换规则,我们可以说下JS的基础数据类型 JS的七中类型 我们所熟知的J...

  • JS隐式数据类型转换

    隐式数据类型转换介绍 前面有总结过 JS数据类型转换 Number(), toString(), parseInt...

  • 数据类型转换

    写在前面 C/C++编程中常见数据类型转换,包括隐式类型转换和显式类型转换。 1. 隐式类型转换 隐式类型转换在以...

  • JavaScript的显式转换和隐式转换

    js的显式转换和隐式转换都是数据类型的转换;js的数据类型是弱类型的,即可以给变量赋值为任意的数据类型,当进行运算...

  • JS的基本小结

    JS基本输出方式 JS数据类型 变量 常量 变量常量小练习 声明提前 隐式转换 显示转换/强制转换

  • 隐式转换 显示转换

    ####一.隐式转换 **1) 查看数据类型** *typeof* ```js 案例: v...

网友评论

    本文标题:js 隐式类型转换

    本文链接:https://www.haomeiwen.com/subject/cazasftx.html