JavaScript如何评估语句表达式?

时间:2014-03-28 20:56:54

标签: javascript

我一直认为JavaScript的if语句对他们的论点做了某种投射魔术,但我对幕后的实际情况有点警惕。

我最近发现JavaScript comparison table并注意到即使-1 == true评估为falseif(-1){...}也会执行。

因此,在JavaScripts if语句中,表达式会发生什么?假设它使用!!{expression}将其转换为反布尔值,然后再将其反转,似乎是合理的,但如果是这种情况,JS如何判断对象的反布尔表示是否真实?

5 个答案:

答案 0 :(得分:5)

JavaScript很不可靠。

是的,-1 == true会导致错误,但这不是if语句的作用。它正在检查语句是否“真实”,或转换为true。在JavaScript中,这相当于!!-1,其中 导致为真(除零以外的所有数字都是真实的)。

为什么?!?

The spec defines double equals运算符在出现数字和布尔值时执行以下操作:

  

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

ToNumber会将布尔值true转换为数字1,因此您需要进行比较:

-1 == 1
任何人都能告诉你的事实显然是错误的。

另一方面,if语句正在调用ToBoolean,它会将任何非零,非NaN号码视为true

答案 1 :(得分:2)

任何JavaScript开发人员都需要查看文档 - 对于这种情况,位于此处:http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

9.2 ToBoolean

抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:

  • 参数类型结果
  • 未定义 false
  • false
  • 布尔值结果等于输入参数(无转换)。
  • 数字如果参数为+ 0,-0或NaN,则结果为false;否则结果是真的。
  • 字符串如果参数为空字符串(其长度为零),则结果为false;否则结果是真的。
  • 对象 true

(抱歉格式化,无法在此处制作表格。)

答案 2 :(得分:1)

来自JavaScript The Definitive Guide

以下值转换为false

,因此可以像undefined一样工作
  • null
  • 0
  • -0
  • NaN
  • ""
  • true //空字符串

所有其他值,包括所有对象(和数组)都转换为false,并像{{1}}一样工作。 {{1}}以及转换为它的六个值有时称为 falsy 值,所有其他值都称为 truthy

答案 3 :(得分:1)

这些东西本身就是假的(或评价为假):

  • 未定义
  • 0
  • ''或""
  • 的NaN

其他所有其他事情。

在评估预期结果为真或假(假)的情况时,会使用Truthy-ness或falsy-ness。

在您的示例if(-1 == true)中,您正在比较苹果和橙子。首先评估比较(并导致错误),并在您的条件中使用该结果。 truthyness / falsyness的概念并不适用于比较操作数。

答案 4 :(得分:0)

如果状态使用比较变量不同类型js使用.toString和.valueOf(有关更多信息,请检查http://javascript.info/tutorial/object-conversion) - 请记住这一点 - 这样做更容易理解