我最近一直在阅读关于ES6的很多内容,并决定尝试一下(使用Babel)。我对新的变量声明let
和const
感到困惑。
我理解范围与var
的区别;并且const
是对值的永久引用(并且不一个常量值本身!)。
问:如果我将const
变量传递给函数调用怎么办?接收功能是否能够更改值/参考?为什么?为什么不呢?
答案 0 :(得分:5)
传递给函数的参数的语义完全独立于声明该参数的方式(无论是使用var
,let
还是const
)。传递给函数的只是一些价值。接收函数无法了解值的推导方式和位置,包括(如果它是变量)如何声明该变量。它只会看到传入的值。新的let
和const
关键字与此行为无关。
考虑到数组或对象的值,可能会操纵该数组或对象,这是一些混淆的根源。所以我可以做到以下几点:
const a = {};
a.x = 1;
上面的 const
使a
本身成为其范围内的常量,因此无法重新声明或重新分配,但它绝不会阻止{{1}的内部结构来自被更改,在这种情况下,通过添加属性a
。
同样,在参数传递上下文中:
x
此处,function func(obj) { obj.x = 1; }
const a = {};
func(a);
接收func
的{strong>值为a
,但使用该值可以访问/更改对象的内部。
可能有兴趣:How to make function parameter constant in JavaScript?。
答案 1 :(得分:1)
正如您可以看到here和here const声明创建一个只读命名常量,即不是命名引用。
现在,如果将const传递给函数,实际上是在创建一个新范围:
你传递const"按值"并且本地函数变量将获取const的值而不是任何非不可变对象(如字符串)中的对它的引用。 您将能够更改本地var而不是原始const。
答案 2 :(得分:0)
当您传递具有基本类型(字符串,数字等)的变量作为参数时,将按值传递变量。当它是对对象或数组的引用时,可以按引用传递,但是function参数是另一个具有相同引用的变量,而不是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 }'