lodashソース分析のNaNはNaNではありません.
6290 ワード
片思いの純粋さは、結果を求めず、自分を一方的な関係に閉じ込めてしまうことにあります.
——梁文道『ひそかに思いを寄せてのぞきます』
本文はlodashのソースコードの第五編を読むために、後続の文章はこの倉庫に更新されます.スターを歓迎します.
git bookも同時に倉庫の更新ができます.gitbookアドレス:pocket-lodash
この分析は
役割と使い方
SameValue NonNumber
この仕様で規定されている比較値 ではありません. もし に戻る.もし に戻る.は、 に戻る.は、 に戻る.は、 に戻る.は、 に戻る.
Strict Equality Compparison
js中の全等(は、 に戻る.の場合、 a. に戻る. b. に戻る. c.もし を返します. d. に戻る. e. に戻る. f. を返します.
はSameValueNonNumberの結果によって に戻ります.
SameValue
仕様は以下の通りですは、 に戻る.もし a. に戻る. b. に戻る. c. に戻る. d.もし を返します. e. を返します.
はSameValueNonNumberの結果によって に戻ります.
SameValue Zero
これはは、 に戻る.もし a. に戻る. b. に戻る. c. に戻る. d.もし を返します. e. を返します.
はSameValueNonNumberの結果によって に戻ります.
小結:
ソース分析
まず、第一部を見ます.
以下の部分は処理
このようにして、
Object.is()を使ってもいいですか?
isNaNを使ってもいいですか?
Number.isNaN()を使ってもいいですか? ECMAScript® 2016 Language Specification MDN:Number.isNaN() MDN:isNaN() License
署名-非商業的使用-演繹禁止4.0国際(CC BY-NC-ND 4.0)
最後に、すべての文章が同時にWeChat公衆番号に送られます.ご注目ください.ご意見をどうぞ.
対角線の反対側
——梁文道『ひそかに思いを寄せてのぞきます』
本文はlodashのソースコードの第五編を読むために、後続の文章はこの倉庫に更新されます.スターを歓迎します.
git bookも同時に倉庫の更新ができます.gitbookアドレス:pocket-lodash
この分析は
eq
関数です.役割と使い方
eq
関数は、2つの値が等しいかどうかを比較するために使用される.遵守しているのはサマーヴェルエZero仕様です.var obj1 = {test: 1}
var obj2 = {test: 1}
var obj3 = obj1
_.eq(1,1) // true
_.eq(+0, -0) // true
_.eq(obj1, obj3) // true
_.eq(obj1, obj2) // false
_.eq(NaN, NaN) // false
いくつかの比較規範SameValue NonNumber
この仕様で規定されている比較値
x
およびy
は、Number
タイプではなく、コピー仕様は以下の通りである.x
のタイプはNumber
タイプy
のタイプはx
のタイプと一致しています.x
のタイプがUndefined
であれば、true
x
のタイプがNull
であれば、true
x
のタイプがString
であり、x
とy
の長さ及び符号化が同じであれば、true
に戻り、そうでなければfalse
x
のタイプがBoolean
であり、x
とy
と同じtrue
であるか、または同じfalse
であるか、true
に戻り、そうでなければfalse
x
のタイプがSymbol
であり、x
とy
とが同じSymbol
の値を持っている場合、true
に戻り、そうでなければfalse
x
およびy
が同じオブジェクトを指す場合、true
に戻り、そうでなければfalse
Strict Equality Compparison
js中の全等(
===
)はこの規定に従います.x
とy
のタイプが異なる場合、false
x
はNumber
タイプである:x
がNaN
であれば、false
y
がNaN
であれば、false
x
とy
の数値が一致したら、true
x
が+0
であり、y
が-0
である場合、true
x
が-0
、y
が+0
であれば、true
false
SameValue
仕様は以下の通りです
x
とy
のタイプが異なる場合、false
x
のタイプがNumber
だったらx
がNaN
、y
がNaN
であれば、true
x
が+0
であり、y
が-0
である場合、false
x
が-0
であり、y
が+0
である場合、false
x
とy
の数値が一致したら、true
false
SameValue Zero
これは
eq
準拠の仕様です.x
とy
のタイプが異なる場合、false
x
のタイプがNumber
だったらx
がNaN
、y
がNaN
であれば、true
x
が+0
であり、y
が-0
である場合、true
x
が-0
であり、y
が+0
である場合、true
x
とy
の数値が一致したら、true
false
小結:
SameValueNonNumber
は基本であり、Strict Equality Comparison
、SameValue
、SameValueZero
、+0
に対してのみ違いがあります.ソース分析
-0
のソースコードを見てください.function eq(value, other) {
return value === other || (value !== value && other !== other)
}
実はNaN
のソースコードはこのようにしかありません.eq
が準拠しているのはeq
規格です.ソースコードを分解して、どのように規格に合っているかを見てください.まず、第一部を見ます.
value === other
このように、該当するのはeq
仕様で、比較によって、SameValueZero
とStrict Equality Comparison
はStrict Equality Comparison
に対してのみ区別があることが分かります.SameValueZero
は、NaN
とStrict Equality Comparison
が全部x
である場合でも、y
に戻り、NaN
に戻ります.しかし、false
はNaN === NaN
とfalse
の両方がSameValueZero
であるときに戻ってくる規定です.したがって、x
に基づいてy
を処理するだけでよい.以下の部分は処理
NaN
である.(value !== value && other !== other)
jsにおいては、true
と自身だけが等しくない.2つの比較が必要な値がすべて自身と等しくない場合、この2つの値はいずれもStrict Equality Comparison
であり、NaN
に戻ることを示す.このようにして、
NaN
の比較に従って実現される.Object.is()を使ってもいいですか?
NaN
はNaN
に戻るので、true
も同様に、function eq(value, other) {
return value === other || Object.is(value, other)
}
SameValueZero
も同じかどうかの比較ですが、Object.is(NaN, NaN)
はtrue
に戻り、eq
に従っているので、Object.is
を直接Object.is(+0, -0)
に置き換えることはできません.isNaNを使ってもいいですか?
false
の大域的な方法もあり、1つの値がSameValue
であるかどうかを判断するために使用されてもよい.例えばObject.is
はeq
に戻りますが、isNaN
は次のような形に変えられますか?function eq(value, other) {
return value === other || (isNaN(value) && isNaN(other))
}
いけません.NaN
には、着信パラメータがisNaN(NaN)
タイプでない場合、true
タイプに変換してからeq
かどうかを判断する奇異な行動がある.したがって、isNaN
のように戻ってきたのもNumber
であり、文字列Number
は、まずNaN
に変換されてから判断されるので、これは私たちが望む結果ではない.Number.isNaN()を使ってもいいですか?
isNaN('notNaN')
の欠陥を修復するために、true
はnotNaN
オブジェクトにNaN
方法を拡張し、isNaN
であるときだけes6
に戻るので、Number
で安全であると判断する.したがって、isNaN
も以下のように変更することができる.function eq(value, other) {
return value === other || (Number.isNaN(value) && Number.isNaN(other))
}
参照署名-非商業的使用-演繹禁止4.0国際(CC BY-NC-ND 4.0)
最後に、すべての文章が同時にWeChat公衆番号に送られます.ご注目ください.ご意見をどうぞ.
対角線の反対側