正常数组与反向数组生成的比较

时间:2018-05-18 07:02:25

标签: javascript arrays typescript ecmascript-6 backticks

我正在通过两种方式创建一个数组。

  • 我的第一种方法是正常创建一个数组
  • 我的第二种方法是使用反引号函数
  • 创建一个数组

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生成的数组的内置函数。 为什么?两种方式之间有什么区别

2 个答案:

答案 0 :(得分:2)

createArrayByBakticks用作所谓的标记函数。传递给函数的第一个参数是一个包含模板文字的所有字符串的数组。

如果深入研究语言规范section 12.2.9.3,那么您将看到在创建数组后执行以下步骤:

  
      
  1. 执行SetIntegrityLevel(模板,"冻结")。
  2.   

这意味着在您的情况下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);