function add(a,b,c){ if(c=undefined){ var c=''; } console.log(a,b,c); }add(a,b);问题:为什么当c没有传参时,我把c赋值为“”不行
1 回答

扬帆大鱼
TA贡献1799条经验 获得超9个赞
题目的代码出现了一个常见错误就是将赋值当成相等运算符使用:
if(c=undefined){ var c = ''; }
所以这里的实际逻辑是: 如果成功将c
赋值为undefined
时, 将在if
块中声明一个同名变量c
, 并将其赋值为空字符串, 而这个新变量c
将在if
语句结束后销毁(这里涉及到变量作用域, 请自行查阅资料), if
语句结束后的c
变量值仍然是undefined
. 也就是如下所做的事情:
function add(a, b, c) { if (c = undefined) { // 赋值语句总是执行, c的值为undefined var anthorVariableNamedC = ''; // 新建变量"c"并赋值为空字符串 } console.log(a, b, c); // a, b, undefined}
于是, 我们看到控制台输出是a, b, undefined
而不是a, b, ""
.
那么如何获得期望效果呢?
方法一: 利用逻辑与操作符的短路特性1对变量进行赋值:
function add(a, b, c) { c = c || ''; // 对传入参数c赋值, 如果c值取原本的参数值或空字符串. console.log(a, b, c); }add(1, 2); // 1, 2, ""
方法二: 使用ES6新特性的默认参数值2:
function add(a, b, c = '') { console.log(a, b, c); }add(1, 2); // 1, 2, ""
短路是指如果判断到一个子逻辑表达式能够判断整个逻辑表达式时, 则后续的逻辑表达式不再进行判断, 如示例中的
c || ''
, 当c
为null
或者undefined
时第一个表达式的值为false
, 执行第二个表达式.
添加回答
举报
0/150
提交
取消