答案
12
解析
arguments 中 c 的值还是 1 不会变成 10,
因为 a 函数加了默认值,就按 ES 的方式解析,ES6 是有块级作用域的,所以 c 的值是不会改变的
c会变成10啊,解析的什么东东
c会变成10啊,解析的什么东东
@zhengcaifeng
是arguments 中 c 的值,function a(a, b, c = 3) 这里的c,因为 a 函数加了默认值,所以就按 ES 的方式解析,函数中的参数就不会变了
function side(arr) {
arr[0] = arr[2];
}
function a(a, b, c = 3) {
c = 10;
console.log(arguments);
side(arguments); // 这里 a,c的值不管怎么改变都是不会改变的
return a + b + c;
}
a(1, 1, 1); //12
但是,如果是
function side(arr) {
arr[0] = arr[2];
}
function a(a, b, c) {
c = 10;
console.log(arguments);
side(arguments); // 这里 a,c的值不管怎么改变都是不会改变的
return a + b + c;
}
a(1, 1, 1); // 21
说实话,感觉考这些真的很无聊。。学js学得都陷在语法的泥潭里了,像极了大学时期末考试C语言i++、++i之类的。。
c会变成10啊,解析的什么东东
@zhengcaifeng
是arguments 中 c 的值,function a(a, b, c = 3) 这里的c,因为 a 函数加了默认值,所以就按 ES 的方式解析,函数中的参数就不会变了
function side(arr) { arr[0] = arr[2]; } function a(a, b, c = 3) { c = 10; console.log(arguments); side(arguments); // 这里 a,c的值不管怎么改变都是不会改变的 return a + b + c; } a(1, 1, 1); //12但是,如果是
function side(arr) { arr[0] = arr[2]; } function a(a, b, c) { c = 10; console.log(arguments); side(arguments); // 这里 a,c的值不管怎么改变都是不会改变的 return a + b + c; } a(1, 1, 1); // 21
在es5的非严格模式下,因为数组索引对应了数据属性,所以会互相联动的,也就是c和arguments[2]绑定了;而在严格模式下则是简单拷贝。es6是简单拷贝,所以c的值不会因为argument的变化而改变
加了默认值,则转为严格模式(其实也可以使用 "use strict" 转),这时候参数(a、b、c)与 arguments 没有绑定关系,所以修改 arguments 不会影响到参数(a、b、c)的值,修改参数(a、b、c)也不会影响到 arguments。
不加默认值,则为非严格模式,结果和上面的相反。
Most helpful comment
@zhengcaifeng
是arguments 中 c 的值,function a(a, b, c = 3) 这里的c,因为 a 函数加了默认值,所以就按 ES 的方式解析,函数中的参数就不会变了
但是,如果是