Có ít nhất 5 cách để làm điều này:
Nếu bạn chỉ muốn chuyển đổi thành số nguyên, một cách nhanh chóng (và ngắn gọn) khác là không bit theo chiều kép (tức là sử dụng hai ký tự dấu ngã):
ví dụ
~~x;
Tham khảo: http://james.padolsey.com/cool-stuff/double-bitwise-not/
5 cách phổ biến mà tôi biết cho đến nay để chuyển đổi một chuỗi thành một số đều có sự khác biệt (có nhiều toán tử bitwise hoạt động hơn, nhưng tất cả đều cho kết quả giống nhau ~~). JSFiddle này hiển thị các kết quả khác nhau mà bạn có thể mong đợi trong bảng điều khiển gỡ lỗi: 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);
}
Bảng điều khiển gỡ lỗi:
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
Các ~~xkết quả phiên bản trong một số trong "nhiều hơn" trường hợp, nơi những người khác thường dẫn đến undefined, nhưng nó không cho vào không hợp lệ (ví dụ như nó sẽ trở lại 0nếu chuỗi chứa ký tự không phải số sau khi một số hợp lệ).
Tràn ra
Xin lưu ý: Tràn số nguyên và / hoặc cắt bớt bit có thể xảy ra với ~~, nhưng không xảy ra với các chuyển đổi khác. Mặc dù việc nhập các giá trị lớn như vậy là không bình thường, nhưng bạn cần lưu ý điều này. Đã cập nhật ví dụ để bao gồm các giá trị lớn hơn nhiều.
Một số thử nghiệm Perf chỉ ra rằng tiêu chuẩn parseIntvà parseFloatchức năng thực sự là những lựa chọn nhanh nhất, có lẽ được trình duyệt tối ưu hóa cao, nhưng tất cả phụ thuộc vào yêu cầu của bạn vì tất cả các tùy chọn đều đủ nhanh : http://jsperf.com/best-of-string-to -number-chuyển đổi / 37
Tất cả điều này phụ thuộc vào cách cấu hình các bài kiểm tra hiệu suất vì một số hiển thị parseInt / parseFloat chậm hơn nhiều.
Lý thuyết của tôi là:
- Dối trá
- Darn dòng
- Số liệu thống kê
- Kết quả JSPerf :)