12

我收到此错误消息,我不喜欢。

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

4 回答 4

10

(根据要求,我的评论重新发布为答案:)

您展示的示例中的“明显”复制/粘贴错误将是复制第一行:

var s = (a === b)

...当然,这本身就是有效的代码,但显然与三行一起做的事情不同。人们会希望人们在复制一行之前先查看周围的代码,但你永远不会知道。

我认为 Crockford 先生试图说明的一点是,如果您故意将多行表达式拆分为各个行本身不是有效的代码,那么如果您不小心只复制了表达式的一行将其粘贴到其他位置时可能会导致语法错误。这很好,因为语法错误是由浏览器和/或 JSLint/JSHint 报告的,因此比复制/粘贴单独有效的行所产生的更细微的错误更容易找到。因此,如果您像 Crockford 建议的那样“总是在运算符之后换行”:

var s = (a === b) ? 
        'one' : 
        'two';​

...然后三元组中唯一的有效代码行(第三行)看起来并不完整,因此如果单独粘贴会更容易发现错误,因为它显然没有自己做任何事情-出于同样的原因,它不太可能首先被自己复制。

(话虽如此,我不强调我自己代码中的三元运算符,而且我认为上面看起来很难看。我在一行上放了一个短的三元表达式,一个长的超过两行的三元表达式,中间后面有换行符操作数和 : 排列在 ? 下,或者像你的一样长的三行一列。)

于 2012-11-22T21:55:54.100 回答
2

最(不)著名的例子如下:

function one() {
  return
  {
    val: 1
  };
}

alert(one()); // undefined

对比

function one() {
  return {
    val: 1
  };
}

alert(one()); // [objet Object]
于 2012-11-14T22:33:28.933 回答
2

他所指的复制粘贴错误类型是您在 6 个月内将代码交给其他人或您自己,而其他人随意复制您的代码,以条件的结束括号结束,假设赋值意味着被评估的右侧的值。

这似乎不可信,从某种意义上说,你会希望它是......
但我知道自动插入已经多次为我的公司编写代码,现在,他们仍然没有强制采用显式分号,仍然对待JS 好像新行很重要并且仍然会由于忽略和缺乏工具/版本管理/构建系统而导致剪切/粘贴错误。

于 2012-11-14T22:39:38.583 回答
1

假设您在之前粘贴了一个函数表达式,

var a = 1, b = 1; // a === b, expect 'one'
(function(){
    console.log('called');
})
(a === b)
? 'one'
: 'two'
// called
// "two"
于 2012-11-14T22:45:01.247 回答