2016-09-29 47 views
-1

爲什麼如果我寫下面的腳本,變量f的值是2016?JavaScript中的測試類型以及數字變量

var year = 2016; 
var g = 'foo'; 
var f = typeof g != 'undefined' && year; 
+0

怎麼樣? 'typeof g!='undefined''將始終爲'true',您將得到'year'的值。 –

+1

是的,但f的值是2016 –

+0

正確。他說你會得到「年的價值」,並將年的價值設置到2016年。 – Gavin

回答

2

是的,值爲f將是2016

讓我們來分解你的代碼。

typeof g != 'undefined' //returns true 

在邏輯運算符的情況下,將返回最終值。在你的情況

true && year //returns 2016 

由於&&滿足,終值(年)將b返回並分配給f

0

&&運算符計算其左的說法,如果這是falsey,否則計算結果爲它的正確論點。

由於g未定義,typeof g != 'undefined'爲真,typeof g != 'undefined' && year評估爲year其是2016年

(這不同於一些其他語言,其中邏輯操作的像&&||結果往往會出現布爾值,但JavaScript不是這種情況。)

+0

'typeof g!=「undefined」'是真的,不是假的 –

+0

@Bálint對不起,我在那裏做了一個錯字。謝謝! – Frxstrem

7

因爲&&是JavaScript中非常有趣的操作符:與其他一些語言不同,它不會導致truefalse(必然)。相反,&&的結果是其左操作數的值,如果這是falsy,或其右操作數的值,否則。

它的工作原理是這樣的:

  1. 評估左側操作數(在你的情況,typeof g != 'undefined')。
  2. 如果該值爲falsy,那是操作的結果,我們在此停止。
  3. 如果該值是truthy,評估右手操作數(year),使該操作的結果

按照它通過你的例子:

  1. 由於typeof g'string''string' != 'undefined',那就是true
  2. true不是虛假的,所以我們不會停下來。
  3. 評估year並做出結果。

因此f得到2016(值爲year)分配給它。

&&有一個同樣,有趣的表弟,||,關於這一點我已經寫了有關此問題的博客文章:在處理時JavaScript's Curiously-Powerful OR Operator (||)


Falsy值是強制要false值作爲布爾人。 Falsy值爲0,"",NaN,nullundefined,當然也是「錯誤」。

Truthy值是不值falsy(當像一個布爾處理它們強制true)。

注意:當您使用它們以布爾值的行爲方式是他們的行爲,如果你他們比較到布爾值的方式相同。 "foo"是一個truthy值,但"foo" == true"foo" === true都是false

1

該& &運營商總是返回它測試的最後一件事情,因爲在你的情況下,今年,它會返回值year

& &永遠不會將變量轉換爲布爾值,它只會檢查它是否爲真值。

+0

*「&&操作符總是返回它測試的最後一個東西」*它並不真正*測試*它的第二個操作數,然而,這是我看到的最明顯的方法之一。好一個。不得不讓它激發未來人們對此的解釋,試圖稍微調整它,而不會失去美妙的簡單。 –

+0

@ T.J.Crowder謝謝 –