2013-04-07 22 views
14

Tôi thường thấy các trickép buộc lên vị trí số

after = +after; 

cưỡng chế biến after thành một số. Đọc qua số Node.JS source Tôi đã tìm thấy một phương pháp khác:

after *= 1; // coalesce to number or NaN 

Hai phương pháp có tương đương hoàn toàn với hành vi của chúng không?

Trả lời

5

Sau khi nhanh chóng google to make sure my suspicions were true, tôi đã đi đến kết luận này. Sử dụng toán tử + để chuyển đổi thành một số nhanh hơn, vì không có phép toán nào xảy ra sau khi nhập, trong khi sử dụng phương thức *= có nghĩa là sau after được chuyển đổi, nó sẽ được nhân với 1.

+0

Vì vậy, không có sự khác biệt về hành vi, chỉ tốc độ và cú pháp? – Randomblue

+0

Tôi không phải là một chuyên gia, nhưng câu hỏi liên quan đến cú pháp được đưa ra, mà tôi nghĩ rằng tôi đã trả lời. Nếu việc đúc là khác nhau dựa trên toán tử, tôi không biết. Điều đó sẽ đòi hỏi một đam mê với sức mạnh vượt xa tôi! – christopher

1

Lưu ý: Trong một số trường after = after-0 gọi hành vi khác nhau hơn after = after+0. Tôi đã nhận thấy nó với ngày tháng.

này được thử nghiệm trong Chrome V39 chỉ:

var date = new Date(2000,0,1); 
date += date; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)" 
var date2 = new Date(2000,0,1); 
date2 + 0; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)0" 
date2 - 0; //946684800000 
date2 * 1; //946684800000 

Tôi không biết những gì được định nghĩa trong spec JS, nhưng với thời gian, bởi vì cả ngày và số lượng có thể được đúc thành một chuỗi, và toán tử + hoạt động trên một chuỗi, sau đó Chrome đi với một chuỗi nối. Bởi vì toán tử - không có chuỗi tương đương, nó rơi trở lại so sánh số.

Tôi đã thấy điều này hữu ích khi ép buộc ngày vào số để so sánh

0

Vâng, tuy nhiên lưu ý rằng nó chỉ là unary + nhà điều hành thực hiện điều này. I E. 10 + "10" sẽ cung cấp cho bạn "1010".

Một lẽ ít lỗi tùy chọn dễ bị là sử dụng những gì asm.js không:

10 + ("10"|0) 

Mặc dù trên xuống phía nó đòi hỏi các dấu ngoặc đơn. Nó phải là lựa chọn nhanh nhất trong mọi trường hợp (có thể bằng unary +).

+3

Điều này sẽ chuyển đổi số thành một số nguyên, không chỉ là một số (ví dụ: '(" 10.7 "| 0) === 10'). Nếu bạn chỉ muốn chuyển đổi chuỗi thành một số, hãy sử dụng dấu cộng đơn ('+" 10.7 "=== 10.7') – Jack

Các vấn đề liên quan