你能不能给我一个例子" Bad line break'''"?

时间:2012-11-14 22:26:52

标签: javascript jslint

我收到此错误消息,我不是粉丝。

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';
}

4 个答案:

答案 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"