- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据本文5.2.1节:Optimization killers
这样做会关闭 V8 中的优化:
function hashTableIteration() {
var hashTable = {"-": 3};
for(var key in hashTable);
}
作者说:
例如,当您动态添加太多属性(在构造函数之外)、删除属性、使用不能作为有效标识符的属性等时,对象将进入哈希表模式。换句话说,当你使用一个对象时,就好像它是一个散列表,它会变成一个哈希表。将这样的对象传递给 for-in 是不行的。当在 Node.JS 中启用标志 --allow-natives-syntax 时,您可以通过调用 console.log(%HasFastProperties(obj))
来判断对象是否处于哈希表模式。
我的问题是,在 javascript 中迭代类似哈希表的对象的键的正确方法是什么,这样优化就不会被关闭?
最佳答案
看起来答案就在同一篇文章的底部。
Workaround: Always use Object.keys and iterate over the array with for loop. If you truly need all properties from entire prototype chain, make an isolated helper function:
function inheritedKeys(obj) {
var ret = [];
for(var key in obj) {
ret.push(key);
}
return ret;
}
If you pass a object to for-in that is not a simple enumerable it will punish the entire containing function.
据我了解,隔离功能有助于优化流程的其余部分。在下面的示例中,只有 inheritedkeys
函数不会被优化。
function someFunction(someObj) {
var keys = inheritedKeys(someObj),
i = 0,
len = keys.length;
for (; i < len; i++) {
//some computation
}
}
关于javascript - 遍历 javascript HashTable 而不会导致优化损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414809/
我是一名优秀的程序员,十分优秀!