2012-05-31 28 views
14

संभव डुप्लिकेट:~~ बनाम parseInt?

var t = 1297110663, // start time (seconds since epoch) 
    v = 70, // start value (subscribers) 
    data = d3.range(33).map(next); // starting dataset 

function next() { 
    return { 
    time: ++t, 
    value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5))) 
    }; 
} 

नोट ~~ (टिल्डा टिल्डा) में:
What is the “double tilde” (~~) operator in JavaScript?

डी 3 ट्यूटोरियल एक समारोह है कि एक यादृच्छिक अनुक्रम का उत्पादन देता है

value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5))) 

जावास्क्रिप्ट टर्मिनल में चारों ओर खेलने से, मैं देख रहा हूँ:

~~1 
1 
~~-1 
-1 
~~-1.3 
-1 
parseInt(5) 
5 
parseInt(-5) 
-5 
parseInt(-5.3) 
-5 
parseInt(5.3) 
5 

के बाद से ~~ और parseInt बराबर होने लगते हैं, क्या parseInt का उपयोग कर के लिए तर्क?

+1

[बिटवाई नहीं] [https://developer.mozilla.org/en/JavaScript/Reference/operators/bitwise_operators#.7E_ (बिटवाइ_एनओटी)) –

+0

टीआईएल जावास्क्रिप्ट में tilde bitwise नहीं ऑपरेटर के बारे में टीआईएल। धन्यवाद। –

उत्तर

27

वे बराबर नहीं हैं।

  • parseInt() संख्या में तार बदल जाता है, अप करने के लिए पढ़ने और पहली गैर पूर्णांक चरित्र अनदेखी, और भी संभवतः आधार रूपांतरण प्रदर्शन (जैसे अष्टाधारी, या हेक्साडेसिमल के रूप में एक स्ट्रिंग की व्याख्या)।

    parseInt('011');   // 9 
    parseInt('42 cats');  // 42 
    parseInt('0xcafebabe'); // 3405691582 
    parseInt('deadbeef',16); // 3735928559 
    parseInt('deadbeef',36); // 1049836114599 
    
  • var x = ~~y; एक 'चाल' — var x = y << 0; — के समान है कि (ab) unary bitwise NOT operator का उपयोग करता है एक हस्ताक्षरित 32-बिट पूर्णांक की सीमा में होना करने के लिए परिणाम के लिए मजबूर करने, किसी भी गैर पूर्णांक भाग को त्यागकर है।

    ~~'011';  // 11   
    ~~'42 cats'; // 0 
    ~~'0xcafebabe'; // -889275714 
    ~~'deadbeef'; // 0 
    

~~x का प्रयोग अक्सर किया जाता है क्योंकि:

  1. प्रायः तेजी एक विधि बुला से है।
  2. किसी और चीज की तुलना में टाइप करना तेज़ है।
  3. यह बिजली उपयोगकर्ताओं को ठंडा महसूस करता है क्योंकि यह प्रकार का अचूक और न्यायसंगत भी है। :) ऊपर 2 -1 (2.147.483.647)

रूप cafebabe परीक्षण में देखे गये नंबर या नीचे -2 (-2.147.483.648) "लपेट" एक की सीमाओं के कारण होगा पर हस्ताक्षर किए 32-बिट पूर्णांक।

+3

आप शायद यह बताना चाहते हैं कि '~' क्या है। बिटवाई में नहीं। – Endophage

+0

@Endophage सुझाव के लिए धन्यवाद। – Phrogz

+0

@juwiley अगर (और केवल अगर!) आपको लगता है कि इसने आपके प्रश्न का उत्तर दिया है तो कृपया [इस उत्तर को स्वीकार करना] पर विचार करें (http://meta.stackexchange.com/a/5235/153741)। – Phrogz

2
~~"red" === 0 

isNaN(parseInt("red")) 

parseInt 32 बिट संख्या के रूप में अच्छी तरह से

7

parseInt पर हस्ताक्षर किए 32 बिट संख्या तक सीमित नहीं है संभाल कर सकते हैं।

// Top range for a bitwise operator provides a valid result 
~~((Math.pow(2,32)/2)-1); // 2147483647 

    // Beyond the top range provides undesired result 
~~(Math.pow(2,32)/2); // -2147483648 

इसके अलावा, parseInt के साथ आप रेडिक्स निर्दिष्ट कर सकते हैं।

+0

उन दो पंक्तियों को क्या दिखाता है? – gdoron

+0

@gdoron वे दिखाते हैं कि बिट-वार 32-बिट मानों के लिए क्लैंप नहीं होते हैं, एक बार जब आप 2^32 हिट करते हैं तो हस्ताक्षरित-पूरक भूमि में घूमते हैं – Phrogz

1

सरल: यह अधिक पठनीय और समृद्ध संस्करण है।

बिटवाईट नहीं ऑपरेटर किसी अन्य उपयोग के लिए डिज़ाइन किया गया है, लेकिन फ़्लोट वैल्यू को कम करने के लिए इसका दुरुपयोग किया जा सकता है। आपके उदाहरण में, Math.floor भी संभव था।

इसके अलावा, वे कई मामलों में समान व्यवहार नहीं करते हैं। parseInt 32 बिट तक सीमित नहीं है, यह विभिन्न स्थितित्मक नोटेशन में प्रदर्शित संख्याओं को पार्स कर सकता है और यह NaN के साथ गैर-संख्यात्मक मान भी संभालता है।

संबंधित मुद्दे