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 code
i(顺便说一句,由于在
items
中没有
“undefined”
键,因此计算结果为
false
,但这并不重要),以及条件
i++
,并且没有更新代码。然而,
i++
的计算结果是falsy
NaN
,因此循环将立即中断。如果没有第二个分号,它甚至可以作为语法错误

相反,您需要一个:

顺便说一句,
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];
}