2014-03-28 196 views
1

我一直認爲JavaScript的if語句爲他們的論點做了某種投射魔術,但我對幕後實際發生的事情有點警惕。JavaScript如何評估語句表達式?

我最近發現一個JavaScript comparison table,並注意到,即使-1 == true評估爲falseif(-1){...}將執行。

因此,在JavaScript的if語句中,表達式會發生什麼變化?假設它使用!!{expression}將其轉換爲反布爾值,然後再次反轉它似乎是合理的,但是如果是這種情況,JS如何確定對象的反布爾表示是否真實?

+0

我不明白 - '-1'是真的,所以它會執行。 (truthy!= true) –

+3

「truthy」與某事物(布爾值)真值 –

+0

(例如, 'var x = true;'既是真實的又是布爾型的'true'。但是'var x ='true';'是truthy而是'true'!= true',因爲''true''是一個字符串類型值,'true'是一個布爾類型值 –

回答

5

JavaScript是不可靠的。

是的,-1 == true導致錯誤,但這不是if語句正在做的事情。這是檢查,看看這個陳述是'truthy',還是轉化爲真。在JavaScript中,這相當於!!-1,其中確實是結果爲真(除零以外的所有數字均爲真)。

爲什麼?!?

The spec defines雙等於操作員做當與一個數字和一個布爾提出以下:

如果Type(y)爲布爾型,返回的比較X == ToNumber(Y)的結果。

ToNumber將布爾true轉換成數字1,所以你比較:

-1 == 1 

任何人都可以告訴你的是顯然是錯誤的。

另一方面,if聲明調用ToBoolean,它認爲任何非零非NaN編號爲true

2

任何JavaScript開發真的需要看文檔 - 對於這種情況,位於這裏:http://www.ecma-international.org/ecma-262/5.1/#sec-9.2

9。2 ToBoolean

的抽象操作ToBoolean根據表11其參數轉換爲布爾類型的數值:

  • 參數類型結果
  • 未定義
  • 布爾型結果等於inpu t參數(不轉換)。
  • Number如果參數爲+0,-0或NaN,則結果爲false;否則結果是真的。
  • 字符串如果參數是空字符串(其長度爲零),則結果爲false;否則結果是真的。
  • 對象真正

(很抱歉的格式,不能使一個表在這裏。)

+0

這是什麼在幕後使用,可以這麼說,當JavaScript將'if'語句的表達式轉換爲布爾值時?我會想象'!! {表達式}'會變得更快。 – Bucket

+1

@DesertIvy'!'祕密調用ToBoolean:http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.9 – SomeKittens

+0

@DesertIvy是的,這是幕後發生的事情。不,'!!'不會更快,因爲這個ToBoolean仍然必須在第一個'!'上調用,然後再次在第二個上調用。 –

1

JavaScript The Definitive Guide

下面的值轉換爲,因此喜歡的工作,false

  • undefined
  • null
  • 0
  • -0
  • NaN
  • "" //空字符串

所有其他價值,包括所有對象(和數組)轉換,而像,true工作。 false以及轉換爲它的六個值有時被稱爲falsy值,其他所有值都被稱爲truthy

1

這些東西本身是falsy(或評估爲false):

  • 不確定
  • '' 或 「」
  • NaN的

Everyt其他人,我真誠。

當評估預期結果爲真(真)或假(假)的情況時,會使用真實性或虛假性。

在您的示例if(-1 == true)中,您正在比較蘋果和橘子。首先評估比較結果(並導致錯誤),並將結果用於您的情況。對於操作數的比較,並不適用於真/假的概念。