【发布时间】:2014-04-29 03:25:28
【问题描述】:
修改Array.push() 以返回推送的对象而不是新数组的长度可能是一个坏主意,是否有任何实质性的原因?
我不知道这是否已经被提议或询问过;谷歌搜索只返回了无数与Array.push() 的当前功能相关的问题。
这是此功能的示例实现,请随时更正:
;(function() {
var _push = Array.prototype.push;
Array.prototype.push = function() {
return this[_push.apply(this, arguments) - 1];
}
}());
然后你就可以做这样的事情了:
var someArray = [],
value = "hello world";
function someFunction(value, obj) {
obj["someKey"] = value;
}
someFunction(value, someArray.push({}));
例如someFunction修改作为第二个参数传入的对象。现在someArray的内容是[{"someKey": "hello world"}]。
这种方法有什么缺点吗?
【问题讨论】:
-
首先,改变内置对象的行为是个坏主意,因为它会破坏现有代码。其次,您将更改
Array.prototype.push,而不是Array.push。此外,如果您需要使用array[array.length - 1]获取刚刚推送到数组中的元素,或者您可以在使用.push()之前将其存储在中间局部变量中,则始终可以获取它。坏主意。 -
仅供参考,您还破坏了
.push()可以接受多个参数的语义。 -
感谢您的收获。是的,我知道我可以获得最新的对象;事实上,我可以用一个班轮做到这一点:
array[array.push(val) - 1]。我想这个“想法”是不必要的,但如果没有外部视角,我真的不明白为什么。我想,橡胶闪避之类的。哦,还有固定的语义。 -
另外,如果您想发表您的评论作为答案,我会接受,因为您在 Bergi 之前做出了回应。否则,我会接受他的回答。
-
@RobG - 如果前面的语句没有正确地以分号结尾,那么作为 IIFE 的内容可能看起来像是调用函数的开始并导致意外错误甚至更糟糕的是,错误的执行。这实际上发生在我处理别人的代码时,他们的键盘上似乎有一个坏掉的分号键。
标签: javascript arrays