Javascript 为什么{{undefined+;number}}返回数字?
我在做一个AngularJS项目。我注意到下面的表达式返回一个数字 在视图中,Javascript 为什么{{undefined+;number}}返回数字?,javascript,angularjs,Javascript,Angularjs,我在做一个AngularJS项目。我注意到下面的表达式返回一个数字 在视图中,{{undefined+10}}将输出10 在JavaScript中,undefined+10将输出NaN 为什么从一个角度来看,这种行为有所不同 这就是插值的优点 插值AngularJS使用嵌入表达式的标记来提供文本节点和属性值的数据绑定 如果插值不是字符串,则按如下方式计算: 未定义和null被转换为“”(空字符串) 如果该值是一个不是数字、日期或数组的对象,$interpolate在该对象上查找自定义的toSt
{{undefined+10}}
将输出10
在JavaScript中,undefined+10
将输出NaN
为什么从一个角度来看,这种行为有所不同 这就是插值的优点 插值AngularJS使用嵌入表达式的标记来提供文本节点和属性值的数据绑定 如果插值不是字符串,则按如下方式计算:
- 未定义和null被转换为“”(空字符串)
- 如果该值是一个不是数字、日期或数组的对象,
在该对象上查找自定义的$interpolate
函数,并使用该函数toString()
- 如果上述情况不适用,则使用JSON.stringify
$interpolate
服务查看文本节点和元素属性是否包含带有嵌入表达式的插值标记
此外,角度编译器使用插值直接
并注册观察者,以便监听模型更改。这就是消化循环的过程
阅读更多内容以了解插值的工作原理
为什么{{'=+Infinity}
返回true
在AngularJS中,$interpolate
服务将+无穷大
计算为0
值
angular.module('app',[])
.controller('controller',['$injector',函数($injector){
}]);
setTimeout(函数(){
引导(document.getElementById('body'),['app']);
});代码>
{{+无限}
通过引用AngularJS代码来解释,这就是神奇之处:
function plusFn(l, r) {
if (typeof l === 'undefined') return r;
if (typeof r === 'undefined') return l;
return l + r;
}
如果您有一个“plus”表达式,则此函数将解析到模板中
表达式替换由Parser.parse(angular.js:16155)或parse.js:1646()调用。我可以建议,未定义的
值在插值中被忽略,因此{{undefined+10}}
实际上是{+10}。但这只是我的建议。顺便说一句。它确实返回一个字符串,而不是一个数字。javascript主要基于字符串,因此未定义的is变量为“string empty”,什么不是数字。一般来说,询问有关javascript类型强制语义的“为什么”问题是一件愚蠢的事情。“为什么”意味着我们采取了一种有原则的方法,我们可以从观察倒退到它们背后的原则。但是在JS中,(正如Gary Bernhardt指出的,[]+[]
是“”,[]+{}
是对象,{}+[]
是0,{}+{}
是NaN
。沃特?这些规则足够神秘、武断和不一致,因此尝试应用这些原则是非常困难的。我的问题主要是关于AngularJS的行为。有了Alexandru&Steffen的解释,这对我来说没关系!非常感谢,我不知道!你太快了,在5分钟前无法接受你的答案。为什么{{'==undefined}
会导致false
?@NickA操作被执行,布尔值被转换成字符串值。@NickA,因为没有任何东西等于undefined
,而不是两个undefined
,那么{'==+Infinity}
的计算结果为true
?同时,{{'=+(1/0)}
返回false
。如果,角度是多少?Ok在这里找到了()。有趣!必须找到调用它的位置请参见此行:这是计算字符串函数“return plus(未定义,10)”的位置。