สงสัยว่ามีวิธีที่ไม่สำคัญในการค้นหาเครื่องหมายของตัวเลข ( ฟังก์ชัน signum ) หรือไม่?
อาจจะสั้น / เร็วขึ้น / สวยหรูกว่าโซลูชันที่ชัดเจน
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
ตอบสั้น ๆ !
ใช้สิ่งนี้แล้วคุณจะปลอดภัยและรวดเร็ว (ที่มา: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
คุณอาจต้องการดูที่การเปรียบเทียบประสิทธิภาพและการบังคับประเภทซอ
เวลาผ่านไปเนิ่นนาน นอกจากนี้ส่วนใหญ่เป็นเหตุผลทางประวัติศาสตร์
ผล
สำหรับตอนนี้เรามีวิธีแก้ปัญหาเหล่านี้:
1.ชัดเจนและรวดเร็ว
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. การดัดแปลงจากkbec - ประเภทหนึ่งร่ายน้อยลงมีประสิทธิภาพมากขึ้นสั้นลง[เร็วที่สุด]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
ข้อควรระวัง: sign("0") -> 1
2.สง่าสั้นไม่เร็วมาก[ช้าที่สุด]
function sign(x) { return x && x / Math.abs(x); }
ข้อควรระวัง: sign(+-Infinity) -> NaN
,sign("0") -> NaN
ณ Infinity
เป็นตัวเลขทางกฎหมายใน JS โซลูชันนี้ดูเหมือนจะไม่ถูกต้องทั้งหมด
3.ศิลปะ ... แต่ช้ามาก[ช้าที่สุด]
function sign(x) { return (x > 0) - (x < 0); }
4.ใช้ bit-shift
เร็ว แต่sign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5.ประเภทปลอดภัย [megafast]
! ดูเหมือนว่าเบราว์เซอร์ (โดยเฉพาะอย่างยิ่ง v8 ของ chrome) ทำการเพิ่มประสิทธิภาพเวทย์มนตร์และโซลูชันนี้มีประสิทธิภาพมากกว่าตัวอื่น ๆ มากแม้จะมากกว่า (1.1) แม้ว่าจะมีการดำเนินการเพิ่มเติม 2 อย่างและเหตุผลก็ไม่สามารถเร็วกว่านี้ได้
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
เครื่องมือ
ยินดีต้อนรับการปรับปรุง!
[Offtopic] คำตอบที่ยอมรับ
Andrey Tarantsov - +100 สำหรับงานศิลปะ แต่น่าเศร้าที่มันช้ากว่าแนวทางที่ชัดเจนประมาณ 5 เท่า
Frédéric Hamidi - คำตอบที่ได้รับการโหวตมากที่สุด (สำหรับเวลาที่เขียน) และมันก็ค่อนข้างดี แต่มันก็ไม่ใช่สิ่งที่ควรทำอย่างแน่นอน imho นอกจากนี้ยังไม่จัดการกับตัวเลขอินฟินิตี้อย่างถูกต้องซึ่งเป็นตัวเลขด้วย
kbec - เป็นการปรับปรุงวิธีการแก้ปัญหาที่ชัดเจน ไม่ใช่การปฏิวัติ แต่เมื่อรวมทั้งหมดเข้าด้วยกันฉันคิดว่าแนวทางนี้ดีที่สุด โหวตให้เขา :)
test everything
เวอร์ชันนี้ Safe จะปฏิเสธที่จะทดสอบค่าพิเศษดังนั้นมันจะเร็วขึ้น! ลองเรียกใช้การonly integers
ทดสอบแทน นอกจากนี้ JSPerf กำลังทำหน้าที่ของเขามันไม่ใช่เรื่องที่จะชอบ :)
typeof x === "number"
ทำให้มีเวทมนตร์ในการแสดง โปรดทำการรันให้มากขึ้นโดยเฉพาะ FF, Opera และ IE เพื่อให้ชัดเจน
Math.sign()
(0 === 0 ไม่เร็วเท่า "ปลอดภัย") ซึ่งปรากฏใน FF25 และกำลังจะมาใน chrome
0
เป็นกรณีพิเศษ