12

私はファンではないこのエラーメッセージを受け取りました。

Bad line breaking before '?'.

のような気がする

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

良く見えます。クロックフォードは次のように述べています。

セミコロンを挿入すると、コピー/貼り付けエラーを隠すことができます。常に演算子の後で改行すると、JSLint はこれらのエラーをより適切に検出できます。

彼が言及している種類のコピー/貼り付けエラーの例を 1 つまたは 2 つ教えてもらえますか?

アップデート:

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

よりも良く見える

var s;
if(a === b) {
    s = 'one';
} else {
    s = 'two';
}
4

4 に答える 4

10

(リクエストに応じて、私のコメントが回答として再投稿されました:)

あなたが示す例の「明らかな」コピー/貼り付けエラーは、最初の行をコピーすることです:

var s = (a === b)

...もちろん、それ自体は有効なコードですが、明らかに 3 つの行を一緒にした場合と同じことを行うわけではありません。1 行をコピーする前に周囲のコードを見てほしいと思う人もいるかもしれませんが、それはわかりません。

Crockford 氏が言おうとしているのは、個々の行がそれ自体では有効なコードにならないように意図的に複数行の式を分割した場合、誤って式の 1 行だけをコピーすると、他の場所に貼り付けると、構文エラーが発生する可能性があります。ブラウザや JSLint/JSHint によって構文エラーが報告され、それ自体で有効な行をコピーして貼り付けた場合に作成されるより微妙なバグよりも見つけやすいため、これは良いことです。したがって、クロックフォードが提案するように、「常に演算子の後に改行する」場合:

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

...それから、それ自体で有効なコードである 3 項の唯一の行 (3 番目) は実際には完全に見えません。同じ理由で、そもそもそれ自体がコピーされる可能性は低くなります。

(そうは言っても、私自身のコードでは三項演算子について強調していません。上記は見苦しく見えると思います。短い三項式を 1 行に配置し、長い三項式を 2 行にわたって配置し、途中で改行します。オペランドと : が ? の下に並んでいるか、あなたのような 3 行にまたがる非常に長いものです。)

于 2012-11-22T21:55:54.100 に答える
2

彼が言及しているタイプのコピー アンド ペースト エラーは、6 か月後にコードを他の人または自分自身に渡し、他の人が条件の閉じ括弧で終わるコードを無計画にコピーしたものです。割り当ては、評価された右辺の値であることを意味します。

これは信じがたいことのように思えますが、ある意味ではそうであることを期待するでしょう...
しかし、自動挿入が私の会社のコードを何度も中断させたことはわかっています。あたかも新しい行が重要であるかのように JS を無視し、ツール/バージョン管理/ビルドシステムが不足しているため、カット/ペースト エラーが発生します。

于 2012-11-14T22:39:38.583 に答える
2

最も (悪名高い) 有名な例は次のとおりです。

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

alert(one()); // undefined

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

alert(one()); // [objet Object]
于 2012-11-14T22:33:28.933 に答える
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 に答える