TypeError: can't delete non-configurable array element - JavaScript 编辑

错误提示

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

相关内容

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

词条统计

浏览:97 次

字数:4389

最后编辑:7 年前

编辑次数:0 次

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文