【问题标题】:[].splice.apply or [].splice.push etc [duplicate][].splice.apply or [].splice.push etc [duplicate]
【发布时间】:2016-11-01 10:32:08
【问题描述】:

在过去的几天里,我一直在研究一些数组方法,并且看到了像 [].splice.apply[].push.apply 这样的带有一些参数的东西。

现在我想我理解例如拼接

var tuna = ['bob', 'john' , 'papa' , 'greg'];
var newArr = []
tuna.splice(0,2,"hello");
console.log(tuna);

将输出hello,papa,greg,因为它删除了第 0 个索引中的 2 个术语。

我也知道 apply 在以下情况下是如何工作的

var person = {
    firstname: 'John',
    lastname: 'Doe',
    getFullName: function() {

        var fullname = this.firstname + ' ' + this.lastname;
        return fullname;

    }
}

var logName = function(lang1, lang2) {

    console.log('Logged: ' + this.getFullName());
    console.log('Arguments: ' + lang1 + ' ' + lang2);
    console.log('-----------');

}
var logPersonName = logName.bind(person);
logPersonName('en');
logName.call(person, 'en', 'es');
logName.apply(person, ['en', 'es']);

那么当我们结合这两种方法,或者使用 apply 推送时会发生什么?一个简单的例子会很有帮助。

【问题讨论】:

  • [].splice.push 没有意义。 [].splice.apply 确实如此,因为“应用”是函数原型上的函数名称。现在,出于类似的原因,[].push.apply 是有道理的。
  • 是的,很抱歉,出于某种原因,我不假思索地输入了它。感谢指正

标签: javascript


【解决方案1】:

你可能看到的是:

var foo = Array.prototype.slice.apply(arguments)

这采用Arrayslice 方法,即slice 的规范实现,并在类数组 对象上使用它,并返回一个数组。这是将 array-like 对象转换为实际数组的简写。纯粹使用它是因为它是实现这一目标的最短、最方便的方法。 slice 碰巧在任何类似数组的对象上工作并返回一个实际的数组,当不使用它的任何附加参数时,它不会对数组做任何其他事情;这就是为什么为此目的使用它很方便。这确实是在滥用 slice 方法的目的不是为了它的设计目的,但因为它在任何地方都可以工作......好吧,我们在这里使用它。

例子:

var o = {};
o[0] = 'foo';
o[1] = 'bar';
o.length = 2;

这是一个类数组对象,但它没有任何实际的数组方法。我不能做o.push('baz'),因为o 不是一个实际的数组。把它变成一个实际的数组,我会使用上面的方法,然后可以把它当作一个实际的数组来对待。

【讨论】:

  • 谢谢,你有使用 .splice.apply 的例子吗?
  • 这不是我所知道的典型用途,但我确信在某些情况下它很方便。想出你自己虚构的场景。
  • 顺便说一句,您在这里解释“应用”的方式与我制作的示例不同吗?我只是学会在那种情况下使用它
  • 这并没有根本不同,不。要理解的关键部分是函数和对象非常松散地绑定在一起。即使在对象上定义了一个函数(通常称为“方法”),您也可以获取该函数并将其应用于您想要的任何其他内容,它不必是那个原始对象。这一切都是在调用时间而不是定义时间决定的。 apply 是实现此目的的一种方法,即使用现有函数,无论它来自何处,并且,应用它到其他东西。
猜你喜欢
  • 2019-09-13
  • 2022-12-02
  • 2022-12-01
  • 2022-12-15
  • 1970-01-01
  • 2012-06-02
  • 2021-11-24
  • 2022-12-01
相关资源
最近更新 更多