arr.push(Math.random());
和
arr[arr.length]=Math.random();
有相同的结果。
那么,它们之间的区别是什么?换句话说,什么时候使用前者比后者更好?
答案 0 :(得分:5)
他们之间的区别是什么
看the specification并考虑一下,至少有六个:
push(...)
是方法调用,另一个是赋值。push
添加多个元素:arr.push(one, two, three)
。要通过分配执行此操作,您需要多个分配。 (push
在完成所有工作之前也不会更新length
,而自然会有多个分配为每个分配更新它。)push
检查数组的长度是否会变为> 2 53 -1,如果是,则抛出TypeError
;赋值没有,它只是愉快地创建一个名称不是数组索引的属性。 (这是一个有趣的检查,考虑到array indexes are only allowed to be up to 232-1。但是规范在 lot 中与数组长度有关。)arr.push(...)
在push
上查找了arr
,因此可以截取(通过将新的push
分配给arr
或Array.prototype
)。该分配只能在每个属性的基础上截取(使用"0"
,"1"
等的设置器)或Proxy
。set
陷阱的阵列,而不是直接使用该数组,则可能会发现不同的set
次呼叫(因为set
} trap可能会直接在底层数组上设置值,因此您不会看到set
的{{1}}。length
的结果是数组的新长度; arr.push(value)
的结果是推送值。换句话说,什么时候使用前者比后者更好?
完全取决于你。由于arr[arr.lenght] = value
是一个方法调用,最终最终完成了分配所做的相同事情(有更多的开销,例如push
检查),然后理论上 on某些引擎或至少在某些情况下,它可能比直接赋值慢最小位;但是,你的直接任务有查找length
的开销。在实践中,在现代发动机上,我认为没有显着差异; test here,无论如何,任何差异都不太可能在现实世界中起作用。除此之外,上面的#2-#6,它是一种风格选择。
#5的示例(仅适用于支持ES2015 arr.length
的JavaScript引擎):
Proxy

答案 1 :(得分:2)
除T.J.克劳德在现实生活中详细解答了我对一个或另一个的使用取决于一个且唯一的因素。这是我将项目推送到数组时所期望的返回值。
arr.push(item)
返回数组的新长度。arr[arr.length] = item
会返回推送项目。arr.concat(item)
返回一个包含推送项目的新数组。(arr.push(item),arr)
返回新推送的数组
项目在功能编程中,他们都有自己的用例。但是特别是后两者可能会给你的代码带来巨大的差异和意外的错误,如果你不小心,因为在JS数组中是引用类型。
哦,顺便说一句,因为你问过,不像旧书中提到的那样,前两个对性能没有任何影响,即使微观表现明显也没有区别。他们都非常快。