当前位置:  开发笔记 > 编程语言 > 正文

如何理解表达式"{} == true"?

如何解决《如何理解表达式"{}==true"?》经验,为你挑选了2个好方法。

我尝试理解doc {} == true部分后面的表达式.7.2.12Ecma-262

    如果Type(y)是布尔值,则返回比较结果 x == ToNumber(y)

结果ToNumber(true)1,然后

{} == 1

    如果Type(x)是Object而Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x) == y.

我现在很困惑ToPrimitive({}).

    如果提示是"字符串",那么

    一个.让methodNames为«"toString","valueOf"».

    其他,

    一个.让methodNames为«"valueOf","toString"».

应该ToPrimitive({})被解释为{}.toString(){}.valueOf()

假设toString()被调用.

如果Type(x)是String而Type(y)是Number,则返回比较结果 ToNumber(x) == y

{} == true可能是ToNumber(ToPrimitive({})) == ToNumber(true)吗?



1> Felix Kling..:

该规范说:

ToPrimitive没有提示的情况下调用时,它通常表现为提示为数字.

因此,根据ToPrimitive算法,valueOf首先调用.但由于返回一个对象而不是原始值,toString因此将调用second,它返回一个字符串.

{} == true可能是ToNumber(ToPrimitive({})) == ToNumber(true)吗?

是的,这正是它的本质.



2> Dmitri Pavlu..:

ToPrimitive({})首先评估为{}.valueOf().因为valueOf()返回对象本身,所以toString()使用该方法.
{}.toString()返回"[object Object]",与之比较1."[object Object]"被转换为数字NaN并与之进行比较1.
现在操作数与Number类型相同,并使用===运算符.NaN === 1评估为false.

形式上:

    {} == true(转换trueNumber- > 1)

    {} == 1(转换{}使用valueOf(),然后toString()- > "[object Object]")

    "[object Object]" == 1(转换"[object Object]"Number- > NaN)

    NaN == 1(更改运算符===因为操作数是相同的类型)

    NaN === 1

    false

更新:查看我的帖子JavaScript相等运算符的图例,其中包含更多详细信息和示例.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有