普通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
相关产品推荐
相关产品推荐

