请教一个javascript的编程问题
发布于 9 年前 作者 nodejsnewbie 4247 次预览 最后一次回复是 9 年前 来自 问答
代码如下: function isLinkExist(owners,name){ owners.forEach(function(owner) { if (owner.name == name) { return true; } }); return false; }
运行结果发现返回值都是false,请问我该如何修改代码
9 回复
代码如下: function isLinkExist(owners,name){ owners.forEach(function(owner) { if (owner.name == name) { return true; } }); return false; }
运行结果发现返回值都是false,请问我该如何修改代码
可以用
Array.prototype.every或者Array.prototype.some楼主的是作用域弄混了;foreach 内部执行的都是函数体,作用域外面看不到的; 这几楼的回复都比较是正解;
@lcjnil @hyj1991 这2楼经验老道;
@cnwhy 谢谢,测试成功。 我感觉是由于forEach内部代码是异步的,导致我的代码不正确,但是对此的认识还是很模糊,能帮忙讲解一下吗?
@slclub 谢谢讲解,我好好思考一下,然后试试前面两位的建议。@lcjnil @hyj1991 谢谢!!
forEach 不是异步的。
你的问题在于第一个 return true 写在了 forEach 的调用函数中,并不是
isLinkExist的 return。这个isLinkExist真正的 return 只有一个 false,所以无论函数里做了什么,最终都只会 return false。你的代码:
这个实现最好的选择是
Array.prototype.some(),因为不需要遍历owners中的所有元素,只需要找到一个为true的就立即返回true,否则返回false:更简单的 ES2015 写法:
如果你不想用
.some()也可以。.forEach()
.every()
.filter()
@nodejsnewbie 如果只是想看看元素是不是存在,不需要遍历所有的元素,二楼的Array.prototype.some是正解。Array.prototype.every和一楼的都不太合适吧。
Some 是OK的。every 确实不太合适吧