为何两个调用every()方法的函数返回结果不同?求解答
为什么两个看似相同的数组检查函数返回结果不同?
这是一个很容易踩的箭头函数语法坑!问题出在箭头函数的返回值规则上,咱们来拆解一下你的代码:
首先看你提供的代码片段:
let arr = [ {first: 'Jules', last:'Atkinson'}, {first: 'Ralf', last:'Benson', isInstructor: true}, {first: 'Quinten', last:'Pottinger'}, {first: 'Linden', last:'Knaggs', isInstructor: true} ] function getCertainKey1(arr, key) { // 返回FALSE return arr.every((val) => { key in val; }); } function getCertainKey2(arr, key) { // 返回TRUE return arr.every(val => key in val); } console.log(getCertainKey1(arr, 'first')); console.log(getCertainKey2(arr, 'first'));
核心差异:箭头函数的大括号与返回值
对于
getCertainKey2里的箭头函数val => key in val:
当箭头函数没有用大括号{}包裹函数体时,它会自动返回箭头后面表达式的计算结果,也就是key in val的布尔值(这里每个元素都有first键,所以每次都返回true,every最终返回true)。对于
getCertainKey1里的箭头函数(val) => { key in val; }:
一旦用大括号包裹函数体,箭头函数就不会自动返回值了——你必须显式写出return语句。这里你只写了key in val;但没有返回它,所以这个箭头函数的默认返回值是undefined。而every方法要求每个回调函数返回真值(truthy value),undefined属于假值(falsy),所以整个every调用直接返回false。
如果要让getCertainKey1和getCertainKey2行为一致,你需要修改成这样:
function getCertainKey1(arr, key) { return arr.every((val) => { return key in val; }); }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

