1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
---
title: 'TypeError: can''t delete non-configurable array element'
slug: Web/JavaScript/Reference/Errors/Non_configurable_array_element
tags:
- JavaScript
- 错误提示
translation_of: Web/JavaScript/Reference/Errors/Non_configurable_array_element
---
<div>{{jsSidebar("Errors")}}</div>
<h2 id="错误提示">错误提示</h2>
<pre class="syntaxbox">TypeError: can't delete non-configurable array element (Firefox)
TypeError: Cannot delete property '2' of [object Array] (Chrome)
</pre>
<h2 id="错误类型">错误类型</h2>
<p>{{jsxref("TypeError")}}</p>
<h2 id="哪里出错了?">哪里出错了?</h2>
<p>这个错误提示发生于当试图<a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length#Shortening_an_array">缩短一个数组的长度</a>的时候,其中有元素是不可配置的(<a href="/en-US/docs/Web/JavaScript/Data_structures#Properties">non-configurable</a>)。正常情况下,缩短数组的长度,则超出限度的元素会被删除,而这里指的是这种操作失效的情况。</p>
<p><code>configurable</code> 特性控制着属性是否可以从对象中删除,以及它的特性(除了 writable 之外)是否可以发生改变。</p>
<p>通常,使用<a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Syntax">数组初始化语句</a>创建的对象是可配置的,而通过 {{jsxref("Object.defineProperty()")}} 创建的属性,默认则是不可配置的。</p>
<h2 id="示例">示例</h2>
<h3 id="通过_Object.defineProperty_创建的不可配置属性"><code>通过 Object.defineProperty 创建的不可配置属性</code></h3>
<p>使用 {{jsxref("Object.defineProperty()")}} 且在没有明确将属性设定为可配置的情况下,默认可以创建不可配置属性。</p>
<pre class="brush: js example-bad">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
</pre>
<p>如果想要缩短数组长度的话,需要将其中的元素设置为可配置的。</p>
<pre class="brush: js example-good">var arr = [];
Object.defineProperty(arr, 0, {value: 0, configurable: true});
Object.defineProperty(arr, 1, {value: "1", configurable: true});
arr.length = 1;
</pre>
<h3 id="密封的数组"><code>密封的数组</code></h3>
<p> {{jsxref("Object.seal()")}} 函数会将数组中现存的所有元素标记为不可配置。</p>
<pre class="brush: js example-bad">var arr = [1,2,3];
Object.seal(arr);
arr.length = 1;
// TypeError: can't delete non-configurable array element
</pre>
<p>(为了解决上述问题,)或者是移除 {{jsxref("Object.seal()")}} 调用,或者将数组拷贝一份。在拷贝数组的情况下,缩短备份数组的长度并不会修改原始数组的长度。</p>
<pre class="brush: js example-good">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
</pre>
<h2 id="相关内容">相关内容</h2>
<ul>
<li><a href="/en-US/docs/Web/JavaScript/Data_structures#Properties">[[Configurable]]</a></li>
<li>{{jsxref("Array.length")}}</li>
<li>{{jsxref("Object.defineProperty()")}}</li>
<li>{{jsxref("Object.seal()")}}</li>
</ul>
|