1

console && (typeof console.log === "function") && console.log('contains called');この関数で実行している文字列:

(function ($) {
$.validator.addMethod('contains', function (value, element, param) {
    console && (typeof console.log === "function") && console.log('contains called');
    if (this.optional(element)) { return true; } // let required rule deal with this.

    var pattern = new RegExp('' + param, "gi");
    return value && ('' + value).match(pattern);
}, "Part of the word is invalid");

$.validator.unobtrusive.adapters.add('contains', function (options) {
    var element = options.element,
            message = options.message;
    options.rules['contains'] = $(element).attr('data-val-contains-word');
    if (options.message) {
        options.messages['contains'] = options.message;
    }
});
})(jQuery);

その文字列が次のようなものであるかどうかはわかります。 var var1 = console && (typeof console.log === "function") && console.log('contains called');

または好き:if(console && (typeof console.log === "function") && console.log('contains called'))

バグのあるコードではありません。それは働いています。

4

4 に答える 4

1

ランタイムは最初の条件をチェックします。コンソールがない場合false && ...は、すべての場合にあるため、他の条件のチェックを停止しfalseます。がある場合console、ランタイムは関数であるかどうかをチェックconsole.logし、そうである場合はコンソールに何かを記録します。これはshort-curcuit-evaluationと呼ばれます。そうしないと、ランタイムは常に各条件を実行しようとするため、コンソール オブジェクトがない場合などにランタイム エラーが発生します。

于 2013-02-09T10:23:03.393 に答える
1

ブラウザのコンソールに何かを書き込むだけです..ただし、そのコンソールが利用可能で、「ログ」機能がある場合のみ。最初の 2 つの条件によって 3 つ目の条件が実行されなくなる可能性があるため、console.log(..) が存在しない場合でも js エラーは発生しません。

于 2013-02-09T10:20:25.723 に答える
1

読みにくい書き方です:

if (console && (typeof console.log === "function")) {
  console.log('contains called');
}

結果に対して何もしない式を書くことができ、ステートメントも式であり、式の中に何かを書くことができるという事実を (誤って) 使用しています。

于 2013-02-09T10:32:13.983 に答える
0

それは同じことをしています

if (console && (typeof console.log === "function")) {
    console.log('contains called');
}

インタープリターは、何かが false になるとすぐに停止するため、関数がないconsole.log場合は呼び出されconsoleませんlog。この関数が存在するかどうかも、存在しない場合もチェックconsoleしません。

于 2013-02-09T10:36:17.130 に答える