将对象分配给临时变量

4
如果您创建如下对象:
building[45] = new Object();        
building[45].name = myName; 
building[45].price = parseInt(myPrice);

building[128] = new Object();       
building[128].name = myName;    
building[128].price = parseInt(myPrice);

现在如果我想在一个函数中使用 building[128],是不是最好先将其分配给一个临时变量,以便浏览器不必遍历所有对象来查找 building[128] 属性?

例子:

var theID = 128;
var temp = building[theID]; //temp.name & temp.price

或者直接使用building[theID].namebuilding[theID].price吗?

它们的查找方式有什么区别吗?


没有区别 - theshadowmonkey
@theshadowmonkey,你能为此提供支持吗?(我也很好奇,但想要某种证明) - Alfred Xing
我想了解有关数据在内存中如何查找的技术信息。 - Sir
始终使用parseInt(whatev, 10)。太多愚蠢的错误发生在缺少第二个参数的情况下。我真希望它是必需的。 - Joe Frambach
@ Dave,在你的程序中,有没有办法获取数字128?如果可以,访问它使用building [theId]或使用temp是一样的。我认为我的回答涉及完全不同的事情。移除它 :) - theshadowmonkey
不,它不是已知的,它基于用户选择。 - Sir
2个回答

4

数组访问是一个常数时间操作(在大O符号中,这是O(1))。换句话说,在访问building[128]之前,浏览器不需要迭代127个条目。

尽管如此,我仍然建议将数组项存储在变量中。这样做的主要原因是JavaScript缩小程序将能够将变量重命名为像a这样的简短名称,以便属性访问为a.name等。这样可以节省一些字节,在更大的范围内,总字节节省是显着的。

JavaScript数组是JavaScript对象的一种专门形式,而数组索引实际上只是整数作为属性名称。 JavaScript权威指南,David Flanagan

使用Flanagan对数组的定义,每次通过索引访问数组项时,实际上启动了一个两步过程:访问数组对象,然后按属性名称(索引)查找值。通过将数组项保存在变量中,访问它就像查看内存中的值一样简单。


那么 building[128] 就像临时变量一样是一个指针吗? - Sir
我不同意第一部分的观点,因为迭代数组也是O(1)。 - theshadowmonkey
1
@theshadowmonkey 嗯...不,迭代数组几乎就是O(N)的定义。 - Ben McCormick
@ben336 抱歉有点困惑。我想知道时间复杂度是否很重要,因为即使将值分配给临时变量,该值也会被迭代。 - theshadowmonkey
Dave,为了回答你的指针问题,我添加了有关数组访问方式的额外信息。@theshadowmonkey,我提到复杂度只是因为OP对数组访问方式做出了错误的假设。所以简短的答案是,这并不重要,因为两种方法在时间复杂度上实际上是等效的。 - Rick Viscomi

0

或者,你可以这样构建:

building[45] = {
    name: myName,
    price: parseInt(myPrice, 10)
};

building[128] = {
    name: myName,
    price: parseInt(myPrice, 10)
};

编辑:哦,我发现你的问题与我的理解不同。抱歉。我将保留这个答案,因为它可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接