【ECMA 262学習シリーズ(二)】パーrseInt詳細
3083 ワード
Table of Constets parseInt(string、radix) 関数処理プロセス: ダミーコード 図解 parseInt(string,radix)
与えられた精度
最初のスペースは無視されます.
ラジクスの値
値
説明
undefinedまたは0
radixは10として処理されます.0 x or 0 Xの先頭の文字列を除いて、16進数として処理されます.
16
文字列を0 xまたは0 Xで開始する必要があります.
関数処理プロセス:は、最初のパラメータを文字列化する タイプは は を返します.
先頭の空の文字(先頭のスペース)に行きます. 初期化シンボルビット もし もし を削除する.精度パラメータ値を32ビット整数に変換する 設定 は、 精度値が範囲外であれば( に戻る.もし を設定したら
もし もし が を設定する.
もし もし を返します.は、 を表す.
擬似符号
与えられた精度
radix
に基づいて、最初のパラメータを数値型に変換する.最初のスペースは無視されます.
ラジクスの値
値
説明
undefinedまたは0
radixは10として処理されます.0 x or 0 Xの先頭の文字列を除いて、16進数として処理されます.
16
文字列を0 xまたは0 Xで開始する必要があります.
関数処理プロセス:
inputString = ToString(string)
.Object
ケースの処理です.primValue = ToPrimitive(input argument, hint String)
ToString(primValue)
値S = trimStart(inputString)
sign = 1
S
が空切の第一文字でないならば、マイナス-
、sign = -1
S
が空切の第一文字が+
または-
でないなら、第一文字R = ToInt32(radix)
stripPrefix = true
R ≠ 0
なら実行される.R < 2 or R > 36
)、直接NaN
R ≠ 16
がstripPrefix = false
R = 0
ならばR = 10
stripPrefix = true
S
が2より大きい場合、前の2つの文字が0x
または0X
であり、その後、前の2つの文字をS
から削除し、R = 16
S
に任意の非精度数字が含まれているなら、Z
値は最初のこのような文字の前のすべての文字からなるサブストリングを設定してください.そうでなければ、Z = S
Z
が空だったら、NaN
mathInt
値がZ
進数文字列の代表的な数字(例えば、8進数Z = 0..
、mathInt = 8
)を設定し、A-Z, a-z
を使用して10 ~ 35
擬似符号
function myParseInt(string, radix) {
// 1. convert `string` to string
let intputString = '' + string
// 2. trim whitespace char
let S = inputString.trim()
// 3. init sign value
let sign = -1
// 4. set sign value by the first char of string
sign = S[0] === '-' ? -1 : sign
const firstChar = S[0]
// 5. to remove the sign char of first char
if (firstChar === '-' || firstChar === '+') {
S = S.substr(1)
}
// 6. convert the radix to int and save it
const R = +radix
// 7. init stripPrefix value(indicate if S has radix char)
let stripPrefix = true
// 8. judge the radix value
if (R !== 0) {
if (R < 2 || R > 36) {
// 7.1 beyond the radix range
return NaN
} else if (R !== 16) {
// 7.2 the 16radix value need to strip the prefix(as. 0x or 0X)
// and other radix dont need to strip prefix
stripPrefix = false
}
} else {
// set to 10 radix if input radix = 0
R = 10
}
// 10. if need to strip prefix
if (stripPrefix) {
// 10.1 if len of S >= 2
if (S.length >= 2) {
const firstTwoChars = S.substr(0, 2)
if (firstTwoChars === '0x' || firstTwoChars === '0X') {
S = S.substr(2)
R = 16
}
}
}
// 11.
}
図解