【问题标题】:Passing ECMAScript 6 const as Function Argument将 ECMAScript 6 const 作为函数参数传递
【发布时间】:2015-10-22 21:11:11
【问题描述】:

我最近阅读了很多关于 ES6 的文章并决定尝试一下(使用 Babel)。我对新的变量声明 letconst 有点困惑。

我了解范围与var 有何不同;并且 const 是对值的永久引用(并且不是本身的常量值!)。

:如果我将const 变量传递给函数调用会怎样?接收函数是否能够更改值/参考?为什么?为什么不呢?

【问题讨论】:

  • 由于您不是传递对函数的引用,而是传递值,因此函数与传递 var 或其他任何内容时没有什么不同。

标签: javascript function ecmascript-6 constants parameter-passing


【解决方案1】:

如您所见,herehere const 声明创建了一个只读命名常量,即不是命名引用。

现在,如果你将一个 const 传递给一个函数,你实际上是在创建一个新的作用域:

您正在“按值”传递 const,并且局部函数变量将获得 const 的值,而不是像在任何非不可变对象(如字符串)中那样对它的引用。 您将能够更改本地 var 但不能更改原始 const。

【讨论】:

    【解决方案2】:

    传递给函数的参数的语义完全独立于该参数的声明方式(无论是使用varlet 还是const)。传递给函数的只是一些值。接收函数无法了解该值是如何或从何处派生的,包括,如果它是一个变量,该变量是如何声明的。它只看到传入的值。新的letconst 关键字与此行为无关。

    给定数组或对象的值,该数组或对象可以被操作,这是一些混乱的根源。所以我可以做到以下几点:

    const a = {};
    a.x = 1;
    

    上面的const 使得a 本身在它的作用域内是一个常量,所以它不能被重新声明或重新赋值,但它绝不会阻止a 的内部结构被改变,在这种情况下通过添加属性x

    同样,在参数传递上下文中:

    function func(obj) { obj.x = 1; }
    
    const a = {};
    func(a);
    

    这里,funcobj 的形式接收a,但使用该值它可以访问/更改对象的内部结构。

    可能感兴趣:How to make function parameter constant in JavaScript?

    【讨论】:

    • 感谢您的回答。值得注意的是,在调用func(a) 之后打印a 会得到{x: 1},从而在调用上下文中修改对象的内部结构。
    【解决方案3】:

    当您将原始类型(字符串、数字等)的变量作为参数传递时,您按值传递变量。当它是对对象或数组的引用时,您通过引用传递,但函数参数是另一个具有相同引用的变量,而不是 const(可变)。

    这意味着参数变量具有相同的引用并且可以进行会影响原始变量的更改(例如添加或删除数组中的数据),但是如果参数变量更改它的引用(例如argument = {}),则更改不会反映到原始变量(即使原始变量不是 const)。

    例子:

    const str = 'string';
    
    function changeToNumber(argument) {
      argument = 10;
    }
    
    changeToNumber(str);
    console.log(str); // 'string'
    
    const obj = { prop: 1 };
    let notConstObj = { prop: 1 };
    
    function changeToArray(argument) {
      argument = [10];
    }
    
    changeToArray(obj);
    console.log(obj); // '{ prop: 1 }'
    
    changeToArray(notConstObj);
    console.log(notConstObj); // '{ prop: 1 }'
    
    function modifyObj(argument) {
      argument.prop2 = 10;
    }
    
    modifyObj(obj);
    console.log(obj); // '{ prop: 1, prop2: 10 }'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2018-01-20
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      相关资源
      最近更新 更多