ทำอย่างไรparseInt()
และNumber()
ทำงานแตกต่างกันเมื่อแปลงสตริงเป็นตัวเลข?
ทำอย่างไรparseInt()
และNumber()
ทำงานแตกต่างกันเมื่อแปลงสตริงเป็นตัวเลข?
คำตอบ:
ดีที่พวกเขามีความแตกต่างกันความหมายที่Number
คอนสตรัคเรียกว่าเป็นฟังก์ชั่นการดำเนินการแปลงชนิดและparseInt
ดำเนินการแยกเช่น:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
โปรดทราบว่าหากparseInt
ตรวจพบศูนย์นำบนสตริงมันจะแยกตัวเลขในฐานแปดซึ่งมีการเปลี่ยนแปลงใน ECMAScript 5 ซึ่งเป็นรุ่นใหม่ของมาตรฐาน แต่จะใช้เวลานานในการใช้เบราว์เซอร์ ความไม่ลงรอยกันกับ ECMAScript 3) นอกจากนี้ยังparseInt
จะละเว้นอักขระต่อท้ายที่ไม่สอดคล้องกับตัวเลขใด ๆ ของฐานที่ใช้ในปัจจุบัน
คอนNumber
สตรัคไม่ตรวจจับ octals:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
แต่สามารถจัดการตัวเลขในรูปแบบเลขฐานสิบหกได้เช่นparseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
นอกจากนี้โครงสร้างที่ใช้กันอย่างแพร่หลายเพื่อทำการแปลงชนิดตัวเลขคือUnary +
Operator (หน้า 72)ซึ่งเทียบเท่ากับการใช้ตัวNumber
สร้างเป็นฟังก์ชัน:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
ไม่จัดการกับ octals เหมือนฐานสิบหกและไบนารี:Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
สองรายการแรกจะให้ประสิทธิภาพที่ดีขึ้นเนื่องจากส่งคืนค่าดั้งเดิมแทนวัตถุ
new Number()
แตกต่างจาก Number()
จาก typeof Number("123") => number
new Number("1") != new Number("1")
ด้วย ไม่เคยใช้ new Number
ไม่เคยไม่เคยไม่เคยไม่เคย Number("1")
ในทางกลับกันมีเหตุผลอย่างสมบูรณ์แบบ
let x = new Number("2"); let y = new Number("2");
จากนั้นจึงทำการตรวจสอบความเท่าเทียมกันไม่ว่าด้วยเหตุผลใดก็ตามควรจะเรียกว่าif (x == y) { doSomething(); }
มีเหตุผล doSomething
แต่มันจะไม่ นอกจากนี้หากคุณต้องวิเคราะห์ตัวเลขเพียงหนึ่งหมายเลขlet x = new Number("2");
ก็x === 2
จะเป็นเท็จ นั่นเป็นเหตุผลที่ชัดเจนว่าทำไมคุณไม่ควรใช้new Number
หากคุณกำลังมองหาประสิทธิภาพแล้วผลลัพธ์ที่ดีที่สุดอาจเป็นไปได้ว่าคุณจะได้รับการเปลี่ยนระดับบิตตามค่า"10">>0
เล็กน้อย คูณด้วย ( "10" * 1
) หรือไม่ ( ~~"10"
) ทั้งหมดนั้นเร็วกว่าNumber
และparseInt
มาก พวกเขายังมี "คุณสมบัติ" กลับ 0 เนื่องจากไม่มีการโต้แย้งตัวเลข นี่คือการทดสอบประสิทธิภาพ
Number
และparseInt
ยังช้ากว่า 99% ที่เหลือ นอกจากนี้สำหรับฉันแล้วพวกเขาก็มีเสน่ห์ดึงดูดสายตาน้อยลงเช่นกัน :-)
parseInt
หรือNumber
เป็นที่นิยมมากกว่า หากคุณกำลังเขียนโปรแกรมจำลอง N64 ด้วยการแปลงหลายล้านต่อวินาทีคุณอาจพิจารณาเทคนิคเหล่านั้น
(2**31).toString() >> 0
-2147483648
คุณสามารถใช้>>>
แทน>>
ให้ JavaScript ปฏิบัติต่อตัวถูกดำเนินการเป็นจำนวนเต็ม 32 บิตที่ไม่ได้ลงนามแต่จากนั้นตัวเลขใด ๆ ที่ใหญ่กว่า2**32 - 1
จะล้น
ผมพบว่าการเชื่อมโยงสองของประสิทธิภาพการเปรียบเทียบในหลายวิธีในการแปลงไปstring
int
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
หนึ่งความแตกต่างเล็ก ๆ น้อย ๆ เป็นสิ่งที่พวกเขาแปลงของundefined
หรือnull
,
Number() Or Number(null) // returns 0
ในขณะที่
parseInt() Or parseInt(null) // returns NaN
parseInt()
:
NaN
จะถูกส่งคืนparseInt()
ฟังก์ชันพบค่าที่ไม่ใช่ตัวเลขฟังก์ชันจะตัดส่วนที่เหลือของสตริงป้อนเข้าออกและแยกวิเคราะห์เฉพาะส่วนจนกระทั่งค่าที่ไม่ใช่ตัวเลขundefined
หรือ 0 JS จะถือว่าสิ่งต่อไปนี้:
ES5
ระบุว่า 10 ควรใช้แล้ว อย่างไรก็ตามเบราว์เซอร์ทั้งหมดนี้ไม่รองรับดังนั้นจึงควรระบุ radix เสมอหากหมายเลขของคุณสามารถขึ้นต้นด้วย 0Number()
:
Number()
สร้างสามารถแปลงอินพุตอาร์กิวเมนต์ใด ๆ ให้เป็นตัวเลข หากตัวNumber()
สร้างไม่สามารถแปลงอินพุตเป็นตัวเลขNaN
จะถูกส่งคืนNumber()
0x
console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
ฉันใช้ parseInt เสมอ แต่ระวังเลขศูนย์นำหน้าที่จะบังคับให้เข้าสู่โหมดเลขฐานแปด
parseInt(value, radix)
วิธีการที่คุณไม่ได้มีอุบัติเหตุฐานแปดโหมดการแปลง ฯลฯ
0
แม้ในโหมดที่ไม่เข้มงวด แต่ตอนนี้ได้รับการแก้ไขและศูนย์ชั้นนำในขณะนี้จะถูกละเว้นเพียงเพื่อที่จะกลายเป็นparseInt("070")
70
parseInt()
เช่นกันที่จะเตือนคุณที่จะให้ค่ารากลง
parseInt()
-> แยกวิเคราะห์ตัวเลขเพื่อ redix ที่ระบุ
Number()
-> แปลงค่าที่ระบุให้เทียบเท่ากับตัวเลขหรือ NaN หากไม่สามารถทำเช่นนั้นได้
ดังนั้นสำหรับการแปลงค่าที่ไม่ใช่ตัวเลขให้เป็นตัวเลขเราควรใช้ฟังก์ชัน Number () เสมอ
เช่น.
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
มีหลายมุมให้เลือก parseInt()
เรือนทำงานเช่นเดียวกับการแปลง Redix ดังนั้นเราจึงควรหลีกเลี่ยงการใช้ฟังก์ชั่น parseInt () เพื่อวัตถุประสงค์ในการ coersion
ตอนนี้เพื่อตรวจสอบสภาพอากาศค่าที่ให้เป็นตัวเลขหรือไม่เราควรใช้isNaN()
ฟังก์ชั่นพื้นเมือง
parseInt แปลงเป็นตัวเลขจำนวนเต็มนั่นคือมันจะตัดทศนิยม Number ไม่แปลงเป็นจำนวนเต็ม
มันเป็นความคิดที่ดีที่จะอยู่ห่างจาก parseInt และใช้ Number และ Math.round เว้นแต่ว่าคุณต้องการเลขฐานสิบหกหรือฐานแปด ทั้งสองสามารถใช้สตริง ทำไมต้องอยู่ห่างจากมัน
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
มันสมบูรณ์ฆ่าเนื้อจำนวนมากหรือเล็กจริง ๆ มันผิดปกติพอทำงานได้ตามปกติถ้าอินพุตเหล่านี้เป็นสตริง
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
แทนที่จะเสี่ยงต่อการหาจุดบกพร่องด้วยสิ่งนี้และคนอื่น ๆ ที่กล่าวถึง gotchas ฉันจะหลีกเลี่ยงการแยกวิเคราะห์ยกเว้นว่าคุณจำเป็นต้องแยกวิเคราะห์สิ่งอื่นนอกเหนือจากฐาน 10 จำนวน, Math.round, Math.foor และ. toFixed (0) ทำสิ่งเดียวกันแยกวิเคราะห์สามารถใช้โดยไม่ต้องมีข้อผิดพลาดประเภทนี้
หากคุณต้องการหรือจำเป็นต้องใช้การแยกวิเคราะห์สำหรับคุณสมบัติอื่น ๆ ของมันอย่าใช้เพื่อแปลงการลอยตัวเป็น ints