我收到此错误消息,我不是粉丝。
Bad line breaking before '?'.
我觉得
var s = (a === b)
? 'one'
: 'two';
看起来更好。克罗克福德说:
分号插入可以屏蔽复制/粘贴错误。如果你总是在运算符之后断行,那么JSLint可以更好地找到这些错误。
有人可以给我一两个例子,说明他所指的那种复制/粘贴错误吗?
更新
var s = (a === b)
? 'one'
: 'two';
看起来比
好var s;
if(a === b) {
s = 'one';
} else {
s = 'two';
}
答案 0 :(得分:10)
(根据要求,我的评论重新发布为答案:)
您显示的示例中的“明显”复制/粘贴错误是复制第一行:
var s = (a === b)
...当然这本身就是有效的代码,但显然不会像三条线那样做同样的事情。人们希望人们在复制一行之前先查看周围的代码,但你永远不会知道。
我认为Crockford先生试图提出的一点是,如果你故意将多行表达式分开,使得各行不是自己的有效代码,那么然后您不小心只复制了表达式的一行,当您将其粘贴到其他位置时,它可能会导致语法错误。这很好,因为浏览器和/或JSLint / JSHint会报告语法错误,因此如果您复制/粘贴自己有效的行,则比创建的更微妙的错误更容易找到。因此,如果你像克罗克福德所说的那样“总是在经营者之后打破界限”:
var s = (a === b) ?
'one' :
'two';
...那么三元的唯一一行就是它自己的有效代码(第三个)看起来并不完整,所以如果把它自己粘贴就更容易被发现,因为它显然很明显它本身没有做任何事情 - 由于同样的原因,它不太可能首先被复制。
(话虽如此,我并没有在我自己的代码中强调三元运算符,我认为上面看起来很丑陋。我在一行上放了一个短的三元表达式,在换行符的两行上放一个较长的表达式在中间操作数之后和:排在?之下,或者像你的三条线上的很长的一行。)
答案 1 :(得分:2)
最着名的例子如下:
function one() {
return
{
val: 1
};
}
alert(one()); // undefined
VS
function one() {
return {
val: 1
};
}
alert(one()); // [objet Object]
答案 2 :(得分:2)
他所指的复制粘贴错误的类型是您将代码交给其他人或6个月内自己的代码,而其他人随意复制您的代码,最后关闭条件,假设赋值是被评估的右侧的值。
这似乎难以置信,从某种意义上说,你希望它是...... 但是我知道自动插入已经多次为我的公司添加了代码,现在,他们仍然没有强制采用明确的分号,仍然认为JS好像新行很重要并且仍然会通过忽略加上剪切/粘贴错误缺乏工具/版本管理/构建系统。
答案 3 :(得分:1)
假设您在之前粘贴函数表达式,
var a = 1, b = 1; // a === b, expect 'one'
(function(){
console.log('called');
})
(a === b)
? 'one'
: 'two'
// called
// "two"