Вопрос по arrays, javascript – .push () несколько объектов в массиве JavaScript возвращает «неопределенный»

18

Когда я добавляю элементы в массив beats, а затем console.log пользователя, я получаю правильное количество элементов в массиве. Но когда я проверяю длину, я всегда получаю 1. Попытка вызвать индекс всегда даст мне «неопределенный» вот так: Tom.beats[1] Я думаю, что упускаю что-то очевидное, но это меня побеждает. Я подозреваю, что неправильно использую.push метод, но я не уверен. Любая помощь с благодарностью! (с использованием инструментов Chrome Dev)

//The USER

function User(name, role){
    this.beats = [ ]; 

    this.name = name;
    this.role = role;

    // add beats to beats array

    this.addBeats = function(beats){ 
        return this.beats.push(beats);
   };

}

// Three New Instances. Three New Users.

var Mal = new User("Mal", "Rapper");
Mal.addBeats(["love", "cash"]);

var Dan = new User("Dan", "Producer");
Dan.addBeats(["cake", "dirt", "sally-mae"]);

var Tom = new User("Tom", "Producer");
Tom.addBeats(["Fun", "Little", "Samsung", "Turtle", "PC"]);

// Check for position in beats array

console.log(Tom.beats); 
console.log(Mal.beats); 
console.log(Dan.beats); 

console.log(Mal.beats[1]);
console.log(Dan.beats[1]);
console.log(Tom.beats[1]);
Интересно, еслиthis указатель запутывается в функции addBeats. Можете ли вы пройти через это в отладчике JS? (IE9 имеет один). Dai

Ваш Ответ

2   ответа
49

Array.push(...) принимает несколько аргументов для добавления в список. Если вы поместите их в сам массив, этот массив «превосходит» будет добавлен

Array.concat(...) скорее всего, не то, что вы ищете, потому что он генерирует новый массив вместо добавления к существующему.

Ты можешь использовать[].push.apply(Array, arg_list) добавить элементы списка аргументов:

this.addBeats = function(beats) { 
    return [].push.apply(this.beats, beats);
};
[].push будет создавать новый массив каждый раз, когда вызывается функция. Я думаю, это дешевле в использованииreturn this.beats.push.apply(this.beats, beats) вместо.
Примечание: год спустя мое утверждение больше не соответствует действительности.Array.prototype.push.apply примерно на 10% быстрее в Firefox v44 и Chrome v46.
Используя ваш метод, он работает так, как я намеревался сейчас. Спасибо! Итак, моя обратная линия была совершенно неверной ... MFrazier
@ Хорошо, что хорошо, что jsperf также рассказал о потреблении памяти. Дополнительная доля процентного выигрыша в производительности может быть компенсирована отложением сбора мусора на более поздний срок? (Такая оптимизация может объяснить, почему Gmail занимает больше оперативной памяти, чем моя Java IDE, если я оставляю ее вкладку открытой в течение нескольких дней ?!)
@AlexanderKachkaev, на самом деле, нет:jsperf.com/nil-push/2, С помощью[].someFunction.call, {}.someFunction.applyи т. д. - это шаблон, который по крайней мере Firefox и Chrome понимают и оптимизируют. С помощью[].push, вместоvariable.push или жеArray.prototype.push немного быстрее, так как не требует поиска имени переменной.
6
Spread operator

оператор распространения Теперь вы можете сделать следующее:

this.addBeats = function (beats) {
    return this.beats.push(...beats);
};

Или если вам нужно больше контроля для перезаписи и т. Д.

this.addBeats = function(beats) { 
    return this.beats.splice(this.beats.length, null, ...beats);
};

Похожие вопросы