2016-01-18 12 views
10

予期しない取得 "。"このコードでjslint(http://jslint.com/)から:なぜ「予期しない」。括弧内のデフォルト値の演算子

function test(foo) { 
    "use strict"; 
    return (foo || "").replace("bar", "baz"); 
} 

なぜjslintは、との問題を抱えているん||演算子は空の文字列を強制して、fooがundefinedとして渡された場合にエラーを起こさずに置換を実行できるようにします。

これは渡し:

function test(foo) { 
    "use strict"; 
    var xFoo = (foo || ""); 
    return xFoo.replace("bar", "baz"); 
} 

を私はそれがベースの意見を知っていると私はなど、それを無視することができます...しかし、このように連鎖するが眉をひそめている理由を理解しようとしています。 eshintについても知っていますが、私はこのメッセージを回避しようとしているわけではありません。理由を理解したいだけです。

余分な変数(xFoo)を必要としないため、最初のアプローチのように見えますが、より簡潔で洗練されています。

両方の機能は、すべての条件下で全く同じことを行います。

+3

JSLintのバグのようです。 – SLaks

+0

[jsHint](http://jshint.com/)には、最初の機能に問題はありません。 – jfriend00

+0

これはバグのようです。意見に基づいている場合、あなたの糸くずの構成に基づいて眉をひそめていることを明示する別のエラーが表示されます。 – mostruash

答えて

1

function test(foo) { 
    "use strict"; 
    return String(foo || "").replace("bar", "baz"); 
} 

jslintでエラーを取り除くあなたはちょうどそれ二行作ることができJSLint Help

+1

@ChrisGcisoこれは 'return foo && foo.replace(" bar "、" baz ");' – guest271314

+0

も渡します@ChrisGciso文字列リテラルに添付された表示メソッドがjslintで警告として通知されますか? 'function test(foo){ "厳密に使う "; if(!foo){ return ""。replace( "bar"、 "baz"); } } '、' function test(foo){ "厳密に使う"; if(!foo){ return "bar"。replace( "bar"、 "baz"); } } ' – guest271314

+3

@ChrisGciso - これはコード化するための「適切な」方法ではありません。これはjsLintを不平にさせる方法です。 jsLintはここでは神ではありません。私はそのような関数を書くかもしれませんし、誰かが 'true'を渡すと例外をスローすることはできません。なぜなら、それは私が文字列に強制したくない無効な値だからです。その場合、この新しい方法は間違っています。 – jfriend00

1

(foo || "")はブール式に評価されると考えられますが、false.replace()のようなものは意味がありません。あなたのケースでは、代わりに可変または空の文字列が得られます。 String() コンストラクタ を使用して

+0

それは 'false'になることはありませんが、' true'である可能性があります –

+0

私はそれがブール値として評価されると言っているわけではありません。 また、 'foo'が' false'、 'undefined'などである場合、式は' '' 'も使用しますが、これも偽です。どちらのケースも「偽」と評価された場合、どのように「真」となるでしょうか? – ScriptedPixels

1

Distinction between string primitives and String objectsも参照してください。

function test(foo) { 
    "use strict"; 
    foo = foo || ""; 
    return foo.replace("bar", "baz"); 
} 

変数xFooを作成する必要はありません。 fooパラメータは、JavaScript does not support passing-by-reference以降に渡された引数のコピーです。

ここでは、デフォルトのパラメータを指定するようにしています。

function test(foo) { 
    "use strict"; 
    if (foo === undefined) { 
     foo = ""; 
    } 
    return foo.replace("bar", "baz"); 
} 

はい、それはあまり簡潔であるが、それはへのコードの意図にはあまり余地を残します。その場合、私はあなたにも、より明確にし、型チェックをされることによって何をしているか、それがクリスタルクリアになるだろう後でそれを読む人によって誤解されることがあります。明示的に型をチェックすることで、他の潜在的な問題を処理することもできます。

function test(foo) { 
    "use strict"; 
    if (foo === undefined) { 
     foo = ""; 
    } else if (typeof foo !== 'string') { 
     throw('foo must be a string'); 
    } 
    return foo.replace("bar", "baz"); 
} 

あなたはES2015を使用している場合、あなたはまた、default parameterを使用することができます。

function test(foo = "") { 
    "use strict"; 
    if (typeof foo !== 'string') { 
     throw('foo must be a string'); 
    } 
    return foo.replace("bar", "baz"); 
} 

ほとんどの場合、デフォルトのパラメータとmany otherを使用することができますので、私はあなたのビルドプロセスへBabelを追加することを示唆している任意のプロジェクトを便利な機能ES2015は言語に追加されています。 Babelを使用すると、すべてのブラウザがそれらを実装するのを待つことなく、今すぐ使用できます。

関連する問題