Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么{{undefined+;number}}返回数字?_Javascript_Angularjs - Fatal编程技术网

Javascript 为什么{{undefined+;number}}返回数字?

Javascript 为什么{{undefined+;number}}返回数字?,javascript,angularjs,Javascript,Angularjs,我在做一个AngularJS项目。我注意到下面的表达式返回一个数字 在视图中,{{undefined+10}}将输出10 在JavaScript中,undefined+10将输出NaN 为什么从一个角度来看,这种行为有所不同 这就是插值的优点 插值AngularJS使用嵌入表达式的标记来提供文本节点和属性值的数据绑定 如果插值不是字符串,则按如下方式计算: 未定义和null被转换为“”(空字符串) 如果该值是一个不是数字、日期或数组的对象,$interpolate在该对象上查找自定义的toSt

我在做一个AngularJS项目。我注意到下面的表达式返回一个数字

在视图中,
{{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)”的位置。