使用更详细的方法: new Array() 在参数中有一个额外的选项:如果您将一个数字传递给构造函数,您将得到一个具有该长度的数组:
x = new Array(5);
alert(x.length); // 5
为了说明创建数组的不同方法:
var a = [], // these are the same
b = new Array(), // a and b are arrays with length 0
c = ['foo', 'bar'], // these are the same
d = new Array('foo', 'bar'), // c and d are arrays with 2 strings
// these are different:
e = [3] // e.length == 1, e[0] == 3
f = new Array(3), // f.length == 3, f[0] == undefined
;
function Array() {
this.is = 'SPARTA';
}
var a = new Array();
var b = [];
alert(a.is); // => 'SPARTA'
alert(b.is); // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)
15 回答
有关详细信息,the following page描述了为什么您永远不需要使用
new Array()
另请查看注释 -
new Array(length)
表单没有任何用处(至少在今天的JavaScript实现中) .我使用[]引起了一种奇怪的行为 .
我们有模型“类”,字段初始化为某个值 . 例如 . :
我发现当用
[]
初始化字段时,它将由所有Model对象共享 . 对一个进行更改会影响所有其他人 .这不会发生在
new Array()
初始化它们 . 对象的初始化相同({}
vs newObject()
)TBH我不确定它是否与我们使用的框架有关(Dojo)
存在差异,但该示例没有区别 .
使用更详细的方法:
new Array()
在参数中有一个额外的选项:如果您将一个数字传递给构造函数,您将得到一个具有该长度的数组:为了说明创建数组的不同方法:
使用的区别
要么
正如在这个问题中讨论得足够多 .
我想添加速度问题 - current 最快的方式,
google chrome
是第二个 .但请注意,这些事情往往会随着更新而发生很大变化 . 此外,不同浏览器的运行时间也不同 .
例如 - 我提到的第二个选项,在
chrome
上以200万[ops / second]运行,但是如果你在mozilla dev.
上尝试它,你将获得惊人的2300万的更高比率 .无论如何,我建议你每隔一段时间,在不同的浏览器(和机器)上查看它,使用网站as such
为了更好地理解
[]
和new Array()
:以上结果来自Windows 7上的Google Chrome控制台 .
第一个是默认对象构造函数调用 . 如果需要,您可以使用它的参数 .
第二个使您能够创建非空数组:
据我所知,差异你可以找到切片(或数组的其他功能),如 code1 . 和 code2 show u Array和他的实例:
code1:
code2:
conclusion:
你可以看到
[]
和new Array()
创建一个新的Array实例 . 他们都从Array.prototype
获取原型函数它们只是Array的不同实例 . 这解释了为什么
[] != []
:)
我发现这两个结构之间有一点不同,这让我非常努力 .
假设我有:
在现实生活中,如果我这样做:
我最终得到的是:
我不知道语言规范应该发生什么,但如果我希望我的两个对象在我的对象中有唯一的属性数组,我必须使用
new Array()
.我可以从更具体的方式开始解释,这个例子基于Fredrik的好例子 .
我刚刚为数组添加了另一个值,并发出了四个警告:第一个和第二个是给我们存储在每个数组中的值,以确保值 . 他们将返回相同的!现在尝试第三个,它返回false,那是因为
第一个区别是当我们调用test1时它不假思索地调用变量,它只返回存储在这个变量中的值而忽略它的数据类型!但是,当我们调用test2时,它调用Array()函数然后将"Pushed"值存储在其"Value"属性中,当我们警告test2时,它会返回相同的情况,它返回数组对象的"Value"属性 .
因此,当我们检查test1是否等于test2时,它们永远不会返回true,一个是函数而另一个是变量(带有一种数组),即使它们具有相同的值!
为了确保这一点,请尝试第4个警报,并添加.value;它会回归真实 . 在这种情况下,我们告诉JS“忽略容器的类型,无论是功能还是变量,请比较存储在每个容器中的值并告诉我们你看到了什么!”这正是发生的事情 .
我希望我能清楚地说出这个想法,对不起我的英语不好 .
没有什么大不同,他们基本上做同样的事情,但以不同的方式做,但阅读,看看W3C的这个声明:
和
但与此同时,使用
new Array
语法创建新数组被认为是一种不好的做法:所以基本上不被认为是最佳实践,那里也有一个小的差异,你可以将长度传递给
new Array(length)
,这也不是推荐的方式 .第一个是默认对象构造函数调用 . 最常用于动态值 .
创建静态值时使用第二个数组
奇怪的是,
new Array(size)
几乎比Chrome中的[]
快2倍,在FF和IE中大致相同(通过创建和填充数组来衡量) . 只有了解阵列的大致尺寸才有意义 . 如果您添加的项目数量超过了您提供的项目数量,则会失去性能提升 .使用Array构造函数创建一个具有所需长度的新数组,并使用undefined填充每个索引,将指定的数组分配给变量one创建您为其提供信息的索引 .
使用隐式数组和数组构造函数创建数组之间的区别是微妙但重要的 .
使用时创建数组
您告诉解释器创建一个新的运行时数组 . 根本不需要额外的处理 . 完成 .
如果您使用:
你告诉解释器,我想调用构造函数“
Array
”并生成一个对象 . 然后它查找执行上下文以找到要调用的构造函数,并调用它,创建数组 .你可能会想“嗯,这根本不重要 . 它们是一样的!” . 不幸的是你无法保证 .
采用以下示例:
在上面的示例中,第一个调用将警告'SPARTA',因为您还注意到b包含所有本机Array对象函数,例如
push
,而另一个则不包含.455904_ .虽然您可能期望这种情况发生,但它只是说明
[]
与new Array()
不同 .如果你知道你只想要一个数组,那么最好只使用
[]
. 我也不建议四处走动并重新定义数组......没有人提到,存在巨大差异 .
您可能认为
new Array(2)
之前等同于[undefined, undefined]
因为我们有BUT IT'S NOT!
我们试试
map()
:看到?这不一样!但那是为什么呢?
根据ES6规范22.1.1.2,
Array(len)
仅创建一个新的数组,length
设置为len
,仅此而已 . 因此,新数组中没有真正的元素 .函数
map()
,根据规范22.1.3.15首先检查HasProperty
然后调用回调,但结果是:That's why you can not expect any iteration functions work as usual to array created from new Array(len) .
BTW,Safari和Firefox对此有更好的表达:
我已经向Chrome提交了一个问题,要求他们修复这个令人困惑的日志:https://bugs.chromium.org/p/chromium/issues/detail?id=732021
更新:它已经修好了 . Chrome现在登录为