2016-03-03 105 views
9

我認爲這將在ng-showng-class的背景下考慮?還有其他情況嗎?看起來真正的和虛假的不同於純粹的JavaScript稍微有點不同 - 但我目前知道的唯一例外是[]--這是JavaScript中的真理,但是AngularJS中的虛假。AngularJS中的真假和虛假價值是什麼?

(實際上,我嘗試使用AngularJS 1.2.1和[]是falsy,而在AngularJS 1.4.8和1.5.0,[]是truthy見https://jsfiddle.net/6ayaLhbk/https://jsfiddle.net/6ayaLhbk/1/https://jsfiddle.net/6ayaLhbk/2/

我認爲它有一個人可能認爲ng-show="ctrl.foo"ng-hide="!ctrl.foo"相同,但在角1.2.1的情況下,並非如此。在角1.2.1獲得純JavaScript的相同的結果,好像我們可以用ng-show="!!ctrl.foobar"https://jsfiddle.net/6ayaLhbk/3/

如果是在角1.2.1 ng-class,那麼現在看來似乎又回到了純JS truthy和falsy規則:https://jsfiddle.net/6ayaLhbk/5/

+1

相關的'[]':https://github.com/angular/angular.js/issues/3969 – Shomz

+0

如果我們能得到一美元每智能化downvoter這裏... – Shomz

+0

嘿,太極者無極而生! :)對不起,有任何誤解,但你說[]是Javascript中的真值? 我有點迷惑,因爲當我測試 '[] == 「」'' [] == 0' '[] == FALSE' 我得到了所有情況下都是這樣。 – ebragaparah

回答

0

角表情都像JavaScript表達式有以下區別:

語境:JavaScript表達式是針對全局窗口評估。在Angular中,表達式是針對範圍對象進行評估的。

Forgiving:在JavaScript中,試圖評估未定義的屬性會生成ReferenceError或TypeError。在Angular中,表達式評估原諒未定義且爲空。

篩選器:您可以在顯示錶達式之前使用表達式中的過濾器對數據進行格式化。

無控制流程語句:不能在Angular表達式中使用以下內容:條件,循環或例外。

無函數聲明:即使在ng-init指令內部,您也不能在Angular表達式中聲明函數。

否使用文字符號創建RegExp:您無法在Angular表達式中創建正則表達式。

使用新操作符創建對象:不能在Angular表達式中使用新操作符。

否按位,逗號和空操作符:不能在Angular表達式中使用位運算符或void操作符。

Source

1

下面的值總是falsy:

  • 0(零)
  • 「」(空字符串)
  • null
  • undefined
  • 的NaN(一個特殊的數字值,這意味着不能非數字!)

所有其他值都truthy,包括(引號零) 「0」, 「假」 (引號假) ,空函數,空數組和空對象。

var a = !!(0); // variable is set to false 
var b = !!("0"); // true 

Falsy比較值 Falsy值遵循一些有點奇怪比較規則,可以導致程序的邏輯錯誤。

的falsy值假,0(零),「」(空字符串)都是等價的,可以相互進行比較:

var c = (false == 0); // true 
var d = (false == ""); // true 
var e = (0 == ""); // true 

的falsy值null和undefined是不等同於什麼除了它們自己:

var f = (null == false); // false 
var g = (null == null); // true 
var h = (undefined == undefined); // true 
var i = (undefined == null); // true 

最後,謬誤值NaN不等於任何東西 - 包括NaN!

var j = (NaN == null); // false 
var k = (NaN == NaN); // false 

你也應該知道typeof(NaN)返回「number」。幸運的是,核心JavaScript函數isNaN()可用於評估值是否爲NaN。

如有疑問... 使用嚴格等於(===)和嚴格不等於(!==)的情況下truthy或falsy值可能會導致邏輯錯誤。這些運算符確保對象按類型和值進行比較。

var l = (false == 0); // true 
var m = (false === 0); // false