我正在通过两种方式创建一个数组。
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);
以上两种方式都作为数组数据返回。 但第二个数组不支持由back-ticks生成的数组的内置函数。 为什么?两种方式之间有什么区别 ?
答案 0 :(得分:2)
createArrayByBakticks
用作所谓的标记函数。传递给函数的第一个参数是一个包含模板文字的所有字符串的数组。
如果深入研究语言规范section 12.2.9.3,那么您将看到在创建数组后执行以下步骤:
- 执行SetIntegrityLevel(模板,"冻结")。
醇>
这意味着在您的情况下obj
被冻结,并且不能添加任何属性。这就是为什么调用push
无效。
您可以致电console.log(Object.isFrozen(backtickArray))
确认。
答案 1 :(得分:1)
数组从函数返回值,这意味着它是不可变的。
如果你使用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);