javascript - 为什么在 Javascript 中不鼓励在 while 语句中赋值?

标签 javascript typescript tslint

我刚刚编写了以下循环,它工作得很好:

let position = 0;
// tslint:disable-next-line:no-conditional-assignment
while ((position = source.indexOf('something interesting', position)) > 0) {
    // do something interesting with something interesting
  position += 1;
}

但请注意,我必须添加 tslint 异常(exception)。显然有人
已决定不允许在while有条件的。然而,这是我所知道的最直接的代码模式
特定的情况。

如果这不是“允许的”(或者我应该说“不鼓励”),那该怎么办
驱动这个的人认为正确的代码模式是什么?

最佳答案

它使代码的意图更难确定。使用赋值作为表达式是不寻常的——如果你在一个条件中看到它,你有多确定代码的作者打算使用赋值,或者它可能是一个错字?如果代码的编写者打算比较该值怎么办?例如

while ((position = source.indexOf('something interesting', position)) > 0) {

对比
while ((position == source.indexOf('something interesting', position)) > 0) {

这两个是非常不同的。 (在这种特殊情况下,Typescript 会警告您与 bool 值和数字的比较可能是一个错误,但这不会发生在 Javascript 中,也不会在其他一些情况下发生。)

对于上面的代码,您可以使用正则表达式(尽管在不知道 // do something interesting with something interesting 的内容的情况下无法确定),而不是在条件内部分配,在条件外部分配,甚至更好。

不幸的是,它看起来重复,但另一种选择是
let position = 0;
const getPos = () => {
  position = source.indexOf('something interesting', position);
};
getPos();
while (position > 0) {
  // do something interesting with something interesting
  getPos();
}

关于javascript - 为什么在 Javascript 中不鼓励在 while 语句中赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58704026/

相关文章:

php - 当用户第一次查看我的网站时,显示弹出窗口的最佳方式是什么?

java - 使用 JSP 和 Servlet Java 的消息提示

javascript - 创建一个类似 "$"对象的 jQuery

javascript - 无法将 ngModel 绑定(bind)到 p-dropdown 值(Angular)

javascript - Angular2/Typescript 知道何时获取了 http 或更新了一个 observable

typescript - 转译时排除 *.spec.ts 文件但仍正确地对其进行 lint

javascript - JS关闭事件在页面上不起作用,如何找出错误?

javascript - MxCodec 解码功能不适用于 XML

angular - Typescript 组件选择器应命名为 undefined

git - 参数列表太长 - lint-staged -> tslint