下划线.js every() 与未定义
underscore.js every() with undefined
我写了一些这样的代码:
var a = new Array(10); // should be [undefined * 10]
var b = _.every(a, function(m){
if(_.isUndefined(m)){
return false;
}
return true;
});
我希望 b 是"假的",但它返回"真"。为什么它返回"true"?
然后,我改成这样:
var c = [undefined, undefined];
var d = _.every(c, function(m){
if(_.isUndefined(m)){
return false;
}
return true;
});
它在 D 中返回"假"。
为什么它们不同?
您可以在 http://jsfiddle.net/3qj4B/3/中对此进行测试
当您使用类初始值设定项创建数组时,您正在创建一个具有 10 个可用内存空间的数组,但尚未初始化它们。所以你不会循环任何事情。
现在看看every
的来源:
_.every = _.all = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
result
设置为true
,并且由于each
不执行迭代,因此将返回该。这就是你返回true
的原因.
如果您在小提琴中尝试在处理程序中添加console.log(m)
,您将在控制台中看到任何日志,因为each
迭代 0 次。
使用
Array 构造函数和初始大小初始化数组与使用 undefined
条目的显式列表初始化之间存在细微差别。前者(Array 构造函数(不会创建与索引对应的属性,而显式初始化会创建。
我怀疑 Underscore 在可能的情况下使用本机.forEach()
,并且不会对未初始化的索引调用其回调。因此,在第一个测试中,根本不会调用对_.every()
的回调。
edit — 数组构造函数执行的操作或多或少与以下内容相同:
var a = []; a.length = 10;
当您通过像这样增加数组的长度来扩展数组时,不会初始化新的隐式索引位置。这是不存在属性和不存在没有价值的属性之间的基本区别。在这两种情况下,取消引用属性都会导致undefined
。 因此:
var o = {};
if (o.something == undefined) // this will be true
然后:
var o = { something: undefined };
if (o.something == undefined) // also true
区分这两种情况的一种方法是in
运算符:
if ('something' in o) // only true in the second case
相关文章:
- 要求未定义JS回调参数
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- 无法读取属性'材料'未定义的Three.js
- renderReact/Rect Router+Node/Express.js的服务器端/同构渲染中未定义renderP
- 如何解决'窗口未定义'终端上的节点JS出错
- 在js中访问元素时不透明度和样式未定义,但在css中定义
- 为什么这个JS代码打印未定义
- Node.js错误“;ReferenceError:全局未定义“;在从0.10.2更新到0.12.2之后
- Node.js引用错误:未定义类名
- '会话'未定义-会话存储的Este JS/Express/Redis
- 谷歌地图infowindow错误f=未定义的infowindow.js
- simpleCart js缩略图未定义
- Node.js/Express未输出console.log,highcharts.js给出未定义的错误
- "TypeError:t.start未定义”;,在fullcalendar.min.js中,同时在我的网站上使
- Meteor js-控制台显示'未定义'即使返回结果
- 无法设置属性'name'的未定义JS
- 全局变量表示未定义 - JS
- 函数未定义js
- AWS Cognito未认证登录错误(窗口未定义)[JS]