2016-03-03 116 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