我喜欢这个问题 - Legitimate uses of the Function constructor - 所以我想提出一个关于 Array
构造函数的类似问题。
当然,数组字面量表示法才是创建数组的正确方法。这意味着不应使用 new Array
表示法。和“结案”。
但是,new Array
形式有一个特殊性。如果传入自然数,则会创建一个空数组,并将其 length
属性设置为该数字。
所以
arr = new Array( 7 );
相当于
arr = [];
arr.length = 7;
这可以被认为是一个特性。我想知道这个“功能”是否有实际用途。我最近偶然发现了这样一种(简单的)用法:
new Array( n + 1 ).join( '*' ) // returns string containing n stars
// e.g.
new Array( 3 ).join( '*' ) // returns '**'
new Array( 6 ).join( '*' ) // returns '*****'
这很酷,但希望有一些更高级的用途。 (这将使 new Array
符号成为 JavaScript 程序中的合法工具。)
更新:我注意到 jQuery 库在一个实例中使用了 new Array( len )
表示法 - 它在 when
中函数(搜索 "when:"
):
when: function( firstParam ) {
var args = sliceDeferred.call( arguments, 0 ),
i = 0,
length = args.length,
pValues = new Array( length ),
count = length,
pCount = length,
// etc.
他们用它来初始化 pValues
局部变量,该变量在代码后面的局部函数中使用:
function progressFunc( i ) {
return function( value ) {
pValues[ i ] = arguments.length > 1 ?
sliceDeferred.call( arguments, 0 ) : value;
deferred.notifyWith( promise, pValues );
};
}
我很想知道是否将作业更改为 just
pValues = [],
会破坏程序...(notifyWith
是否需要 new Array( length )
才能正常工作?)
最佳答案
我不知道这是否重要,但您会使用构造函数的一种情况是,如果您需要确保拥有干净、未修改的 Array 构造函数。您可以创建一个“iframe 沙箱”
var iframe = document.createElement("iframe");
iframe.style.display = "none";
document.body.appendChild(iframe);
var Safe = frames[frames.length - 1];
然后像这样创建数组...
var things = new Safe.Array('x', 'y', 'z');
...知道您的数组在原型(prototype)中不会有其他脚本放置的任何外来内容。
不过,这并没有利用单参数作为数组长度的特性。唯一真正有用的可能是设置巨大的数组来进行基准测试。
关于javascript - Array 构造函数的合法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8453048/