JavaScript参考手册
错误 | Errors
Errors: Non configurable array element
信息
TypeError: can't delete non-configurable array element (Firefox)
TypeError: Cannot delete property '2' of [object Array] (Chrome)
错误类型
TypeError
哪里出错了?
这个错误提示发生于当试图缩短一个数组的长度的时候,其中有元素是不可配置的(non-configurable)。正常情况下,缩短数组的长度,则超出限度的元素会被删除,而这里指的是这种操作失效的情况。
configurable
特性控制着属性是否可以从对象中删除,以及它的特性(除了 writable 之外)是否可以发生改变。
通常,使用数组初始化语句创建的对象是可配置的,而通过 Object.defineProperty()
创建的属性,默认则是不可配置的。
示例
通过 Object.defineProperty
创建的不可配置属性
使用Object.defineProperty()
且在没有明确将属性设定为可配置的情况下,默认可以创建不可配置属性。
var arr = [];
Object.defineProperty(arr, 0, {value: 0});
Object.defineProperty(arr, 1, {value: "1"});
arr.length = 1;
// TypeError: can't delete non-configurable array element
如果想要缩短数组长度的话,需要将其中的元素设置为可配置的。
var arr = [];
Object.defineProperty(arr, 0, {value: 0, configurable: true});
Object.defineProperty(arr, 1, {value: "1", configurable: true});
arr.length = 1;
密封的数组
Object.seal()
函数会将数组中现存的所有元素标记为不可配置。
var arr = [1,2,3];
Object.seal(arr);
arr.length = 1;
// TypeError: can't delete non-configurable array element
(为了解决上述问题,)或者是移除Object.seal()
调用,或者将数组拷贝一份。在拷贝数组的情况下,缩短备份数组的长度并不会修改原始数组的长度。
var arr = [1,2,3];
Object.seal(arr);
// Copy the initial array to shorten the copy
var copy = Array.from(arr);
copy.length = 1;
// arr.length == 3
错误 | Errors相关
JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络