今天看别人的代码时,看到他使用了 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 的默默认值, 于是输出内容。
但是感觉这样的理解是有问题的。 阮老师的书上和网上的博客,通常对于这一概念就一笔带过,告诉了大家在函数中解构 和 默认参数一起使用就是这样。 但是我绕进去了,求教各位。
就是根据某个参数严格等于undefined来判断啊
arguments === undefined // false arguments是一个类数组对象啊啊啊啊啊,应该像这样判断
arguments[0] === undefined // true
来自酷炫的 CNodeMD
@acfasj 哇 nice 那下面关于函数参数是对象的默认值解构的理解,我总觉得我理解的方式很绕。想问你是如何理解的?
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大佬