Tự hỏi nếu có bất kỳ cách quan trọng nào để tìm dấu của một số ( hàm dấu hiệu )?
Có thể là giải pháp ngắn hơn / nhanh hơn / thanh lịch hơn so với giải pháp hiển nhiên
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Câu trả lời ngắn!
Sử dụng cái này và bạn sẽ an toàn và nhanh chóng (nguồn: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Bạn có thể muốn nhìn vào hiệu suất và kiểu ép buộc so fiddle
Đã lâu rồi. Hơn nữa chủ yếu là vì lý do lịch sử.
Các kết quả
Hiện tại, chúng tôi có các giải pháp sau:
1. Rõ ràng và nhanh chóng
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Sửa đổi từ kbec - một loại đúc ít hơn, hiệu suất hơn, ngắn hơn [nhanh nhất]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
thận trọng: sign("0") -> 1
2. Thanh lịch, ngắn gọn, không quá nhanh [chậm nhất]
function sign(x) { return x && x / Math.abs(x); }
cảnh báo: sign(+-Infinity) -> NaN
,sign("0") -> NaN
Đối với Infinity
một số hợp pháp trong JS, giải pháp này dường như không hoàn toàn chính xác.
3. Nghệ thuật ... nhưng rất chậm [chậm nhất]
function sign(x) { return (x > 0) - (x < 0); }
4. Sử dụng bit-shift
nhanh, nhưngsign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Loại an toàn [megafast]
! Có vẻ như các trình duyệt (đặc biệt là chrome's v8) thực hiện một số tối ưu hóa kỳ diệu và giải pháp này hóa ra hoạt động hiệu quả hơn nhiều so với các trình duyệt khác, thậm chí hơn cả (1.1) mặc dù nó có chứa 2 hoạt động bổ sung và về mặt logic thì không bao giờ có thể nhanh hơn.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Công cụ
- kiểm tra hiệu suất jsperf ;
- fiddle - kiểm tra kiểu đúc;
Cải tiến được hoan nghênh!
[Offtopic] Câu trả lời được chấp nhận
Andrey Tarantsov - +100 cho nghệ thuật, nhưng đáng buồn là nó chậm hơn khoảng 5 lần so với cách tiếp cận rõ ràng
Frédéric Hamidi - bằng cách nào đó là câu trả lời được ủng hộ nhiều nhất (trong thời gian viết bài) và nó khá tuyệt, nhưng chắc chắn không phải là cách mọi thứ nên được thực hiện, imho. Ngoài ra, nó không xử lý chính xác số Vô cực, đó cũng là số, bạn biết đấy.
kbec - là một cải tiến của giải pháp rõ ràng. Không phải là cách mạng, nhưng tổng hợp tất cả lại với nhau, tôi coi cách tiếp cận này là tốt nhất. Bình chọn cho anh ấy :)
test everything
phiên bản, Safe sẽ từ chối kiểm tra các giá trị đặc biệt, vì vậy nó sẽ nhanh hơn! Hãy thử chạy only integers
thử nghiệm thay thế. Ngoài ra, JSPerf chỉ đang làm công việc của mình, không phải là vấn đề thích nó. :)
typeof x === "number"
tạo ra một số phép thuật cho biểu diễn. Xin vui lòng chạy thêm, đặc biệt là FF, Opera và IE để làm cho nó rõ ràng.
Math.sign()
(0 === 0, không nhanh như "An toàn") đã xuất hiện trong FF25 và sắp có trong chrome.
0
là một trường hợp đặc biệt