【问题标题】:javascript why Array() is true?javascript 为什么 Array() 是真的?
【发布时间】:2013-07-24 19:05:27
【问题描述】:

以下代码将输出'true',这意味着 Array() 为真。在 Python 中,list() 是 False,这仅仅是因为语言设计者的偏好吗?

    document.write("<p>Array() is " + (Array() ? "true" : "false") + "</p>");

【问题讨论】:

标签: javascript


【解决方案1】:

Array() 是真实的。换句话说,它有一个值,并且该值不是 false、null 或 undefined。有很多关于什么是真实的列表,而不是在 web 上的 javascript。举个例子,创建新数组的更“标准”/“公认”的方式是使用数组文字 - []。如果你把它放在你的控制台中,你也会得到“真”。

console.log(!!([]));

【讨论】:

    【解决方案2】:

    这是因为 javascript 将 Array() 的值强制转换为布尔值。这就是所谓的“真实性”,在 javascript 中,真实值包括任何有效对象。 Array() 生成一个有效对象,因此在布尔表达式中计算为真值。

    NullundefinedNaN0 和空字符串"" 评估为假。

    为什么?因为ECMAScript spec 是这么说的。

    【讨论】:

    • 甚至有些语言的计算结果为 0 (Lua)。
    【解决方案3】:

    Array() 在这里返回数组(虽然是空的),试试(Array().length ? "true" : "false")

    【讨论】:

    • 是的,但是您仍然在这里进行隐式类型转换,因为Array().length 是整数,而不是布尔值。
    • @kojiro .length 中隐含的内容是什么?
    • 问题是关于隐式布尔转换,例如为什么空数组false 是一种语言而true 是另一种语言? 您的回答表明,不是一个隐式布尔转换Array() ? "true" : "false"Boolean({}) ? "true" : "false",OP 应该使用 不同的隐式布尔转换Array().length ? "true" : "false"Boolean(0) ? "true" : "false"。恰好有不同的结果,因为它是不同的类型转换,但它仍然是隐式转换。
    • 回答明显的问题,它在不同的语言中是不同的,因为它们是不同的,如果你非常想要它,你可以使用Array.isArray() 来获取布尔值,但是它也将返回 true。我希望你明白为什么。
    【解决方案4】:

    这里 Array() 是一个构造函数,它甚至会指向一个非空的、已定义的对象
    在您的示例中它将是空的,但它是有效的,以及何时将其转换为
    布尔值,它将被评估为真(只有 nullundefined 对象被评估为
    错误的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-05
      • 2020-09-04
      • 2012-06-09
      • 2015-08-14
      • 2019-06-07
      • 2014-10-21
      • 2014-12-01
      • 2012-09-29
      相关资源
      最近更新 更多