มีอย่างน้อย 5 วิธีในการดำเนินการนี้:
หากคุณต้องการแปลงเป็นจำนวนเต็มเท่านั้นวิธีอื่นที่เร็ว (และสั้น) คือdouble-bitwise not (เช่นใช้อักขระทิลเดอสองตัว):
เช่น
~~x;
อ้างอิง: http://james.padolsey.com/cool-stuff/double-bitwise-not/
วิธีทั่วไป 5 วิธีที่ฉันรู้จนถึงตอนนี้ในการแปลงสตริงเป็นตัวเลขล้วนมีความแตกต่าง (มีตัวดำเนินการระดับบิตมากกว่าที่ใช้งานได้ แต่ทั้งหมดนี้ให้ผลลัพธ์เหมือนกัน~~) JSFiddle นี้แสดงผลลัพธ์ที่แตกต่างกันที่คุณคาดหวังในคอนโซลการแก้ปัญหา: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"2147483648",
"4999999999"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" ~~x = " + ~~x);
}
คอนโซลดีบัก:
123
Number(x) = 123
parseInt(x, 10) = 123
parseFloat(x) = 123
+x = 123
~~x = 123
undefined
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
null
Number(x) = 0
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = 0
~~x = 0
"not a number"
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
123.45
Number(x) = 123.45
parseInt(x, 10) = 123
parseFloat(x) = 123.45
+x = 123.45
~~x = 123
1234 error
Number(x) = NaN
parseInt(x, 10) = 1234
parseFloat(x) = 1234
+x = NaN
~~x = 0
2147483648
Number(x) = 2147483648
parseInt(x, 10) = 2147483648
parseFloat(x) = 2147483648
+x = 2147483648
~~x = -2147483648
4999999999
Number(x) = 4999999999
parseInt(x, 10) = 4999999999
parseFloat(x) = 4999999999
+x = 4999999999
~~x = 705032703
~~xผลรุ่นจำนวนใน "มากกว่า" กรณีที่คนอื่นมักจะส่งผลให้มีundefinedแต่จะล้มเหลวสำหรับการป้อนข้อมูลที่ไม่ถูกต้อง (เช่นมันจะกลับมา0ถ้าสตริงมีอักขระจำนวนไม่ใช่หลังจากที่ตัวเลขที่ถูกต้อง)
ล้น
โปรดทราบ: จำนวนเต็มล้นและ / หรือการตัดบิตอาจเกิดขึ้น~~ได้กับ Conversion อื่น ๆ แม้ว่าจะเป็นเรื่องผิดปกติที่จะป้อนค่าจำนวนมากเช่นนี้ แต่คุณต้องตระหนักถึงสิ่งนี้ ตัวอย่างที่อัปเดตเพื่อรวมค่าที่ใหญ่กว่ามาก
การทดสอบ Perf บางรายการระบุว่ามาตรฐานparseIntและparseFloatฟังก์ชันเป็นตัวเลือกที่เร็วที่สุดซึ่งคาดว่าเบราว์เซอร์จะได้รับการปรับให้เหมาะสม แต่ทั้งหมดขึ้นอยู่กับความต้องการของคุณเนื่องจากตัวเลือกทั้งหมดนั้นเร็วพอ : http://jsperf.com/best-of-string-to -number แปลง / 37
ทั้งหมดนี้ขึ้นอยู่กับวิธีกำหนดค่าการทดสอบความสมบูรณ์แบบเนื่องจากการแสดง parseInt / parseFloat จะช้ากว่ามาก
ทฤษฎีของฉันคือ:
- โกหก
- เส้นยี้
- สถิติ
- ผลลัพธ์ JSPerf :)