es6默认值问题
es6在函数参数中添加默认值,给其中一个参数赋值,有无默认值为什么arguments
的输出结果会受到影响?
const fn1 = function(a = 7,b = 8, c = 9){
a = 10;
console.log(arguments)
}
const fn2 = function(a, b, c){
a = 10;
console.log(arguments)
}
fn1(1,2,3); // 输出结果:[1,2,3]
fn2(1,2,3); // 输出结果:[10,2,3]
这个输出结果我很费解,求告知。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
MDN 上的原话:
fn1 满足条件1.非严格模式 2.包含默认参数,所以,arguments 的值和参数的值相互独立。
fn2 没有包含剩余参数、默认参数或结构赋值,所以是相反的结果,arguments 的值和参数的值相互影响。
javascript 里的 arguments 分两种,mapped 和 unmapped 。
对于 mapped arguments ,对 arguments 的元素会映射到实参。于是实参赋值会影响 arguments, 对 arguments 的元素赋值会影响实参。
unmapped arguments 没有这种映射,对 arguments 以及对参数的赋值互不影响。
只有在非严格模式,简单参数列表的时候,才提供 mapped arguments 。其他时候,arguments 都是 unmapped 。所谓简单参数列表,指参数列表不包含解构参数,rest 参数(
, ...a)
),以及默认值。所以,正是默认值影响了 arguments 的类型。没有默认值时,arguments 是 mapped ;有了默认值,arguments 是 unmapped 。从而导致了对实参的赋值(
a=10;
) 对 arguments 内容带来了不同的影响。arguments 构建的具体算法包含在 ecma262 的 FunctionDeclarationInstantiation 方法中,想详细了解可以去看一下。
在非严格模式下, 直接操作实参
a b c
会改变arguments的值,关于
fn1
,可以用babel测试%7B%0A%20%20%20%20a%20%3D%2010%3B%0A%20%20%20%20console.log(arguments)%0A%7D)查看被转化成了
arguments
赋值的形式,脱离了argument
,所以不会影响.