49

最近、jQuery ソース (最終バージョン 1.9.1、Sizzle パッケージ、129 行目のfunescape関数)に奇妙な行が 1 つ見つかりました。

funescape = function( _, escaped ) {
    var high = "0x" + escaped - 0x10000;
    // NaN means non-codepoint
    return high !== high ?            // <--- LINE 129
        escaped :
        // BMP codepoint
        high < 0 ?
            String.fromCharCode( high + 0x10000 ) :
            // Supplemental Plane codepoint (surrogate pair)
            String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
};

high !== high比較する理由は何ですか?return escaped実行されることはないようです。それとも何かが恋しいですか?

参考: jQuery シズル

4

3 に答える 3

59

実際、それはすぐ上のコメントに書かれています:

//NaNは非コードポイントを意味します

NaNしたがって、JavaScriptの場合と同様に、ケースを処理するには、最初にこの比較を実行する必要があります。

NaN === NaNを返しますfalse

James Wisemanが指摘したように、開発者がhigh !== high代わりに使用した理由を知ることも重要isNaN(high)です。

それは確かにパフォーマンスに基づいています。このテストa !== aは、がの20倍速いことを示していisNaN(a)ます。

zzzzBovisNaN()は、上書きされる可能性があることも示しています!==

Benjamin Gruenbaumからの詳細情報:

NaNは他の何にも等しくないこと、また厳密な意味で他の何にも等しくないことも注目に値します。

そしてJanDvorakから:

また、注意{valueOf:function(){return{}}}はそれ自体に等しい

于 2013-02-08T12:12:38.987 に答える
13

highがの場合、条件high !== highはtrueを返します。jQueryの連中が代わりにNaNあまり明確な関数を使用しなかったのはなぜだろうかと思いますisNaN(high)が、それはおそらくkoopajahが指摘したパフォーマンス上の理由によるものです。

NaNNot- --umber aNは、として表現できない結果を意味しNumberます。未定の番号です。


なぜNaN===NaNはfalseを返すのですか?

検討

0/0          = NaN
Math.asin(2) = NaN

0/0あなたはそれがとは違うことを知っているMath.asin(2)ので、なぜNaN等しいのNaNでしょうか?

于 2013-02-08T12:16:18.660 に答える
6

ここのコメントのいくつかに便乗していますが、これは価値のある情報だと思います.

元の質問に対するいくつかのコメントは、NaN をチェックするこの方法が実際にはよりもはるかに高速であることを示唆しています。isNaN()

次の代替案と組み合わせて使用​​するとparseInt parseFloat、数値に変換してその数値状態を確認する非常に高速な方法が得られます。

ゼロの減算は、ある種の JavaScript パフォーマンス トリックですか?

だから代わりに

function Translated(val) {
    var x = parseFloat(val);
    if (!isNaN(x)) {
        alert("Not a number");
    }
}

私たちは持てる

function WTF(val) {
    var x = val - 0;
    if (x !== x) {
        alert("Not a number");
    }
}
于 2013-02-08T12:29:58.483 に答える