我意识到我不知道为什么它有意义delete
分配未定义而不是删除。
事实并非如此。delete
从对象中删除属性,确实如此not将它们设置为undefined
。这是一个简单的方法:
var a = ['a', 'b', 'c'];
console.log(1 in a); // logs "true"
delete a[1];
console.log(1 in a); // logs "false"
请注意,之后delete
, a
没有名为的属性1
不再了。完全没有。
对比:
var a = ['a', 'b', 'c'];
console.log(1 in a); // logs "true"
a[1] = undefined;
console.log(1 in a); // logs "true"
There, a
还有一个属性叫1
,只是该财产的价值是undefined.
理解 JavaScript 中的这一点很有用:数组根本不是真正的数组 http://blog.niftysnippets.org/2011/01/myth-of-arrays.html。它们只是对象,数组“索引”只是属性名称(它们是字符串 - 是的,实际上,我们只是倾向于将它们写为数字),数组对全数字(索引)的属性名称有特殊处理,一个特殊的属性名称。length
属性,以及它们从中获得的一些函数Array.prototype
。这在第15.4节 http://es5.github.com/#x15.4规格的。一旦你牢牢记住 JavaScript 数组并不是真正的数组,它们就更有意义了。 :-)
从数组中删除数组“索引”属性不会改变其length
(即使删除编号最大的那个也不会);它只是在数组中创建了一个洞(JavaScript“数组”本质上是稀疏数组;例如,它们可以有间隙)。因此,在上面的第一个示例中,我得到的数组与执行此操作时得到的数组完全相同:
var a = [];
a[0] = 'a';
a[2] = 'c';
注意间隙,数组没有1
元素/属性。
如果你说:
var foo = a[3];
...foo
可以得到值undefined
出于两个完全不同的原因:
-
a
有一个属性叫做3
具有价值的undefined
, or:
-
a
没有名为3
根本没有;对不具有该名称属性的对象执行属性访问器操作的结果是undefined
。这个如果-无-财产-回报-undefined
规范以相当复杂的方式涵盖了这些内容,但主要是在第8.12.3节 http://es5.github.com/#x8.12.3.
这些是非常不同的事情。