Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:为什么[]==![]?_Javascript - Fatal编程技术网

JavaScript:为什么[]==![]?

JavaScript:为什么[]==![]?,javascript,Javascript,在JavaScript中,我注意到[]==![]结果为true 我不明白这个结果。你能解释一下原因吗?[]是一个数组,但是![]是一个布尔值。当您试图用=比较两个不同类型的对象时,应将两个对象转换为可比较的对象(使用ToNumber,请参见11.9.3中的步骤7)。这就是为什么[]==![]生成true,第一个空数组的计算结果为false 比较x==y,其中x和y是值,生成true或false。这样的比较如下所示: 如下: [……] 如果x为null而y未定义,则返回true 如果x未定义且y为

在JavaScript中,我注意到
[]==![]
结果为
true


我不明白这个结果。你能解释一下原因吗?

[]
是一个数组,但是
![]
是一个布尔值。当您试图用
=
比较两个不同类型的对象时,应将两个对象转换为可比较的对象(使用
ToNumber
,请参见11.9.3中的步骤7)。这就是为什么
[]==![]
生成true,第一个空数组的计算结果为
false

比较x==y,其中x和y是值,生成true或false。这样的比较如下所示: 如下:

  • [……]
  • 如果x为null而y未定义,则返回true
  • 如果x未定义且y为null,则返回true
  • 如果类型(x)是数字,类型(y)是字符串, 返回比较结果x==ToNumber(y)
  • 如果类型(x)是字符串,类型(y)是数字, 将比较结果返回到数字(x)=y
  • 如果类型(x)是布尔值,则返回比较结果tonNumber(x)==y
  • 如果类型(y)是布尔值,则返回比较结果x==ToNumber(y)
  • 如果类型(x)是字符串或数字,而类型(y)是对象, 返回比较结果x==ToPrimitive(y)
  • 如果类型(x)是对象,类型(y)是字符串或数字, 返回比较结果ToPrimitive(x)==y
  • 返回false
  • 但是,如果使用严格类型比较运算符
    ==
    ,则结果为false,因为这两种类型不同:

    比较x===y,其中x和y是值,生成true或false。进行这样的比较 详情如下:

  • 如果类型(x)与类型(y)不同,则返回false
  • 如果类型(x)未定义,则返回true
  • 如果类型(x)为Null,则返回true
  • 如果类型(x)为数字,则
  • 如果x为NaN,则返回false
  • 如果y为NaN,则返回false
  • 如果x与y的数值相同,则返回true
  • 如果x为+0,y为-0,则返回true
  • 如果x为-0,y为+0,则返回true
  • 返回false
  • 如果类型(x)是字符串,那么如果x和y是完全相同的字符序列(相同的长度和长度),则返回true 对应位置的相同字符);否则,返回false
  • 如果类型(x)为布尔值,则如果x和y均为真或均为假,则返回真;否则,返回false
  • 如果x和y引用同一对象,则返回true。否则,返回false

  • @曾格:我不知道。对我来说,这似乎是一个完全不同的问题。@BoltClock:[]在布尔上下文中是真的,而且![]因此为false,之后代码执行[]==false,结果为true。@AnttiHaapala:这不完全正确-
    [1]
    在布尔上下文中为true,但
    ![1] 
    为false,
    [1]==false
    也会产生false。这不是布尔上下文,而是
    =
    算法。@BoltClock我同意@Antti。答案详细描述了
    []
    的转换![]
    ,它回答了这个问题。@zengr:这并不是同一个问题。请详细说明“转化为可比较的对象。这就是为什么[]==![]产生true”。这个答案看起来像没有证据的猜测。回复:编辑:仍然不够。相关部分见第11.9.3节。您可以按照定义的步骤得出正确的结论。@RobW:我注意到了错误并删除了错误的相等运算符。我花了一点时间加载ECMA-262.pdf,我的连接速度很慢。@RobW:谢谢你帮我添加了书签。我还在我的硬盘上保存了一份副本,这应该很容易处理
    []=![]
    []
    之间的抽象相等比较![]
    注意,
    typeof(![])
    boolean
    typeof([])
    对象
    。从x==y的文档中,如果类型(y)是布尔值,则返回比较结果x==ToNumber(y)。t编号为
    ![]
    也就是说
    false
    是0,所以它归结为[]==0,
    []==0
    的结果是
    true
    @kidmenot:显然,在周六早上还是太早了。修正了我的答案。