## 错误提示

    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

## 相关内容

- [[Configurable]]
- `Array.length`
- `Object.defineProperty()`
- `Object.seal()`