为什么在javascript中验证([])而[]==false?

为什么在javascript中验证([])而[]==false?,javascript,boolean,Javascript,Boolean,他们都会发出警报 这是因为==(相等)运算符的类型强制 空数组被认为是真实的(就像空对象一样),因此调用第二个警报 但是,如果使用([]==false),数组将强制为其字符串表示形式*,即“”,然后将其视为,这将使条件为真,从而触发第一个警报 如果要避免类型强制,必须使用==(identity)操作符,这是javascript中比较首选的、著名的提升方式 你可以在这本书里读到更多关于这件事的内容 *(Object.prototype.toString被调用) 编辑: JS比较的乐趣: if([]

他们都会发出警报


这是因为
==
(相等)运算符的类型强制

空数组被认为是真实的(就像空对象一样),因此调用第二个警报

但是,如果使用
([]==false)
,数组将强制为其字符串表示形式*,即
“”
,然后将其视为,这将使条件为真,从而触发第一个警报

如果要避免类型强制,必须使用
==
(identity)操作符,这是javascript中比较首选的、著名的提升方式

你可以在这本书里读到更多关于这件事的内容

*(
Object.prototype.toString
被调用)

编辑: JS比较的乐趣:

if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');

这显示了与
==
进行比较的真正“力量”,这是由于bfavarettos答案中提到的奇怪规则。

将值作为布尔值进行计算与将其与
true
false
进行比较是有区别的

当使用
==
运算符时,将转换值以使类型对应。将
[]
值转换为空字符串
”“
,然后将其转换为布尔值,则
[]==false
变为真


[]
作为布尔值进行计算将返回
true
,因为它不是一个“假”值,即
0
false
null
NaN
undefined
这两个当前的答案都是正确的,但我想在前面的基础上添加一个更详细的解释。产生明显矛盾结果的原因是
if
语句和平等性比较的评估不同

对于
if(expression)
语句,将对表达式求值,然后将其转换为布尔类型()。数组是对象,当对象转换为布尔值时,结果总是
true
()

==
的相等性比较遵循一组不同的规则,详见。比较可能需要多次类型转换,直到两个操作数的类型相同为止。操作数的顺序也很重要。根据该算法,我们可以看到比较
[]==false
实际上是一个四步操作:

  • 涉及到一个布尔值,因此首先将其转换为一个数字(算法的第7步)。因此,它变成:

    NaN == false // false
    NaN == true  // also false
    NaN == NaN   // false
    
    if(NaN)      // false
    if(!NaN)     // true
    
    0  == '0'     // true
    '' == 0       // true
    '' == '0'     // false !
    
  • 然后将数组转换为其基本值(请参见和),并变为空字符串(步骤9)。因此:

  • 将字符串与数字进行比较时,首先将字符串转换为数字(步骤5,遵循中描述的规则):

  • 现在我们有了两个数字,根据步骤1.c.iii,比较结果为
    true

  • 似乎是某种奇怪的类型强制在
    =
    中进行。如果您尝试强制转换布尔值,如
    !![]
    如果你得到
    true
    ,如果你像
    []==
    中那样使用
    []==false
    操作符,那么它不会发出任何警报。document.write(“+[].toString()+”)更准确地说,
    对象.prototype.toString
    在数组实例上被调用,结果是
    (对于有条件的情况)。@jAndy这是真的,我想保持简单,但很好,你添加了评论;)@嗯,我不是以英语为母语的人,所以这可能不太合理,我只想说的是,你可能需要自己评估他非常有说服力的观点。我相信这是一个toString,评估为“”而不是“”0@mplungjan:是的,我刚刚添加了所有falsy值,并将“e.g.”更改为“I.e.”:)是的,我看到了,并删除了我的评论,但我认为您仍然对第一条语句中的0+1有问题,因为您做作业,但是请注意,一些转换仍然存在问题,如
    “”
    0
    ,这很难解释,但却是这些奇怪现象的关键点,以及等式运算符缺少传递性,如
    '
    0
    '0'
    。谢谢@Christoph。添加了到第9.3.1节的链接,其中解释了
    “->0
    。我所理解的是,在
    中如果([]==false)
    错误
    被转换为一个数字,所以+[]=0和+false=0并且相等,在
    中如果([])
    []
    被转换为对象,该对象被转换为布尔值,且对象始终为真。“是这样吗?”乔纳森·安德姆说。几乎。在
    if([]==false)
    中,
    false
    直接转换为
    0
    <首先将代码>[]
    转换为字符串(类似于
    []+”“/”
    ),然后将
    转换为
    0
    。在
    中,如果([])
    :数组是对象,因此数组不会转换为对象,它已经是一个对象了。
    [] == 0
    
    "" == 0
    
    0 == 0