आश्चर्य है कि क्या संख्या के संकेत ( साइनम फ़ंक्शन ) को खोजने के कोई अनैतिक तरीके हैं ?
स्पष्ट की तुलना में कम / तेज / अधिक सुरुचिपूर्ण समाधान हो सकते हैं
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। केबीसी से संशोधन - एक प्रकार का कम, अधिक कलाकार, छोटा [सबसे तेज़]
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जे एस में एक कानूनी संख्या इस समाधान पूरी तरह से सही प्रतीत नहीं होता है।
3. कला ... लेकिन बहुत धीमी [सबसे धीमी]
function sign(x) { return (x > 0) - (x < 0); }
4. बिट-शिफ्ट फास्ट का उपयोग करना
, लेकिनsign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. टाइप-सेफ [मेगाफ़ास्ट]
! ब्राउज़र (विशेष रूप से क्रोम के v8) की तरह लगता है कि कुछ जादू अनुकूलन करते हैं और यह समाधान दूसरों की तुलना में बहुत अधिक प्रदर्शनशील है, यहां तक कि (1.1) की तुलना में इसमें 2 अतिरिक्त संचालन शामिल हैं और तार्किक रूप से कभी भी तेज नहीं हो सकता है।
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
उपकरण
- जेस्पेर प्रीफॉर्मेंस टेस्ट;
- fiddle - टाइप-कास्ट परीक्षण;
सुधारों का स्वागत है!
[ऑफॉप्टिक] स्वीकृत उत्तर
कला के लिए एंड्री टारनटोसोव - +100, लेकिन दुख की बात है कि यह स्पष्ट दृष्टिकोण की तुलना में लगभग 5 गुना धीमा है
Frédéric Hamidi - किसी भी तरह से सबसे अधिक उत्तर दिया (समय लिखने के लिए) और यह थोड़े शांत है, लेकिन यह निश्चित रूप से नहीं है कि चीजों को कैसे किया जाना चाहिए, imho। इसके अलावा यह सही ढंग से इन्फिनिटी नंबरों को नहीं संभालता है, जो कि संख्याएं भी हैं, आप जानते हैं।
केबीसी - स्पष्ट समाधान का सुधार है। वह क्रांतिकारी नहीं है, लेकिन सभी को एक साथ लेकर मैं इस दृष्टिकोण को सर्वश्रेष्ठ मानता हूं। उसके लिए वोट करें :)
test everythingसंस्करण चलाते हैं, तो सेफ विशेष मानों का परीक्षण करने से इंकार कर देगा, इसलिए यह तेज होगा! only integersइसके बजाय परीक्षण चलाने का प्रयास करें । इसके अलावा, JSPerf सिर्फ अपना काम कर रहा है, यह पसंद करने की बात नहीं है। :)
typeof x === "number"प्रदर्शन पर कुछ जादू है। कृपया, अधिक रन बनाने के लिए, विशेष रूप से FF, ओपेरा और IE को स्पष्ट करने के लिए।
Math.sign()(0 === 0 के रूप में तेजी से नहीं "सुरक्षित" के रूप में) जो FF25 में दिखाई दिया और क्रोम में आगामी है।
0एक विशेष मामला होता है