【问题标题】:Declare multiple variables in JavaScript在 JavaScript 中声明多个变量
【发布时间】:2011-05-04 05:04:24
【问题描述】:

我想在一个函数中声明多个变量:

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();

【问题讨论】:

    标签: javascript variables declare


    【解决方案1】:

    是的,如果你希望它们都指向内存中的同一个对象,但很可能你希望它们成为单独的数组,这样如果一个发生变异,其他的不会受到影响。

    如果您不希望它们都指向同一个对象,请这样做

    var one = [], two = [];
    

    [] 是用于创建数组的简写文字。

    这是一个显示差异的控制台日志:

    >> one = two = [];
    []
    >> one.push(1)
    1
    >> one
    [1]
    >> two
    [1]
    >> one = [], two = [];
    []
    >> one.push(1)
    1
    >> one
    [1]
    >> two
    []
    

    在第一部分,我定义了onetwo 指向内存中的同一个对象/数组。如果我使用 .push 方法,它会将 1 推送到数组中,因此 onetwo 内部都有 1。在第二个中,因为我为每个变量定义了唯一的数组,所以当我推到一个时,两个不受影响。

    【讨论】:

    • 正如预期的那样,我遇到了问题。感谢您的解释!
    • btw.. 为什么 new Array() 不好?
    • 这并不是真的“糟糕”,只是过于冗长。 [] 更简洁。
    【解决方案2】:

    远离这种赋值模式,即使你想让所有变量都指向同一个对象。

    事实上,只有第一个是变量声明,其余的只是对可能未声明的标识符的赋值!

    强烈建议不要为未声明的标识符(又名未声明的赋值)赋值,因为如果在作用域链上找不到标识符,则会创建一个 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 5th Strict Mode 不允许这种分配。 在严格模式下,对未声明标识符的分配将导致 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"
    

    【讨论】:

    • mmm,所以最好的办法是:var one_arr = []; var two_arr = [];我想知道声明和赋值之间的区别。所以只声明了第一个?
    • @FFish:在上面的示例中,var 语句仅用于foo 标识符中,右侧的其余分配从从右到左,由于赋值运算符的关联性,(想象:var foo = value; 其中value 是具有多个赋值的表达式(bar = baz = xxx = 5),它们与var 语句无关。)但是你可以使用逗号通过单个 var 语句声明多个变量:var one_arr = [], two_arr = [], three_arr = [];
    【解决方案3】:

    不,您的第二个语句将创建对同一数组的四个引用。你想要:

    var src_arr     = [],
        caption_arr = [],
        fav_arr     = [],
        hidden_arr  = [];
    

    【讨论】:

      【解决方案4】:

      所有这些变量都将引用一个 Array 对象。

      【讨论】:

        【解决方案5】:

        出于所有意图和目的,应使用 literal [] 符号语法。由于 Array 构造函数 在处理其 参数 的方式上不明确。

        From the docs:

        如果传递给 Array 构造函数的唯一参数是整数 在 0 和 232-1(含)之间,这将返回一个新的 JavaScript 数组 其长度属性设置为该数字。这意味着具有 undefined 值的空槽的 通过长度Array

        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();

        【讨论】:

          【解决方案6】:

          实际上有更短的方法来使用 JavaScript 声明多个变量。首先,您可以只使用一个变量关键字(var、let 或 const)并声明变量名称和值,并用逗号分隔。

          const Sam="10yr", Joe="30yr", Bob="15yr", Mary="21yr";
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-14
            • 1970-01-01
            • 1970-01-01
            • 2012-06-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多