我正在寻找一种将 max/min 函数添加到 JavaScript 的 Array 类的方法,这似乎是一个已解决的问题:JavaScript: min & max Array values? . 但是,当我尝试使用它时,我开始从我的代码中收到错误。事实证明,这种方法不适用于循环。
for(i in myArray) { console.log(i) }
打印出来 1
2
3
最大
分钟
我可以使用另一种方法吗?
我正在寻找一种将 max/min 函数添加到 JavaScript 的 Array 类的方法,这似乎是一个已解决的问题:JavaScript: min & max Array values? . 但是,当我尝试使用它时,我开始从我的代码中收到错误。事实证明,这种方法不适用于循环。
for(i in myArray) { console.log(i) }
打印出来 1
2
3
最大
分钟
我可以使用另一种方法吗?
公认的解决方案可以解决您的直接问题,但扩展核心对象通常不是一个好主意。当您稍后包含一个使用的库时会发生什么for..in
?或者当您在几个月后忘记并在代码的不同部分使用错误的方法时?
另一种选择是包装和扩展。创建一个使用 的实例Array
作为其原型的新类型:
function ArrayThing() {}
ArrayThing.prototype = new Array();
现在你有了一个可以扩展而不影响的对象Array
:
ArrayThing.prototype.max = function() {
return Math.max.apply(null, [].slice.call(this, 0))
}
ArrayThing.prototype.min = function() {
return Math.min.apply(null, [].slice.call(this, 0))
}
var list = new ArrayThing();
// standard array methods still work
list.push(5);
list.push(22);
list.push(0);
list.push(-14);
list.length // => 4
// as do your new custom methods
list.max() // => 22
list.min() // => -14
这并不适用于所有情况,但除非你确定你真的非常需要一个Array
,这是一个有用的选择。
for...in
循环用于循环遍历对象的属性。如果要从数组中获取值,可以这样做:
for (var i = 0; i < myArray.length; i++)
{
console.log(myArray[i])
}
for in
是一个常见的 Javascript 陷阱。foreach
它实际上枚举给定对象中的所有属性,而不是像其他语言那样表现。
由于 Javascript 数组碰巧有每个索引的属性 usingfor in
有时,但正如您所看到的,它还会枚举您添加的任何其他属性。另一个问题是for in
不能保证以任何特定顺序遍历属性,因此您的结果可能会因您使用的浏览器/运行时而异。
那么,只使用一个无聊的for
循环会更安全。Javascript中有很多for
循环习语,所以我将列出一些:
常规 for 循环:
for(i=0; i<arr.length; i++){
常规循环,缓存长度:
for(i=0, n=arr.length; i<n; i++){
循环对象/节点列表数组:
for(i=0; obj=arr[i]; i++){ //this works as long as the array has no falsy values
foo(obj)
您需要使用 hasOwnProperty 进行检查。但是,这需要在您循环的任何地方应用。
IE:
for(i in myArray)
{
if(arr.hasOwnProperty(i))
{
console.log(i);
}
}
现在有一种更现代的(IE9+)方法可以做到这一点:
var g = [];
Object.defineProperty(g, "log", {
enumerable: false,
configurable: false,
writable: false,
value: function(){ console.log(this); }
});
g.push(5);
g.push(9);
var t;
for (t in g){
console.log(g[t]);
}
打印 5 和 9 但未列出“日志”功能
g.log() -> echos [5,9]
这项工作的关键是能够将属性标记为“可枚举:false”,并将该属性标记为不应该被迭代的东西。
更多关于 Object.defineProperty 的信息: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty