You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

普通Array与反引号生成Array的差异及报错原因解析

反引号调用函数创建的数组无法扩展?原因及核心差异解析

先抓你代码里的关键细节:当你用模板字面量的标签函数语法(也就是反引号调用函数的方式)传递1234时,函数接收到的参数并不是你以为的单个字符串,而是一个不可扩展的数组!

一、报错原因:引擎生成的不可扩展数组

当你调用createArrayByBakticks1234``时,JavaScript引擎会自动把模板字面量的静态内容包装成一个数组,作为第一个参数传给标签函数——而且这个数组是被默认设置为不可扩展的原生数组。

你可以加一行代码验证这个特性:

console.log(Object.isExtensible(backtickArray)); // 输出 false

因为数组不可扩展,所以你调用push方法试图添加新元素时,就会触发Cannot add property 1, object is not extensible的错误——这是JS对不可扩展对象的内置保护机制。

二、两种创建方式的核心差异

1. 常规方式创建的数组

  • 是可扩展的普通数组实例,你可以自由调用push、pop、splice等方法修改它,也能随意添加新属性。
  • 数组的可扩展性完全由你控制,除非手动调用Object.freeze()、Object.seal()等方法修改。

2. 标签函数接收的数组

  • 是JavaScript引擎自动生成的不可扩展数组,专门用于传递模板字面量的静态内容片段。
  • 这个数组的设计目的只是作为参数传递静态内容,不允许被修改,所以引擎默认把它锁死了不可扩展的状态。
  • 额外注意:这个数组还附带了一个raw属性(同样不可扩展),用于获取原始的未转义字符串。

补充:让标签函数返回可扩展数组的方法

如果想通过标签函数得到能修改的数组,你可以手动复制一份新数组:

function createArrayByBakticks(obj) {
  // 用展开运算符复制出一个可扩展的新数组
  return [...obj];
}
let backtickArray = createArrayByBakticks`1234`;
backtickArray.push(1); // 现在不会报错了!
console.log(backtickArray); // 输出 ["1234", 1]

内容的提问来源于stack exchange,提问作者Ramesh Rajendran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:21:50