2012-07-18 79 views
18

測試代碼:爲什麼bool(true)&& string的結果是javascript中的字符串?

console.log(true && "abc");//abc 

誰可以告訴我爲什麼結果是abc

+0

參見:http://stackoverflow.com/q/2587182 – CMS 2012-07-18 14:38:42

+1

**臨提示:**這些可以說是等價的:'someBoolVar? DoTrue():DoFalse()'與'someBoolVar && DoTrue()||相同DoFalse()'但是瞭解第二個,可以很容易地在Javascript中編寫其他僞操作符:即。 ** coalesce **:'someVar || defaultValue' – 2012-07-18 14:39:28

回答

16

MDN (Logical Operators) - Logical And (&&)

將返回EXPR1是否可以轉換爲false;否則,返回 expr2。因此,當與布爾值一起使用時,如果兩個 操作數均爲true,則& &返回true;否則,返回false。

true顯然不能評估爲false,所以返回的第二個值是「abc」。

6

&&操作者在JavaScript比在C或Java或等它總是返回最後評價子表達式的值(總的表達式是否爲真—「truthy」 —或假—「falsy」)和沒有按略有不同」 t強制布爾結果。當它失敗時(當其中一個值是「falsy」)時,同樣的結果是原始值,而不是值的布爾解釋。

所以是這樣的:給A && B,解釋執行以下操作:

  1. 評估表達的,給人一種
  2. 一個 V —值設A 是結果鑄造 V爲布爾
  3. 如果A false,則該的值表達爲A V
  4. 評估表達式B,給予乙 V
  5. 返回b V作爲&&表達式的值。

因此,在一個if語句中,&&表達具有相同效果如C或Java的布爾轉換運算符,因爲if語句本身執行對總體表達結果的truthy/falsy測試。然而,當它本身被使用時,它更像是「如果第一個表達式是真的,請給我第二個表達式的值,否則給我第一個表達式的值」。

+1

它並不總是返回最後一個值。 '(0 && true)'返回'0'(第一個值)。 – Quentin 2012-07-18 14:33:33

+0

@Quentin這就是爲什麼我用「當它是真實的或真實的」來限定陳述的原因;通過「它」我的意思是整個表達。不過,我會重新評論它。 – Pointy 2012-07-18 14:36:14

+0

@Quentin:在評估邏輯運算符操作數時返回最後一個值。沒有中斷評估的最後一個總是在退出評估時存儲並返回。所以它* somhow *返回最後* truthy *值。 – 2012-07-18 14:36:37

1

&&如果左側評估爲false,則返回左側,否則返回右側尺寸。

true不是false,所以它返回右邊,這是你的字符串。

> 0 && true // LHS is false, return LHS 
0 
> 1 && true // LHS is true, return RHS 
true 
> false && 0 // LHS is false, return LHS 
false 
> true && false // LHS is true, return RHS 
false 
0

你有點可以 「修復」,通過包裝表達成!!()

!!(true && 'abc'); 
+0

這可能會產生混淆,因爲這樣做你仍然不返回第一個操作數的雙重否定,而是轉換'abc'做國內第一否定時,布爾(它將這個字符串轉換爲「true」,因爲它不是空的並且否定了這個),然後你再次否定它以得到正確的值。我認爲你應該解釋它背後的原因,它仍然是'abc'得到返回,只是在它的轉換布爾值。 – 2012-07-18 14:41:33

+1

@RobertKoritnik:是啊,也許「修復」應爲「完成」所取代。 – jAndy 2012-07-18 14:44:27

+0

@RobertKoritnik:實際上,'!!()'將返回TRUE;如果所有條件與''&&結合是'真'。否則,它總是「錯誤」加上你不必處理像OP那樣的任何值。 – jAndy 2012-07-18 14:45:45

相關問題