我刚刚编码了下面的循环,效果很好:
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例外。显然有人决定不允许在内部使用赋值语句while
有条件。但这是我所知道的最直接的代码模式特殊情况。
如果这不是“允许的”(或者我应该说“受挫的”),那该怎么办驾驶此代码的人认为正确的代码模式是?
这使代码的意图更加难以确定。将赋值用作表达式是unusual-如果在条件中看到赋值,您如何sure打算使用赋值的代码编写者,或者它是拼写错误?如果代码的编写者打算对值进行[[compare怎么办? EG
while ((position = source.indexOf('something interesting', position)) > 0) {
vs
while ((position == source.indexOf('something interesting', position)) > 0) {
这两个是。 (在这种特殊情况下,Typescript会警告您,将布尔值和数字进行比较可能是一个错误,但这在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();
}
let position = 0;
while (true) {
position = source.indexOf('something interesting', position);
if (position < 0) {
break;
}
// do something interesting with something interesting
position += 1;
}
如果禁用curly
,语法可能会变得更加紧凑,即使K&R Ch 3完全不要求使用这些花括号,该语法也会在curly
/if
/for
/do
语句上加上花括号。总的来说,这需要就这些规则的动机进行很好的比较。 TSLint在while
上定义其用途:TSLint是可扩展的静态分析工具,用于检查TypeScript代码的可读性,可维护性和功能性错误。是否完全可以正确使用无花括号its homepage语句,特别是如果您对缩进和格式进行了认真的研究?当然。但是,也完全有可能以一种微妙的方式
misuse该功能
like in the docs forif
:curly
您的问题假设“显然有人认为这是不可取的”,但更准确的说法是此模式是跨代码库的重要bug来源,足以使
curly
的作者拥有为特定模式提供了内置的检测和反馈。该模式不是“不希望的”,“不是'允许的'”或“不鼓励使用的”,而只是足够少且容易被误用的模式,足以对其进行检测[默认为[打开]]。与if (foo === bar) foo++; bar++;
中的所有规则一样,您可以使用tslint
或tslint
来configure the default rule set,并且您和您的团队可以选择禁用tslint.json
和tslint.yaml
之类的规则。如果这种情况在您的编码样式中常常是误报(似乎如此),或者将curly
应用于该模式是常见且正确使用的现有代码库,则这可能特别有用。但是,我认为一个团队声称该模式容易出现no-conditional-assignment
/tslint
错别字和其他错误,并且正确使用不足以证明允许使用该模式是合理的(就像其他人在这个问题上所做的那样)。模式在他们的代码库中。**:尽管K&R不需要大括号,但它确实在p56上指出:“缩进明确地显示了您想要的内容,但是编译器没有收到消息,并将
=
与内部==
关联这种错误可能很难找到;在嵌套else
时使用花括号是个好主意。”这表明,即使原始K&R文本也支持合理的样式规则或超出其语法支持范围的限制。