我想在函数中声明多个变量:
function foo() {
var src_arr = new Array();
var caption_arr = new Array();
var fav_arr = new Array();
var hidden_arr = new Array();
}
这是正确的方法吗?
var src_arr = caption_arr = fav_arr = hidden_arr = new Array();
答案 0 :(得分:70)
是的,如果你希望它们都指向内存中的同一个对象,则,但很可能你希望它们是单独的数组,这样如果一个变异,其他的就不会受到影响。
如果您不希望它们全部指向同一个对象,请执行
var one = [], two = [];
[]
是用于创建数组的简写文字。
这是一个控制台日志,它指出了差异:
>> one = two = [];
[]
>> one.push(1)
1
>> one
[1]
>> two
[1]
>> one = [], two = [];
[]
>> one.push(1)
1
>> one
[1]
>> two
[]
在第一部分中,我将one
和two
定义为指向内存中的同一对象/数组。如果我使用.push
方法,它会将1推送到数组,因此one
和two
内部都有1
。在第二个,因为我为每个变量定义了唯一的数组,所以当我推到一个时,两个不受影响。
答案 1 :(得分:17)
请远离该分配模式,即使您希望所有变量都指向同一个对象。
事实上,只有第一个是变量声明,其余的只是可能未声明的标识符的分配!
强烈建议不要为未声明的标识符(也称为未声明的分配)分配值,因为如果在作用域链上找不到标识符,则会创建GLOBAL变量。例如:
function test() {
// We intend these to be local variables of 'test'.
var foo = bar = baz = xxx = 5;
typeof foo; // "number", while inside 'test'.
}
test();
// Testing in the global scope. test's variables no longer exist.
typeof foo; // "undefined", As desired, but,
typeof bar; // "number", BAD!, leaked to the global scope.
typeof baz; // "number"
typeof xxx; // "number"
此外,ECMAScript第5版严格模式,不允许这种分配。
在严格模式下,对未声明的标识符进行的赋值将导致TypeError
异常,以防止隐含的全局变量。
相比之下,如果写得正确,我们会看到以下内容:
function test() {
// We correctly declare these to be local variables inside 'test'.
var foo, bar, baz, xxx;
foo = bar = baz = xxx = 5;
}
test();
// Testing in the global scope. test's variables no longer exist.
typeof foo; // "undefined"
typeof bar; // "undefined"
typeof baz; // "undefined"
typeof xxx; // "undefined"
答案 2 :(得分:1)
不,您的第二个语句将创建对同一个数组的四个引用。你想要:
var src_arr = [],
caption_arr = [],
fav_arr = [],
hidden_arr = [];
答案 3 :(得分:0)
所有这些变量都将引用一个Array对象。
答案 4 :(得分:0)
出于所有意图和目的,应使用 literal []
符号语法。由于 Array构造函数在处理其参数方面模棱两可。
如果传递给Array构造函数的唯一参数是整数 在0到232-1(含)之间,这将返回一个新的JavaScript数组 其length属性设置为该数字。这意味着
Array
的空槽的通过长度具有undefined
值。
new Array(1, 2, 3); // Result: [1, 2, 3]
new Array(3); // Result: [empty × 3] with undefined at indexes
new Array('3') // Result: ['3']
//this was ambiguous
let x = new Array(5); // Result: [empty × 5]
x.push("Hello"); //expected x as ["Hello", empty, empty, empty, empty]
//Actual x: [empty × 5, "Hello"]
解构语法:
声明多个变量的另一种更巧妙的方法是使用destructuring assignment,它可以将数组中的值或对象中的属性解压缩为不同的变量。
function foo() {
//destructuring assignment syntax
let [src_arr, caption_arr, fav_arr, hidden_arr] = [[], [], [], []];
console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);
fav_arr.push("fav");
hidden_arr.push("hidden");
//After adding some values to couple of arrays
console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);
}
foo();