【问题标题】:Using array.prototype.push vs array.push [duplicate]使用 array.prototype.push 与 array.push [重复]
【发布时间】:2015-10-27 15:02:20
【问题描述】:

我见过人们在javascript中使用两种不同的方式来使用Array对象的不同方法。

我主要是这样使用它的:

arr.push(element1, ..., elementN)

但我见过有人用这个:

Array.prototype.push.apply(this,arguments)

我了解所有 JavaScript 对象都从其原型继承属性和方法。 Object.prototype 位于原型链的顶端。

两种方法有什么区别?何时应使用每种方法?

【问题讨论】:

标签: javascript arrays prototype


【解决方案1】:

当您有兴趣将.push() 与并非真正数组的对象一起使用时,使用通过.apply() 的调用。例如,一个 jQuery 对象并不是一个真正的数组实例,但代码主要维护一个 .length 属性,足以使其看起来像一个数组,至少在 .push() 和其他 Array 原型方法相关。

对于一个真正的数组实例,没有必要这样做; .push() 方法可通过原型链直接使用。

所以:

var obj = { length: 0 };
Array.prototype.push.apply(obj, ["hello world"]);
console.log(obj[0]); // hello world

【讨论】:

  • 非常感谢您的回答。您能否提供更多解释或 array.prototype.push 在纯 JavaScript 场景中使用的示例。我目前远离 jQuery 我想先通过纯 javascript。我确实理解您所说的,但是一个非常简单的示例/场景将非常有帮助。再次非常感谢您。
  • @LorenzovonMatterhorn 您提供了在纯 JS 中使用它的示例。
  • @LorenzovonMatterhorn jQuery 只是 JavaScript,它只是一个示例。任何具有.length 整数值属性的对象都可以。
  • @DaveNewton 我希望有一个非常基本的、没有什么花哨的 jsFiddle 示例。我可以搞砸的东西。我可以看到它是如何工作的。
  • @LorenzovonMatterhorn 将您拥有的内容复制到 jsfiddle 中的函数中,然后使用参数调用该函数。
【解决方案2】:

我假设你在这样的函数中看到了Array.prototype.push.apply(this,arguments)

function foo() {
    arguments.push = function() {
       Array.prototype.push.apply(this,arguments);    
    } 
    arguments.push(1,2,3);
    //.... 
}

这里是foo的arguments,它只是一个类似数组的对象,不是数组,它没有push方法。所以我们应该使用Array.prototype.push.apply(this,arguments)

【讨论】:

  • 感谢您的回复。你能解释一下“像对象一样的数组”是什么意思吗?
  • arguments没有push方法也没关系?如果有的话,你认为如何重写这段代码?
  • @LorenzovonMatterhorn 类似数组的对象看起来像数组。它们有各种编号的元素和一个长度属性。但这就是相似之处停止的地方。类数组对象没有 Array 的任何函数,for-in 循环甚至不起作用!查看这些文章:nfriedly.com/techblog/2009/06/…
  • @bcpeee 但这不是正在发生的事情。 arguments 不是 push 方法应用到的对象。 this 是。
  • @basilikum 你是对的,所以在这种情况下,this 可能不是一个数组。对不起,我做了一个不好的例子,检查重复版本的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 2019-01-06
相关资源
最近更新 更多