【发布时间】:2012-09-14 09:50:35
【问题描述】:
我想出了
function keysToLowerCase (obj) {
var keys = Object.keys(obj);
var n = keys.length;
while (n--) {
var key = keys[n]; // "cache" it, for less lookups to the array
if (key !== key.toLowerCase()) { // might already be in its lower case version
obj[key.toLowerCase()] = obj[key] // swap the value to a new lower case key
delete obj[key] // delete the old key
}
}
return (obj);
}
但我不确定 v8 会如何处理它,例如,它真的会删除其他键还是只会删除引用而垃圾收集器稍后会咬我?
另外,我创建了these tests,我希望您可以在此处添加您的答案,以便我们可以看到它们是如何匹配的。
编辑 1: 显然,根据测试,如果我们不检查密钥是否已经是小写字母,它会更快,但除了更快之外,它会通过忽略这一点并创建新的小写密钥而造成更多混乱吗?垃圾收集器会对此感到满意吗?
【问题讨论】:
-
您可以创建一个新对象而不是修改现有对象吗?您可以跳过所有删除操作。
-
我认为你的代码是合理的。 “如果我们不检查密钥是否已经是小写,它会更快,但是...如果忽略它并创建新的小写密钥,它会不会造成更多混乱” - 该代码不会t 实际上可以工作(它最终会删除任何已经小写的键),所以它有多快并不重要......
-
@JasonOrendorff 显然速度较慢,并且每次都会创建一个不需要的对象,而垃圾收集器不会对此感到满意...
-
@JoãoPintoJerónimo 您在速度测试中看到的是代码在同一个对象上运行了数千次。当然,测试运行一次之后,就没有更多的工作要做了;所有的键都是小写的。如果您通过使用大量键创建大量对象来测试它:jsperf.com/object-keys-to-lower-case/7,那么所有三种实现都会显着变慢,但在 Firefox 和 Chrome 中创建新对象的速度稍快。
-
哦,我看到了@JasonOrendorff...我将再次修改测试
标签: javascript performance node.js object garbage-collection