Почему я продолжаю получать массив внутри массива при использовании push ()? - PullRequest
5 голосов
/ 20 апреля 2019

Я пытаюсь понять документацию MDN по .push () и .apply () , потому что у меня возникла проблема, когда я оказался в массиве внутри массива в проекте. Я создал экспериментальный код, чтобы проиллюстрировать мою проблему.

Может кто-нибудь объяснить, почему содержимое массива внутри foo() печатается внутри другого массива? Я не понимаю, почему он не печатает один массив для обоих экземпляров console.log().

var animals = [];
var chickens = 'chickens';
var cows = 'cows';

animals.push(cows);
animals.push(chickens);

console.log(animals); // > Array ["cows", "chickens"]

function foo(...animals) {
  console.log(animals); // > Array [["cows", "chickens"]] <-- why is this one inside another array?
}; 

Я думал, что использование .apply() решит проблему, но я не смог заставить ее работать. Например ...

animals.push.apply(animals, cows);
animals.push.apply(animals, chickens);

// Error: second argument to Function.prototype.apply must be an array

Ответы [ 2 ]

5 голосов
/ 20 апреля 2019

Поскольку ... (синтаксис отдыха / распространения) создает новый массив из переданных аргументов - поэтому создание массива из ["chickens", "cows"] приведет к [["chickens", "cows"]].Решите это, удалив ... in foo.

var animals = [];
var chickens = 'chickens';
var cows = 'cows';

animals.push(cows);
animals.push(chickens);

console.log(animals); 

function foo(animals) {
  console.log(animals); 
}; 

foo(animals);
.as-console-wrapper { max-height: 100% !important; top: auto; }
3 голосов
/ 20 апреля 2019

Читать об этом -> Параметры покоя

// "Rest parameters" receives the arguments which is 
// a like array object, and uses its indexes for creating an array.
function fn(...params) {
  console.log(params);
} 

fn("Ele", "From", "Stack"); // Multiple params will be spread as indexes of the array.
fn(["Ele", "From", "Stack"]); // In this case, one param (an array) will be used as the only index in the array.
fn(); // In this case, an empty array will be generated.
.as-console-wrapper { max-height: 100% !important; top: 0; }

С другой стороны, функция apply, второй параметр должен быть массивом, который отображает аргументы

Array.push.apply(animals, [cows, chickens]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...