コード仕様で配列/文字列のlastIndexOf矛盾した結果
[3, 1, 3].lastIndexOf(3)
2
[3, 1, 3].lastIndexOf(3, undefined)
0 // wtf?
//ok, lets compare with string
'313'.lastIndexOf(3)
2
'313'.lastIndexOf(3, undefined)
2 //wow!
コード仕様で配列/文字列のlastIndexOf矛盾した結果
[3, 1, 3].lastIndexOf(3)
2
[3, 1, 3].lastIndexOf(3, undefined)
0 // wtf?
//ok, lets compare with string
'313'.lastIndexOf(3)
2
'313'.lastIndexOf(3, undefined)
2 //wow!
異なるアルゴリズムを説明する自己です。
一つはNaN
ため0
を代入した、提供された場合Array versionがその第2パラメータにToInteger()
を行います。
- fromIndexの引数が渡された場合、nはToInteger(fromIndex)となります。そうでなければ、nをlen-1とする。
String versionは代替なしNaN
が返されており、一方が提供されたか否かにかかわらず、その第二パラメータにToNumber()
を使用するため、アルゴリズムは、手動NaN
ためInfinity
を代入します。
- numPosをToNumber(位置)とします。 (positionが未定義の場合、このステップは値NaNを生成します)。
- ReturnIfAbrupt(numPos)。
- numPosがNaNの場合、posを+∞とします。そうでなければ、posをToInteger(numPos)とする。
、我々は唯一の推測できる理由として
が、Array
バージョンは2 (ES5)の新しいですので、彼らはNaN
に置き換えされたほうが良いだろうと判断している必要があります0
、それは少なくともそれを考慮して少し意味をなさない偽評価(必ずしもそれは関係ない)。
indexOfメソッドでは意味がありますが、lastIndexOfでは意味がありません。 – kemsky
'Number(undefined)' => 'NaN'; '[3,1,3]。lastIndexOf(3、NaN);' => '0'。だから私は、 'from-index'の解析に失敗した場合に意図的なエラーでなければならないと仮定します。なぜそれは明らかに「0」(結果ではなく「from-index」) 。 –