var x = new Array() 有什么问题;

IT技术 javascript jslint
2021-01-20 09:39:38

在 JSLint 中,它警告说

var x = new Array();

(那不是真正的变量名)应该是

var result = [];

第一种语法有什么问题?建议背后的原因是什么?

5个回答

使用[]使用更安全new Array(),因为您实际上可以覆盖ArrayJavaScript 中的值

Array = function() { };

var x = new Array();
// x is now an Object instead of an Array.

换句话说,[]是明确的。

好点子!请注意,覆盖 Array 还会导致代码中出现严重问题,这些代码试图在类似数组的对象(例如参数)上使用 Array.prototype 方法......所以仍然是一个非常糟糕的主意。
2021-03-19 09:39:38
[] 将始终是一个 Array 对象。当我说“覆盖”时,我并不是暗示实际的 Array 类被覆盖。“Array”实际上是一个全局变量,因此可以分配一个新值 - 所以我正在重新分配变量“Array”引用的内容。Array 用于引用的内容仍然完好无损。(这也是为什么我还开玩笑说要覆盖 'undefined' 和 'NaN' - 它们也是可以以相同的扭曲方式操作的全局变量。)
2021-03-27 09:39:38
不要误会我的意思,我肯定不是在提倡覆盖数组。(好吧,除非你也覆盖 'undefined' 和 'NaN',只是为了与任何敢于使用你的代码的人搞砸。)
2021-04-08 09:39:38
不仅如此, Array() 构造函数还有一些“奇怪”的行为,这取决于你传递了多少参数。它通常很古怪,最好避免。
2021-04-09 09:39:38
如果覆盖 Array,var x = []; 会发生什么?那不是 Array 对象吗?
2021-04-10 09:39:38

克罗克福德不喜欢new因此,JSLint 希望您尽可能避免它并且可以在不使用new...的情况下创建新的数组对象。

但是,无需在声明时将数组初始化为特定大小。JavaScript 数组不像 C 数组。它们是对象,而不是静态大小的连续内存块。因此,您可以根据需要将值附加到数组中。事实上,在声明时初始化然后填充可能会更慢,因为在声明时,所有 n 键都必须被散列,然后当它们被分配值时,它们可能必须被重新散列。
2021-03-29 09:39:38
您可以将第 n 个元素设置为 undefined ,它或多或少会做同样的事情
2021-04-02 09:39:38
但是,当您尝试启动具有 n 个值的数组时,jslint 会中断。例如: var x = new Array(20); 这种创建方法并不经常使用,但它有它的情况,并且比使用循环来创建和填充数组要快得多。
2021-04-04 09:39:38

根据浏览器或环境的不同,您似乎可以获得不同的性能,具体取决于您使用的内容和用途:

http://jsperf.com/new-array-vs-literal/11 ( [1,.2] vs new Array(1,.2) ) 在这种情况下,文字速度更快。

http://jsperf.com/new-array-vs-literal/7 ( new Array(500000) vs [].length(500000) ) new Array 在 chrome v21 中速度更快,这个测试似乎提高了大约 7% 或 30 %) 取决于你做什么。

两种形式都没有错,但您通常会看到尽可能使用文字 -

变种S =“”不是正确大于变种S =新的String()....

第一种语法本身没有问题。事实上,在w3schools 上,它列出new Array()了创建数组的方式。问题是这是“老方法”。“新方法”[]更短,允许您初始化数组中的值,如["foo", "bar"]. 多数开发商宁愿[]new Array()在良好作风方面。

@AndrewAustin 是的。尽管在互联网上,作为一般经验法则,您应该仔细检查来源,无论您从何处获取信息。
2021-04-03 09:39:38
可能是因为 w3 学校与 w3.org 没有关联,而且它们的代码通常很差或不准确。
2021-04-13 09:39:38