FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

Day2:写出执行结果,并解释原因

Open Genzhen opened this issue 4 years ago • 9 comments

function side(arr) {
  arr[0] = arr[2];
}
function a(a, b, c = 3) {
  c = 10;
  side(arguments);
  return a + b + c;
}
a(1, 1, 1);
// 写出执行结果,并解释原因

每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解 二维码加载失败可点击 小程序二维码

扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。

Genzhen avatar Jun 22 '20 11:06 Genzhen

答案 12

解析 arguments 中 c 的值还是 1 不会变成 10,
因为 a 函数加了默认值,就按 ES 的方式解析,ES6 是有块级作用域的,所以 c 的值是不会改变的

Genzhen avatar Jun 22 '20 11:06 Genzhen

c会变成10啊,解析的什么东东

zhengcaifeng avatar Jul 20 '20 14:07 zhengcaifeng

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

Genzhen avatar Jul 21 '20 01:07 Genzhen

说实话,感觉考这些真的很无聊。。学js学得都陷在语法的泥潭里了,像极了大学时期末考试C语言i++、++i之类的。。

dinjufen avatar Sep 13 '20 04:09 dinjufen

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的变化而改变

HowieWH avatar Sep 25 '20 07:09 HowieWH

加了默认值,则转为严格模式(其实也可以使用 "use strict" 转),这时候参数(a、b、c)与 arguments 没有绑定关系,所以修改 arguments 不会影响到参数(a、b、c)的值,修改参数(a、b、c)也不会影响到 arguments。 不加默认值,则为非严格模式,结果和上面的相反。

chenzesam avatar Oct 01 '20 02:10 chenzesam

说实话,感觉考这些真的很无聊。。学js学得都陷在语法的泥潭里了,像极了大学时期末考试C语言i++、++i之类的。。

JavaScript 因为一些历史原因,它的设计很糟糕

但是现在制定标准委员会确实在创造新的特性和语法,来弥补过去糟糕设计带来的糟糕的使用

也鼓励大家使用新特性和语法去替代旧的糟糕的特性和语法

有了 good parts 就用新东西就好了,老的糟糕设计要保留是为了兼容历史包袱,大家也不该继续用了

但是有些考题还考这些「历史包袱」就很没有意义的,一点价值都没有,挺不能理解的

这些东西不该成为,常驻于我们 JavaScript 编程思维模型中的常客,因为这些东西挺扰乱思路的。如果真的在开发中遇到这种,超低频率出现的问题,也应该当时找资料去解决它

1uckyneo avatar Sep 30 '21 14:09 1uckyneo

当设置了解构赋值、默认值、剩余运算符 arguments的值不会变

zsasjy avatar Aug 11 '22 09:08 zsasjy

c会变成10啊,解析的什么东东

首先,c会有一个默认值3,调用a函数传递了三个1,此时a函数三个变量都为1,此时执行a函数第一行代码,将形参c赋值为10,调用side将当前函数args数组传递过去,改变该数组的第一项,并不会对args会有影响,所以c还是10,所以最终是12

woshinibaba-hue avatar Sep 16 '22 01:09 woshinibaba-hue