ไหนดีกว่ากัน
ฉันขอสิ่งนี้เพื่อการโกนสักสองสามไบต์เนื่องจากฉันสามารถใช้ + x แทน number (x) parsefloat ทำสิ่งที่ดีกว่านี้หรือไม่?
ไหนดีกว่ากัน
ฉันขอสิ่งนี้เพื่อการโกนสักสองสามไบต์เนื่องจากฉันสามารถใช้ + x แทน number (x) parsefloat ทำสิ่งที่ดีกว่านี้หรือไม่?
คำตอบ:
parseFloat
/ ใช้parseInt
สำหรับการวิเคราะห์สตริงในขณะที่Number
/ ใช้+
สำหรับการบังคับค่าให้กับตัวเลข พวกเขาทำงานแตกต่างกัน แต่ก่อนอื่นเรามาดูว่าพวกเขาประพฤติตนอย่างไร:
parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
ดังนั้นตราบใดที่คุณมีอินพุตตัวเลขมาตรฐานไม่มีความแตกต่าง อย่างไรก็ตามหากการป้อนข้อมูลของคุณเริ่มต้นด้วยตัวเลขแล้วมีอักขระอื่น ๆ ให้parseFloat
ตัดทอนตัวเลขออกจากสตริงในขณะที่Number
ให้NaN
(ไม่ใช่ตัวเลข):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
นอกจากนี้Number
เข้าใจอินพุตฐานสิบหกขณะที่parseFloat
ไม่:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
แต่Number
ทำตัวประหลาดกับสตริงว่างหรือสตริงที่มีพื้นที่สีขาวเท่านั้น:
parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
โดยรวมแล้วฉันคิดว่าNumber
มีเหตุผลมากกว่าดังนั้นฉันจึงมักจะใช้Number
เป็นการส่วนตัว (และคุณจะพบว่ามีการใช้งานจาวาสคริปต์ภายในจำนวนมากNumber
เช่นกัน) ถ้าคนประเภทฉันชอบที่จะแสดงให้เห็นข้อผิดพลาดมากกว่าการรักษามันราวกับว่าพวกเขาได้พิมพ์'1x'
'1'
ครั้งเดียวที่ฉันทำข้อยกเว้นจริงๆคือเมื่อฉันแปลงสไตล์เป็นตัวเลขซึ่งในกรณีนี้parseFloat
มีประโยชน์เพราะสไตล์มีรูปแบบเช่น'3px'
ในกรณีที่ฉันต้องการวาง'px'
ส่วนและเพิ่งได้รับ3
ดังนั้นฉันจึงพบว่ามีparseFloat
ประโยชน์ ที่นี่ แต่จริงๆแล้วรูปแบบใดที่คุณเลือกนั้นขึ้นอยู่กับคุณและรูปแบบของข้อมูลที่คุณต้องการยอมรับ
โปรดทราบว่าการใช้ตัวดำเนิน+
การunary นั้นเหมือนกับการใช้Number
ฟังก์ชั่น:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
ดังนั้นฉันมักจะใช้+
สั้น ๆ ตราบใดที่คุณรู้ว่ามันทำอะไรฉันก็อ่านง่าย
Number()
ในฐานะ "แปลก" ฉันจะพิจารณาว่ามันเป็นไปตามที่คาดหวังมากกว่า whitespace เป็นค่าว่าง แต่มันไม่ใช่ null / undefined => 0 เป็นผลลัพธ์ที่ดี ยิ่งใหญ่ (+) สำหรับคุณเพื่อนำเสนอต่อไป :) :)
Number('Infinity') === Infinity
ในขณะที่parseInt('Infinity') === NaN
+
(unary plus) สำหรับสิ่งนี้เพราะถ้าคุณลืมเครื่องหมายอัฒภาคในบรรทัดก่อนหน้านิพจน์การบวกอาจถูกประเมินแทน
ความแตกต่างคือสิ่งที่เกิดขึ้นเมื่ออินพุตไม่ใช่ "หมายเลขที่เหมาะสม" Number
ส่งคืนNaN
ขณะที่parseFloat
วิเคราะห์คำว่า "มากที่สุด" หากเรียกร้องสตริงว่างNumber
ผลตอบแทนในขณะที่ผลตอบแทน0
parseFloatNaN
ตัวอย่างเช่น:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
แม้ว่า
NaN != NaN
ประเมินเป็นTRUE - ขอบคุณสำหรับเคล็ดลับ!
isNaN(NaN)
คืนtrue
ในตัวอย่างเหล่านี้คุณสามารถเห็นความแตกต่าง:
Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;
parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
parseFloat ช้าลงเล็กน้อยเนื่องจากค้นหาการปรากฏตัวครั้งแรกของตัวเลขในสตริงในขณะที่ Number constuctor สร้างอินสแตนซ์จำนวนใหม่จากสตริงที่มีค่าตัวเลขที่มีช่องว่างหรือที่มีค่าเท็จ
ป.ล. หากคุณสนใจโซลูชันการแปลงประเภทสากลคุณสามารถอ่านโพสต์เกี่ยวกับการแปลงประเภทในบล็อกของฉัน: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
สำหรับสตริงว่างพวกเขาจะแตกต่างกัน
+""
และNumber("")
ส่งคืน 0 ขณะที่parseFloat("")
ส่งคืน NaN
parseFloat()
มีผลถูกต้องเป็นสตริงว่างเปล่าไม่ใช่ตัวเลข0
(อ่าน: NaN) ในขณะที่สตริงที่มีตัวละคร"0"
อยู่ในนั้นคือ0
;
+x
ส่งคืน0
ไม่เพียง แต่สำหรับสตริงว่าง แต่ยังสำหรับสตริงช่องว่างเท่านั้น ตัวอย่าง: +" "
, +"\t\t\t"
, +"\n\n"
- ทั้งหมดของพวกเขาให้0
เป็นผล
เท่าที่ฉันรู้และนี่เป็นเพียงการได้ยินจากเพื่อนร่วมงานดังนั้นอาจได้รับการแจ้งว่าป่วยโดยสิ้นเชิง parseFloat นั้นเร็วกว่าเล็กน้อย
แม้ว่าจะทำการค้นคว้าเพิ่มเติมต่อไปดูเหมือนว่าความแตกต่างด้านประสิทธิภาพนี้ขึ้นอยู่กับเบราว์เซอร์
http://jsperf.com/parseint-vs-parsefloat/6
ดูผล jsPerf เหล่านี้และโทรหาคุณ (มันรวมการทดสอบ + x ด้วย)
ตามที่ระบุไว้ในคำตอบของ @xdazz +""
และNumber("")
กลับมา0
ในขณะที่parseFloat("")
ส่งกลับNaN
อีกครั้งฉันจะไปกับ parseFloat เพราะสตริงว่างไม่ได้หมายความว่าหมายเลข 0 เพียงสตริงที่มีอักขระ"0"
ในนั้นหมายถึง 0;
parseFloat()
ยังคงเป็นผู้ชนะ