es6 函数参数的结构疑问?
发布于 6 年前 作者 gnailiy 2800 次浏览 来自 问答

今天看别人的代码时,看到他使用了 es6 的函数参数默认参数,不过我一下子没有看明白。大概我理解的函数参数的默认值是:

var e = function(d = 3) {
	console.log(d);
}

e( );  // 3
e( 2 );  // 2
e(undefined);  //3
e(null);  // null

说是对于函数的参数 “严格等于” (===) undefined 的时候,触发默认值,比如空参数。但是 null 不行。但是此时 arguments === undfined; // false 。不知道这里严格等于 undefined 的是哪一个值?

但是对于函数的参数是对象的情况,我不知道我理解的对不对,总感觉非常绕。

function move({x = 0, y = 0} = {}) {
  return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

move() 的时候, 先不纠结于 arguments === undfined; // false 这一点,首先触发参数默认值为 {}, 接着需要使用到 x,y的时候,发现 x 和 y 都是 undefined , 从参数的默认值中去寻找 ,发现x = 0 , y = 0 的默默认值, 于是输出内容。

但是感觉这样的理解是有问题的。 阮老师的书上和网上的博客,通常对于这一概念就一笔带过,告诉了大家在函数中解构 和 默认参数一起使用就是这样。 但是我绕进去了,求教各位。

6 回复

就是根据某个参数严格等于undefined来判断啊

arguments === undefined // false arguments是一个类数组对象啊啊啊啊啊,应该像这样判断

arguments[0] === undefined // true

来自酷炫的 CNodeMD

@acfasj 哇 nice 那下面关于函数参数是对象的默认值解构的理解,我总觉得我理解的方式很绕。想问你是如何理解的?

@gnailiy 解构那里我觉得你理解的没错啊,这些对象本来就是套来套去的,绕也是正常的😂 当然只是我自己的看法

来自酷炫的 CNodeMD

function move({x = 0, y = 0} = {}) {
  return [x, y];
}
// 等价于

function move(p = {}) {
  const { x = 0, y = 0 } = p
  return [x, y];
}

先判断参数是不是undefined,如果参数是undefined则赋值为 {} 再对参数进行解构,如果解构时x, y 为undefined,则再对x和y用初始值赋值。

move() // [0,0]
move({}) // [0,0]
move({ x: 1 }) // [1,0]
move({ y: 2 }) // [0,2]
move({ x,1, y: 2 }) // [1,2]

从语义角度讲,undefined 才是未定义,才有默认值。而 null 是一个明确的指。

感谢jjc大佬

回到顶部