在对象到布尔值的情况下,Javascript中的类型强制是如何实现的?

在对象到布尔值的情况下,Javascript中的类型强制是如何实现的?,javascript,type-conversion,Javascript,Type Conversion,就我所知,(x==false)应该做与相同的事情!x,因为他们都试图将x解释为布尔值,然后将其取反 然而,当我尝试测试这个时,我开始有一些非常奇怪的行为 例如: false=[]和false==![]两者都返回true 另外 false==undefined和true==undefined都返回false,同样返回false false==Infinity和true==Infinity和 false==NaN和true==NaN 这到底是怎么回事 都在这里: 对于false=[]的情况: fa

就我所知,
(x==false)
应该做与
相同的事情!x
,因为他们都试图将
x
解释为布尔值,然后将其取反

然而,当我尝试测试这个时,我开始有一些非常奇怪的行为

例如:

false=[]
false==![]
两者都返回true

另外

false==undefined
true==undefined
都返回false,同样返回false

false==Infinity
true==Infinity

false==NaN
true==NaN

这到底是怎么回事

都在这里:

对于
false=[]
的情况:

  • false
    被转换为一个数字(0),因为这总是通过布尔运算完成的
  • []通过调用
    [].valueOf().toString()
    转换为原语,这是一个空字符串
  • 然后通过将空字符串转换为数字来计算
    0==”
    ,由于其结果也是0,
    false=[]
    为真
对于
false==![]

  • 通过返回与ToBoolean(GetValue(expr))相反的
  • 对于任何对象都是如此,所以
    ![]
    计算结果为
    false
    (因为
    !true=false
    ),因此为
    false==![]
    也是如此

(false==未定义)===false
(true==未定义)===false
更简单:

  • false
    true
    再次转换为数字(分别为0和1)
  • 由于undefined无法与数字进行比较,因此链将冒泡到默认结果,即
    false

其他两种情况的计算方法相同:首先将布尔值转换为数字,然后将其与另一个数字进行比较。由于0和1都不等于无穷大或不是一个数字,因此这些表达式的计算结果也会为
false

中描述了抽象等式算法

对于
x==y
,其中x=
false
和y=
[]

  • 没有。类型不相等
  • 不,x不是空的
  • 没有。x不是未定义的
  • 不,x不是一个数字
  • 不,x不是字符串
  • 是的,x是一个布尔值,所以我们比较了ToNumber(x)和y
  • 重复该算法,x=
    0
    和y=
    []

    我们在步骤8结束:类型(x)==number。和类型(y)=对象。
    因此,让结果为x==(y)。
    TopPrimitive([])==“”

    现在,用x=
    0
    和y=
    再次重复该算法。我们以4结尾:“返回比较结果x==ToNumber(y)。”
    ToNumber(“”==0

    算法的最后一次重复在步骤1结束(类型相同)。根据1.c.iii,0==0,返回true

    通过使用该算法,可以以类似的方式获得其他结果

    false == []
    
    允许使用
    ==
    Javascript应用转换。该对象将转换为一个基本体,以将类型与布尔值匹配,并留下一个空字符串。false将转换为数字0。比较空字符串和数字0。字符串被转换为一个0的数字,因此表达式为“true”

    Javascript将对象转换为布尔值true,因此拒绝true的结果为false

    false == undefined true == undefined
    false == Infinity and true == Infinity
    false == NaN and true == NaN
    
    还是一样的!false转换为0,true转换为1。然后,undefined被转换成一个数字,它是。。。楠!无论如何都是假的

    我建议使用
    ====尽可能多地获取“预期”结果,除非您非常清楚自己在做什么。使用类似于
    Boolean(未定义)=fals
    e的东西也很好


    在转换内容时,请检查ECMAScript规范中的所有详细信息。

    您是否与
    ==
    得到相同的结果?
    false=[]
    可以解释为
    [].toString()==”
    ,和
    false==”
    。无论如何,听起来您似乎相信,如果
    false==未定义的
    返回false,那么
    true==undefined
    应该返回true,但为什么这类比较会返回任何有意义的东西呢?@RobertHarvey没有,这是一个学术练习。显然,如果(![]==false)写文章的任何人都应该被解雇。@RobertKoritnik:是的,这个问题是修辞性的。
    false == undefined true == undefined
    false == Infinity and true == Infinity
    false == NaN and true == NaN