资讯专栏INFORMATION COLUMN

【JavaScript 类型比较】为什么空对象不==true?

gghyoo / 1708人阅读

摘要:预备知识非严格比较操作符是会做强制类型转换的,其规则是会根据这些规则,将两边强制转换成相同类型,才进行比较。

【JavaScript 类型比较】为什么空对象不==true? 背景

Boolean()函数为强制转换为布尔类型的函数,其转换规则如下:

问题

为什么表达式[]==true =>false, 表达式{}==true =>false,按照ToBoolean的规则,这两个表达式不应该都是真true吗?

示例

解决

其实当用试图用Boolean()强制转化==两边为布尔类型再进行比较时,方向已经错了,==强制转换的方式和if(expresssion)中if括号里的强制转换是不一样的。
预备知识:非严格比较操作符==是会做强制类型转换的,其规则是:

==会根据这些规则,将两边强制转换成相同类型,才进行比较。
其中第7、9条:

7.If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
9.If Type(x) is Object and Type(y) is either String, Number, or Symbol, return the result of the comparison ToPrimitive(x) == y.

大意是:若==两边类型不一致,布尔值的会使用Number()强制转换为数值型,对象类型会使用ToPrimitive规则进行转换,ToPrimitive规则如下:

根据这些规则,
对于表达式[]==true:实际上等价于ToPrimitive([]) == ToNumber(true),即Number([].toString()) == Number(true)

对于表达式{}==true:实际上等价于ToPrimitive({}) == ToNumber(true),即Number({}.toString()) == Number(true)

因为NaN为非数值,因为不可能等于0或1,所以不管是表达式{}==true还是表达式{}==false,结果都为false

总结
对于==,如果两边类型相同(引用类型除外),则直接比较值是否相同;如果两边类型不一致,就把两边都变成Number类型,然后再比较。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105713.html

相关文章

  • Javascript 隐式转换

    摘要:在比较字符串数值和布尔值的相等性时,问题还比较简单。后来,有人提出了这种转换到底是否合理的质疑。相等时的隐式转换对于操作符,通常都会先隐式转换强制转换,然后再比较它们的相等性。要比较相等性之前,不能将和转换成其他任何值。 确定两个变量是否相等是编程中的一个非常重要的操作。 在比较字符串、数值和布尔值的相等性时,问题还比较简单。但在涉及到对象的比较时,问题就变得复杂了。最早的 ECMAS...

    AnthonyHan 评论0 收藏0
  • JavaScript的相等比较(==)和(===)及Object.is()的区别

    摘要:原始类型值比较原始类型值有五种布尔值字符串数值。用来比较两个值是否严格相等,与严格比较运算符的行为基本一致。返回布尔值,相等返回,不相等返回。 比较运算符之相等运算符 ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。前者在比较时对于不同数据类型的值会进行类型转换;而后者不会转换,且结果更容易预测,并且因为没有隐式转换,全等比较的运行会更快。因此...

    王军 评论0 收藏0
  • JavaScript系列--类型判断的4种基本方法,研究jquery的type方法,对象的检测方法

    摘要:用对象字面量创建的对象会报错,使用构造函数创建的对象属于。发现,构造函数创建的,,,,。从原型链角度讲,构造函数就是新对象的的类型。 一、前言 类型判断有时候真的头疼,但是一旦熟练使用就会觉得不过如此。初级的,会判断数字和字符串。中级的,会判断数组和对象。进阶的,会判断日期,正则,错误类型。高级的,会判断plainObject,空对象,window对象等等。 基本类型:String、N...

    lavor 评论0 收藏0
  • JavaScript系列】类型判断的4种基本方法,研究jquery的type方法,对象的检测方法

    摘要:用对象字面量创建的对象会报错,使用构造函数创建的对象属于。发现,构造函数创建的,,,,。从原型链角度讲,构造函数就是新对象的的类型。 一、前言 类型判断有时候真的头疼,但是一旦熟练使用就会觉得不过如此。初级的,会判断数字和字符串。中级的,会判断数组和对象。进阶的,会判断日期,正则,错误类型。高级的,会判断plainObject,空对象,window对象等等。 基本类型:String、N...

    xiongzenghui 评论0 收藏0
  • 从[]==![]为true来剖析JavaScript各种蛋疼的类型转换

    摘要:将他们放在堆中是为了不影响栈的效率。所以简单数据类型的值直接存放在栈中。可以对比上面那张图默认是调用方法的依,于是等于空字符串。空字符串中国标准时间方法返回对象的原始值,可能是字符串数值或值等,看具体的对象。,需要两个操作数同时转为。 你是否在面试中遇到过各种奇葩和比较细节的问题? []==[] //false []==![] //true {}==!{} //false {}==![...

    Jeff 评论0 收藏0

发表评论

0条评论

gghyoo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<