隐式类型转换(==的情况)
来源:互联网 发布:淘宝旧版本5.4.9下载 编辑:程序博客网 时间:2024/06/16 06:10
(前言:这也是前端面试的高频考点,虽然平时大家肯定都接触过或经常使用,但这个问题真的较起真来细细的问,相信很多人都会懵,在《你不知道的js:中卷》里有对这块知识较为详细的详细介绍,推荐大家去看看)
正文 :
==在比较两个不同类型的值时会发生隐式类型转换,会将其中之一或两者都转换为相同类型后再进行比较。
===是严格比较两个值相等(两个特例,NaN不等于NaN,+0等于-0),不会发生隐式类型转换。
那具体转换的规则是什么呢?
一、字符串和数字做相等比较,会把字符串转为数字
var a = 10;var b = "10";a==b //truea===b //false
二、有布尔值的,把布尔值转为数字
var a = true;var b = "1";a==b //true
这里的过程就是先把a转为数字,就是1,等式就变为 1==”1” ,再遵照第一条,所以最终结果为true。
三、在==中,null和undefined相等
var a = null;var b;a==b //true
四、对象(对象/函数/数组)和标量基本类型(字符串/数字/布尔值)之间的相等比较,调用对象的ToPrimitive
具体流程是这样的,先检查对象是否有valueOf方法,如果有并且返回基本类型值,就使用该值进行类型转换(像Number(1),String(‘a’),Boolean(true)这种对象可以,前面加上new也行,会返回传进去的数字,字符串或布尔值)。如果没有就使用toString()方法的返回值进行类型转换。
注意:
1.用Object.create(null)创建的对象没有valueOf和toString方法。
2.我们平时写的对象(像var obj = {…})toString后为”[object Object]”
3.数组的valueOf会返回数组本身,所以会调用数组原型链上的toString方法(与对象原型链上的不同,Object.prototype.toString.call(arr)结果为[object Array],常用这个方法区分对象与数组)。
[null]和[undefined]的toString结果为“ ”。
var a = 'abc';var b = Object(a) //和new String(a)一样a==b //true,调用了valueOf方法var c = 2;var d = [2];c==d //true,[2]先转为“2”,再转为数字2
有几个稍特殊的例子:
null和undefined是没有对应的对象的,所以:
var a = null; //undefined也同理var b = Object(a);a==b //false
把NaN封装成函数:
var a = NaN;var b = Object(a); //和new Number(a)a==b //false,它遵守了规则,因为NaN==NaN本来就是false
[]==![] //true
这是因为 ![]转为布尔值为false,false变为数字后是0,[]toString后为“ ” , “ ”==0 –>true。
例子就举到这吧,这种东西如果真举例子,相信永远也举不完,而且也不可能挨个去背,大家主要了解它内部转换规则。
github 的@dorey做过一张表格,里面基本列举了通常的转换结果,但可能由于时间过久,我找到那个项目时貌似已经废弃了,所以只能给大家放张av画质的照片了,以后有好的我再改。
这块的知识点繁多又零碎,肯定有不少拉下的地方,欢迎大家帮我指出,帮我完善~~
- 隐式类型转换(==的情况)
- 发生隐式类型转换的典型情况
- 强制类型转换和隐式类型转换|自定义类型转换语句__int64 d = *(__int64 *)&st的说明
- js哪些情况会出现隐式类型转换
- 四种会自动执行类型转换的情况
- 数组不能强制类型转换的情况
- +=隐式类型转换
- Java的强制类型转换与隐式类型转换
- 关于VS2005中各种类型互相转换的情况
- JS的类型转换,强制转换和隐式转换
- JS的类型转换,强制转换和隐式转换
- 【MFC】将CString类型的十六进制数字,转换成整形(在使用Unicode字符集的情况)
- 三目表达式的隐式类型转换(转载)
- 隐式类型转换的问题
- 隐式类型转换&& 负数的补码
- 隐式类型转换&& 负数的补码
- C++ 隐式的类类型转换
- c++中类型的隐式转换。
- 面试
- 关于时间复杂度和空间复杂度的计算
- 常见API--邵发
- 函数调用加括号与不加括号的区别
- Javascript学习笔记(RegExp对象)
- 隐式类型转换(==的情况)
- php中的类与对象(抽象、接口与特性)
- 帮助命令
- 递归法实现汉诺塔
- HDOJ1412 {A} + {B}
- 12月9日 数据结构 周六
- 用户管理命令
- 模板
- 深层神经网络的搭建