ฉันกำลังอ่านสิ่งนี้แต่ฉันสับสนกับสิ่งที่เขียนในparseInt ด้วยบทโต้แย้ง radix
ทำไมมันจึงเป็นที่parseInt(8, 3)
→ NaN
และparseInt(16, 3)
→ 1
?
AFAIK 8 และ 16 ไม่ใช่ตัวเลขเบส -3 ดังนั้นparseInt(16, 3)
ควรส่งคืนNaN
ด้วย
ฉันกำลังอ่านสิ่งนี้แต่ฉันสับสนกับสิ่งที่เขียนในparseInt ด้วยบทโต้แย้ง radix
ทำไมมันจึงเป็นที่parseInt(8, 3)
→ NaN
และparseInt(16, 3)
→ 1
?
AFAIK 8 และ 16 ไม่ใช่ตัวเลขเบส -3 ดังนั้นparseInt(16, 3)
ควรส่งคืนNaN
ด้วย
คำตอบ:
นี่คือสิ่งที่ผู้คนเดินทางตลอดเวลาแม้ว่าพวกเขาจะรู้ :-) คุณเห็นสิ่งนี้ด้วยเหตุผลเดียวกันparseInt("1abc")
ส่งคืน 1: parseInt
หยุดที่อักขระที่ไม่ถูกต้องตัวแรกและส่งคืนสิ่งที่มีอยู่ ณ จุดนั้น หากไม่มีอักขระที่ถูกต้องในการวิเคราะห์NaN
คำ
parseInt(8, 3)
หมายถึง "แยกวิเคราะห์"8"
ในฐาน 3" (โปรดทราบว่าจะแปลงตัวเลข8
เป็นสตริง; รายละเอียดในข้อมูลจำเพาะ ) แต่ในฐานที่ 3 ตัวเลขหลักเดียวเป็นเพียง0
, และ1
2
มันก็เหมือนกับการขอให้มันแยกเป็น"9"
แปด เนื่องจากมีไม่มีNaN
อักขระที่ถูกต้องที่คุณได้
parseInt(16, 3)
กำลังขอให้แยกวิเคราะห์"16"
ในฐาน 3 เนื่องจากสามารถแยกวิเคราะห์1
แล้วทำและหยุดที่6
เนื่องจากไม่สามารถแยกวิเคราะห์ได้ ดังนั้นมันจึงกลับ1
มา
เนื่องจากคำถามนี้ได้รับความสนใจเป็นอย่างมากและอาจอยู่ในอันดับที่สูงในผลการค้นหานี่คือบทสรุปของตัวเลือกสำหรับการแปลงสตริงเป็นตัวเลขใน JavaScript โดยใช้ idiosyncracies และแอปพลิเคชันต่าง ๆ (ยกจากคำตอบอื่นของฉันที่นี่)
parseInt(str[, radix])
- แปลงจุดเริ่มต้นของสตริงให้มากที่สุดเท่าที่จะเป็นจำนวนเต็ม (จำนวนเต็ม) โดยไม่สนใจอักขระพิเศษในตอนท้าย ดังนั้นparseInt("10x")
คือ10
; x
จะถูกละเว้น รองรับอาร์กิวเมนต์ radix (ฐานตัวเลข) ที่เป็นตัวเลือกดังนั้นparseInt("15", 16)
คือ21
( เป็น15
ฐานสิบหก) หากไม่มี radix ให้ถือว่าทศนิยมยกเว้นว่าสตริงนั้นขึ้นต้นด้วย0x
(หรือ0X
) ในกรณีนี้มันจะข้ามมันและถือว่าเป็น hex (เบราว์เซอร์บางตัวใช้เพื่อจัดการกับสตริงที่ขึ้นต้นด้วย0
octal พฤติกรรมดังกล่าวไม่เคยถูกระบุและไม่ได้รับอนุญาตเป็นการเฉพาะในข้อกำหนด ES5)ส่งคืนNaN
หากไม่พบตัวเลขที่สามารถแยกวิเคราะห์ได้
parseFloat(str)
- ชอบparseInt
แต่ทำตัวเลขทศนิยมและสนับสนุนทศนิยมเท่านั้น อักขระพิเศษอีกครั้งบนสตริงจะถูกละเว้นดังนั้นparseFloat("10.5x")
คือ10.5
( x
ถูกละเว้น) รองรับทศนิยมเท่านั้นคือparseFloat("0x15")
คือ0
(เนื่องจากการแยกวิเคราะห์สิ้นสุดที่x
) ส่งคืนNaN
หากไม่พบตัวเลขที่สามารถแยกวิเคราะห์ได้
Unary +
เช่น+str
- (เช่นการแปลงโดยนัย)แปลงสตริงทั้งหมดเป็นตัวเลขโดยใช้ทศนิยมและสัญลักษณ์มาตรฐานของ JavaScript (เฉพาะตัวเลขและจุดทศนิยม = ทศนิยม; 0x
คำนำหน้า = hex; 0o
คำนำหน้า = ฐานแปด [ES2015 +] การใช้งานบางอย่างขยาย เพื่อรักษาผู้นำที่0
เป็นฐานแปด แต่ไม่อยู่ในโหมดเข้มงวด) +"10x"
เป็นNaN
เพราะx
จะไม่ละเว้น +"10"
คือ10
, +"10.5"
คือ10.5
, +"0x15"
คือ21
, +"0o10"
เป็น8
[ES2015 +] มี gotcha: +""
คือ0
ไม่ใช่NaN
อย่างที่คุณคาดหวัง
Number(str)
- เหมือนกับการแปลงโดยนัย (เช่นเช่นเดียวกับที่กล่าว+
ไว้ข้างต้น) แต่ช้ากว่าในการใช้งานบางอย่าง (ไม่ใช่ว่ามันเป็นเรื่องสำคัญ)
parseInt
ใช้ครั้งแรกtoString
กับอาร์กิวเมนต์แรกหรือไม่ นั่นจะทำให้รู้สึก
parseInt
อัลกอริทึม: ecma-international.org/ecma-262/7.0/…
123e-2
ให้1
ตั้งแต่มันกลายเป็น1.23
ครั้งแรกแล้วแยกหยุดที่จุดทศนิยม?
NumberFormatException
แต่ละครั้ง
parseInt
(บีบบังคับอาร์กิวเมนต์แรกสตริง) ทำให้รู้สึก วัตถุประสงค์ของการparseInt
คือการแยกสตริงเป็นจำนวนเต็ม ดังนั้นถ้าคุณให้มันเป็นสิ่งที่ไม่ใช่สตริงการได้รับการแทนสตริงเพื่อเริ่มต้นด้วยความสมเหตุสมผล มันจะทำอย่างไรหลังจากนั้นเป็นเรื่อง 'nother ทั้งหมด ...
ด้วยเหตุผลเดียวกันนั้นเอง
>> parseInt('1foobar',3)
<- 1
ในเอกสาร , parseInt
ใช้เวลาสตริง และ
หากสตริงไม่ใช่สตริงแสดงว่าสตริงนั้นถูกแปลงเป็นสตริง
ดังนั้น16
, 8
หรือ'1foobar'
ถูกแปลงแรกที่จะสตริง
แล้วก็
หาก
parseInt
พบอักขระที่ไม่ใช่ตัวเลขใน radix ที่ระบุไว้ระบบจะละเว้นอักขระนั้นและอักขระที่ประสบความสำเร็จทั้งหมด
หมายความว่ามันสามารถแปลงไปยังจุดที่สามารถทำได้ The 6
, 8
และfoobar
ถูกละเว้นและสิ่งที่ก่อนหน้านี้จะถูกแปลง หากไม่มีอะไรNaN
จะถูกส่งกลับ
/***** Radix 3: Allowed numbers are [0,1,2] ********/
parseInt(4, 3); // NaN - We can't represent 4 using radix 3 [allowed - 0,1,2]
parseInt(3, 3); // NaN - We can't represent 3 using radix 3 [allowed - 0,1,2]
parseInt(2, 3); // 2 - yes we can !
parseInt(8, 3); // NaN - We can't represent 8 using radix 3 [allowed - 0,1,2]
parseInt(16, 3); // 1
//'16' => '1' (6 ignored because it not in [0,1,2])
/***** Radix 16: Allowed numbers/characters are [0-9,A-F] *****/
parseInt('FOX9', 16); // 15
//'FOX9' => 'F' => 15 (decimal value of 'F')
// all characters from 'O' to end will be ignored once it encounters the out of range'O'
// 'O' it is NOT in [0-9,A-F]
ตัวอย่างเพิ่มเติม:
parseInt('45', 13); // 57
// both 4 and 5 are allowed in Radix is 13 [0-9,A-C]
parseInt('1011', 2); // 11 (decimal NOT binary)
parseInt(7,8); // 7
// '7' => 7 in radix 8 [0 - 7]
parseInt(786,8); // 7
// '78' => '7' => 7 (8 & next any numbers are ignored bcos 8 is NOT in [0-7])
parseInt(76,8); // 62
// Both 7 & 6 are allowed '76' base 8 decimal conversion is 62 base 10