Сравнение между обычным массивом и сгенерированным обратным тиковым массивом - PullRequest
0 голосов
/ 18 мая 2018

Я создаю массив двумя способами.

  • мой первый способ - создание массива нормально
  • мой второй способ - создание массива с помощью функции обратных ссылок

let array=["1234"];

function createArrayByBakticks(obj)
{
return obj;
}

let backtickArray = createArrayByBakticks `1234`;// it's responding an array

console.log(array); //1st way and it returns an array 
console.log(backtickArray ); //2nd way and it returns a same array 

backtickArray.push(1);// but it's throwing an error while push a new value. 

// Error: Uncaught TypeError: Cannot add property 1, object is not extensible


console.log(backtickArray);

Выше оба способа возвращаются в виде данных массива. Но второй массив не поддерживает встроенную функцию массива, которая генерируется обратными галочками. ПОЧЕМУ?И в чем разница в обоих направлениях ?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

createArrayByBakticks используется в качестве так называемой функции тега.Первым аргументом, переданным функции, является массив, содержащий все строки литерала шаблона.

Если вы углубитесь в спецификацию языка, раздел 12.2.9.3 , тогда вы увидите следующеешаг выполняется после создания массива:

Выполнить SetIntegrityLevel (шаблон, «заморожено»).

Это означает, что в вашем случае obj заморожено и никакие свойства не могут быть добавлены.Вот почему вызов push не работает.

Вы можете подтвердить это, позвонив console.log(Object.isFrozen(backtickArray)).

0 голосов
/ 18 мая 2018

Массив возвращается из функции по значению , что означает, что он неизменен.

Если вы используете concat, вы получите его новую копию, которую вы можете изменить:

let array = ["1234"];

function createArrayByBakticks(obj) {
  return obj;
}

let backtickArray = createArrayByBakticks `1234`; // it's responding an array

console.log(array); //1st way and it returns an array 
console.log(backtickArray); //2nd way and it returns a same array 

let newArray = backtickArray.concat(1); // a new mutable array is generated
newArray.push(2);                       // so you can even keep modifying it
console.log(newArray);
...