【问题标题】:Comparison between normal array vs generated by back-tick array普通数组与反引号数组生成的比较
【发布时间】:2018-10-28 13:20:25
【问题描述】:

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

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

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);

以上两种方式都作为数组数据返回。 但是第二个数组不支持由反引号生成的数组的内置函数。 为什么?两种方式有什么区别

【问题讨论】:

  • var let 是什么?
  • @MihaiAlexandru-Ionut 哎呀。输入问题并立即编辑
  • @RameshRajendran 你的代码仍然有错误
  • @Weedoze 我更新了我的 sn-p。谢谢队友:)
  • 你的backticksArray 仍然拼错了...

标签: javascript arrays typescript ecmascript-6 backticks


【解决方案1】:

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

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

  1. 执行 SetIntegrityLevel(template, "frozen")。

这意味着在您的情况下obj被冻结并且不能添加任何属性。这就是为什么调用 push 不起作用的原因。

您可以致电console.log(Object.isFrozen(backtickArray)) 确认。

【讨论】:

  • 谢谢,很好的回答
【解决方案2】:

数组从函数按值返回,表示它是不可变的。

如果您使用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);

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2012-04-18
    相关资源
    最近更新 更多