Cái nào tốt hơn?
Tôi đang hỏi điều này chỉ vì mục đích cạo một vài byte, vì tôi có thể sử dụng + x thay vì số (x). Parsefloat có làm gì tốt hơn không?
Cái nào tốt hơn?
Tôi đang hỏi điều này chỉ vì mục đích cạo một vài byte, vì tôi có thể sử dụng + x thay vì số (x). Parsefloat có làm gì tốt hơn không?
Câu trả lời:
parseFloat
/ parseInt
là để phân tích một chuỗi, trong khi Number
/ +
là để ép buộc một giá trị thành một số. Họ cư xử khác nhau. Nhưng trước tiên hãy nhìn vào nơi họ cư xử giống nhau:
parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
Vì vậy, miễn là bạn có đầu vào số tiêu chuẩn, không có sự khác biệt. Tuy nhiên, nếu đầu vào của bạn bắt đầu bằng một số và sau đó chứa các ký tự khác, hãy parseFloat
cắt số đó ra khỏi chuỗi, trong khi Number
đưa ra NaN
(không phải là một số):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Ngoài ra, Number
hiểu đầu vào thập lục phân trong khi parseFloat
không:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Nhưng Number
hành động kỳ lạ với chuỗi trống hoặc chuỗi chỉ chứa khoảng trắng:
parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
Nhìn chung, tôi thấy Number
hợp lý hơn, vì vậy tôi hầu như luôn sử dụng Number
cá nhân (và bạn sẽ thấy rằng rất nhiều hàm JavaScript nội bộ Number
cũng sử dụng ). Nếu ai đó loại '1x'
tôi thích hiển thị một lỗi hơn là xử lý như thể họ đã gõ '1'
. Lần duy nhất tôi thực sự tạo ra một ngoại lệ là khi tôi chuyển đổi một kiểu thành một số, trong trường hợp đó parseFloat
là hữu ích vì các kiểu có dạng như '3px'
, trong trường hợp đó tôi muốn bỏ 'px'
phần đó và chỉ lấy 3
, vì vậy tôi thấy parseFloat
hữu ích đây. Nhưng thực sự cái nào bạn chọn là tùy thuộc vào bạn và hình thức đầu vào nào bạn muốn chấp nhận.
Lưu ý rằng việc sử dụng toán tử đơn nguyên +
giống hệt như sử dụng Number
như một hàm:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Vì vậy, tôi thường chỉ sử dụng +
cho ngắn. Miễn là bạn biết nó làm gì, tôi thấy nó dễ đọc.
Number()
là "lạ" Tôi thậm chí sẽ coi nó như mong đợi hơn, khoảng trắng là một giá trị trống nhưng nó không phải là null / không xác định => 0 là một kết quả tốt. Lớn (+) cho bạn cho các showcase nào :)
Number('Infinity') === Infinity
trong khiparseInt('Infinity') === NaN
+
(unary plus) cho điều này, bởi vì nếu bạn quên dấu chấm phẩy trên dòng trước đó, một biểu thức bổ sung có thể được đánh giá thay thế.
Sự khác biệt là những gì xảy ra khi đầu vào không phải là "số thích hợp". Number
trả về NaN
trong khi parseFloat
phân tích cú pháp "càng nhiều càng tốt". Nếu được gọi trên chuỗi rỗng Number
trả về 0
trong khi parseFloat trả về NaN
.
Ví dụ:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
mặc dù
NaN != NaN
đánh giá thành TRUE - cảm ơn vì tiền boa!
isNaN(NaN)
trả vềtrue
Trong những ví dụ này, bạn có thể thấy sự khác biệt:
Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;
parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
parseFloat chậm hơn một chút vì nó tìm kiếm sự xuất hiện đầu tiên của một số trong một chuỗi, trong khi đó, bộ tạo Số tạo ra một thể hiện số mới từ các chuỗi chứa các giá trị số có khoảng trắng hoặc chứa các giá trị sai.
PS Nếu bạn quan tâm đến một số giải pháp chuyển đổi loại phổ quát, bạn có thể đọc bài đăng về chuyển đổi loại trong blog của tôi: http://jowersimplejs.blogspot.com/2012/08/data-type-conversion.html
Đối với chuỗi rỗng, chúng là khác nhau.
+""
và Number("")
trả về 0, trong khi parseFloat("")
trả về NaN.
parseFloat()
có kết quả đúng vì một chuỗi rỗng KHÔNG phải là số 0
(đọc: NaN) trong khi một chuỗi có ký tự "0"
trong đó là IS 0
;
+x
trả về 0
không chỉ cho một chuỗi trống mà còn cho bất kỳ chuỗi chỉ có khoảng trắng. Ví dụ: +" "
, +"\t\t\t"
, +"\n\n"
- tất cả trong số họ cung cấp cho 0
kết quả
Theo như tôi biết, và điều này chỉ được nghe lén từ các đồng nghiệp nên có thể hoàn toàn không được thông báo, rằng parseFloat nhanh hơn một chút.
Mặc dù nghiên cứu sâu hơn, có vẻ như sự khác biệt hiệu suất này phụ thuộc vào trình duyệt.
http://jsperf.com/parseint-vs-parsefloat/6
Hãy xem các kết quả jsPerf này và thực hiện cuộc gọi của bạn. (bao gồm cả các bài kiểm tra + x)
Như đã lưu ý trong câu trả lời của @xdazz +""
và Number("")
trả về 0
trong khi parseFloat("")
trả về NaN
nên một lần nữa tôi sẽ đi với parseFloat, bởi vì một chuỗi rỗng KHÔNG có nghĩa là số 0, chỉ một chuỗi có ký tự "0"
trong đó có nghĩa là 0;
parseFloat()
vẫn là người chiến thắng.