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

Created on 22 Jun 2020  ·  6Comments  ·  Source: lgwebdream/FE-Interview

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+道前端面试题。

Most helpful comment

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

All 6 comments

答案
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。
不加默认值,则为非严格模式,结果和上面的相反。

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Genzhen picture Genzhen  ·  4Comments

lgwebdream picture lgwebdream  ·  6Comments

Genzhen picture Genzhen  ·  3Comments

lgwebdream picture lgwebdream  ·  4Comments

Genzhen picture Genzhen  ·  5Comments