Javascript 如何从散列中删除所有元素并保留引用
我需要删除散列/对象中的所有内容并保留引用。 这里有一个例子Javascript 如何从散列中删除所有元素并保留引用,javascript,Javascript,我需要删除散列/对象中的所有内容并保留引用。 这里有一个例子 var x = { items: { a: 1, b: 2} } removeItems(x.items) ; console.log(x.items.clean) ; function removeItems(items) { var i ; for( i in items; i++ ) { delete items[i] ; } items.clean = true ; } 我
var x = { items: { a: 1, b: 2} }
removeItems(x.items) ;
console.log(x.items.clean) ;
function removeItems(items) {
var i ;
for( i in items; i++ ) {
delete items[i] ;
}
items.clean = true ;
}
我想知道是否有一个较短的方法来实现这一点。例如,可以按如下方式清理阵列
myArray.length = 0 ;
有什么建议吗?对不起,没有捷径了。但是,您的循环不应该有
i++
function removeItems(items) {
for(var i in items) {
delete items[i];
}
items.clean = true;
}
不过,重新构造代码并只执行
x.items={}
会更好。目前没有简单的方法可以做到这一点,但是ECMAScript委员会看到了这一需要,并且在下一版本JS的当前规范中有这一点
以下是另一种解决方案,使用:
因此,您可以在当前浏览器中使用它。这不起作用:
var i ;
for( i in items; i++; ) {
delete items[i] ;
}
它使用items中的init codei(顺便说一句,由于在items
中没有“undefined”
键,因此计算结果为false
,但这并不重要),以及条件i++
,并且没有更新代码。然而,i++
的计算结果是falsyNaN
,因此循环将立即中断。如果没有第二个分号,它甚至可以作为语法错误
相反,您需要一个:
顺便说一句,items.clean=true
将再次创建一个新属性,使对象不会真正“干净”:-)
我想知道是否有一个较短的方法来实现这一点。例如,可以按如下方式清理阵列
myArray.length = 0 ;
不。你必须循环所有属性并删除它们。你代码中的i++
是无用的。我认为没有捷径可走。你为什么要“保留引用”?这到底意味着什么?@Alnitak我想(但我可能错了)该OP将对x.items的引用传递到其他位置,并且不想更改对象,只需将其清空即可。但是对于他的问题,可能有更好的解决方案,比如传递一个封闭的对象。当你知道对象来自何处时,你就不必使用hasOwnProperty,但你永远不知道什么时候加载的其他东西可能会增加对象原型,使其不可枚举。这太过分了。如果你使用一个愚蠢的库,你可能会有很多其他随机的东西被破坏。此外,delete
ing一个继承的属性是不可操作的。除此之外,使用Object.prototype.hasOwnProperty.call
显然是过火了。+1用于解释op的代码为什么不工作,以及for和for..在循环中的区别。
for (var i in items) {
delete items[i];
}