जवाबों:
~
एक बिटवाइज़ ऑपरेटर है जो अपने ऑपरेंड में सभी बिट्स को फ़्लिप करता है।
उदाहरण के लिए, यदि आपका नंबर था 1
, तो आईईईई 754 फ्लोट (कैसे जावास्क्रिप्ट संख्याओं का इलाज करता है) का द्विआधारी प्रतिनिधित्व होगा ...
0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
तो ~
अपने ऑपरेंड को 32 बिट पूर्णांक (बिटकॉइन ऑपरेटरों को जावास्क्रिप्ट में करते हैं) में कनवर्ट करता है ...
0000 0000 0000 0000 0000 0000 0000 0001
यदि यह एक नकारात्मक संख्या थी, तो इसे 2 के पूरक में संग्रहीत किया जाएगा: सभी बिट्स को उल्टा करें और 1 जोड़ें।
… और फिर उसके सारे चूतड़ झड़ जाते हैं…
1111 1111 1111 1111 1111 1111 1111 1110
तो इसका उपयोग क्या है, फिर? जब कोई इसका इस्तेमाल कर सकता है?
इसके कुछ उपयोग हैं। यदि आप निम्न स्तर का सामान लिख रहे हैं, तो यह आसान है। यदि आपने अपने आवेदन को प्रोफाइल किया है और एक अड़चन पाई है, तो इसे बिटवाइज़ ट्रिक्स ( एक बहुत बड़े बैग में एक संभव उपकरण के रूप में) का उपयोग करके अधिक प्रदर्शन किया जा सकता है ।
यह भी एक (आमतौर पर) स्पष्ट नहीं है कि चाल चालू करने के लिए indexOf()
'एस मिल गया में वापसी मान truthy (जबकि जिससे नहीं मिला के रूप में falsy ) और लोगों को अक्सर यह दोगुना होकर 32 बिट करने के लिए संख्या छोटा (और उसके दशमलव स्थान छोड़ने के अपने पक्ष प्रभाव के लिए इसका इस्तेमाल करते हैं, प्रभावी रूप Math.floor()
से सकारात्मक संख्याओं के लिए समान )।
मैं अस्पष्ट कहता हूं क्योंकि यह तुरंत स्पष्ट नहीं है कि इसका उपयोग किस लिए किया जा रहा है। आम तौर पर, आप चाहते हैं कि आपका कोड इसे पढ़ने वाले अन्य लोगों से स्पष्ट रूप से संवाद करे। जबकि उपयोग शांत लग~
सकता है , यह आमतौर पर अपने स्वयं के अच्छे के लिए बहुत चालाक है। :)
यह अब भी कम प्रासंगिक है कि जावास्क्रिप्ट Array.prototype.includes()
और है String.prototype.includes()
। ये एक बूलियन मान लौटाते हैं। यदि आपका लक्ष्य प्लेटफ़ॉर्म इसका समर्थन करता है, तो आपको स्ट्रिंग या सरणी में मान के अस्तित्व के परीक्षण के लिए इसे पसंद करना चाहिए।
value = value || default
जावास्क्रिप्ट में एक सामान्य और मान्य मुहावरा है जब तक आप जानते हैं कि आप कब और इसका उपयोग नहीं कर सकते हैं।
v = t ? a : b;
। मुझे लगता है कि var v; if (t} { v = a; } else { v = b; }
आम तौर पर 5+ रेखाओं से अधिक टूटी हुई और उससे भी अधिक स्पष्ट होती है, var v = b; if (t) { v = a; }
जिसकी तुलना में आमतौर पर 4+ लाइनें होती हैं। लेकिन मुझे पता है कि बहुत से लोग ? :
ऑपरेटरों से परिचित नहीं हैं जो दूसरे या तीसरे तरीके को पसंद करेंगे। मुझे लगता है कि पहला अधिक पठनीय है। मैं सामान्य सिद्धांत से सहमत हूं, कोड को स्पष्ट करें, हैक का उपयोग न करें। मुझे लगता है कि मैंने ~v.indexOf('...')
इसे सीख लेने के बाद बस बहुत स्पष्ट होना देखा है।
~
मुहावरेदार नहीं कहूंगा । यह तकनीकी रूप से भाषा युक्ति का हिस्सा है , लेकिन यह सामान्य उपयोग में भाषा का इतना हिस्सा नहीं है ।
किसी indexOf()
अभिव्यक्ति के प्रभावी ढंग से उपयोग करने से आपको सीधे संख्यात्मक सूचकांक के बजाय एक सत्य / गलत परिणाम मिलता है।
यदि वापसी मान है -1
, तो ~-1
है 0
क्योंकि -1
सभी 1 बिट्स की एक श्रृंखला है। शून्य से अधिक या उसके बराबर कोई भी मान गैर-शून्य परिणाम देगा। इस प्रकार,
if (~someString.indexOf(something)) {
}
if
कोड को चलाने का कारण होगा जब "कुछ" "someString" में होगा। यदि आप .indexOf()
सीधे बूलियन के रूप में उपयोग करने का प्रयास करते हैं, तो वह काम नहीं करेगा क्योंकि कभी-कभी यह शून्य (जब "कुछ" स्ट्रिंग की शुरुआत में होता है) लौटता है।
बेशक, यह भी काम करता है:
if (someString.indexOf(something) >= 0) {
}
और यह काफी कम रहस्यमय है।
कभी-कभी आप यह भी देखेंगे:
var i = ~~something;
~
दो बार ऑपरेटर का उपयोग करना एक स्ट्रिंग को 32-बिट पूर्णांक में बदलने का एक त्वरित तरीका है। पहला ~
रूपांतरण करता है, और दूसरा ~
बिट्स को वापस फ़्लिप करता है। बेशक, यदि ऑपरेटर ऐसी चीज़ पर लागू होता है जिसे किसी संख्या में परिवर्तित नहीं किया जा सकता है, तो आप NaN
परिणाम के रूप में प्राप्त करते हैं । ( संपादित करें - वास्तव में यह दूसरा ~
है जिसे पहले लागू किया गया है, लेकिन आपको यह विचार मिलता है।)
~
जब पूर्णांकों पर प्रदर्शन किया जाता है -(x + 1)
।
0
होने की परंपरा है false
और गैर-शून्य होने की true
तारीखें वापस आती हैं, कम से कम 'सी' में 70 के दशक की और शायद बहुत सारी अन्य तत्कालीन सिस्टम प्रोग्रामिंग भाषाओं की। यह शायद हार्डवेयर के काम करने के तरीके से उपजा है; बहुत सारे CPU एक ऑपरेशन के बाद एक शून्य बिट सेट करते हैं, और इसका परीक्षण करने के लिए एक संबंधित शाखा निर्देश है।
| 0
, जिस स्थिति में इसका केवल एक ही ऑपरेशन होगा।
~~
बिल्कुल उसी तरह से एक सरल अनुप्रयोग की व्याख्या न करें ।
~
है बिटवाइस नहीं ऑपरेटर , ~x
के रूप में लगभग एक ही है -(x+1)
। इसे समझना आसान है। इसलिए:
~2; // -(2+1) ==> -3
विचार करें -(x+1)
। -1
उत्पादन करने के लिए उस ऑपरेशन का प्रदर्शन कर सकते हैं 0
।
दूसरे शब्दों में, ~
संख्या मानों की एक सीमा के साथ उपयोग करने false
पर 0
केवल -1
इनपुट मूल्य के लिए एक मिथ्या (मोटे से लेकर ) मूल्य का उत्पादन होगा , अन्यथा, किसी भी अन्य सत्य मूल्य।
जैसा कि हम जानते हैं, -1
आमतौर पर प्रहरी मूल्य कहा जाता है । इसका उपयोग कई कार्यों के लिए किया जाता है जो सफलता के लिए और C भाषा में विफलता के लिए >= 0
मान लौटाते हैं। जावास्क्रिप्ट में वापसी के मूल्य का वही नियम है ।-1
indexOf()
इस तरह से दूसरे स्ट्रिंग में एक विकल्प की उपस्थिति / अनुपस्थिति की जांच करना आम है
var a = "Hello Baby";
if (a.indexOf("Ba") >= 0) {
// found it
}
if (a.indexOf("Ba") != -1) {
// found it
}
if (a.indexOf("aB") < 0) {
// not found
}
if (a.indexOf( "aB" ) == -1) {
// not found
}
हालांकि, इसे ~
नीचे के माध्यम से करना अधिक आसानी से होगा
var a = "Hello Baby";
~a.indexOf("Ba"); // -7 -> truthy
if (~a.indexOf("Ba")) { // true
// found it
}
~a.indexOf("aB"); // 0 -> falsy
!~a.indexOf("aB"); // true
if (!~a.indexOf( "aB" )) { // true
// not found
}
तुम्हें पता नहीं है जेएस: प्रकार और व्याकरण काइल सिम्पसन द्वारा
-(x+1)
अगर मैं इसे एक बयान में देखा तो मैं दूसरी बार देखूंगा। टिल्ड मुझे बताता है कि जावास्क्रिप्ट की 0-प्रकृति के लिए क्षतिपूर्ति करने के लिए वह क्या कर रहा है। इसके अलावा, कम कोष्ठक पढ़ने के लिए बेहतर है
if (a.indexOf("Ba") > -1) {// found} //true
, हालांकि टिल्ड उदाहरणों की तुलना में थोड़ा लंबा, आपके द्वारा दिए गए दो उदाहरणों और नए प्रोग्रामर के लिए काफी कम है var opinion = !~-1 ? 'more' : 'less'
।
~indexOf(item)
बहुत बार आता है, और यहाँ के उत्तर बहुत अच्छे हैं, लेकिन शायद कुछ लोगों को यह जानने की ज़रूरत है कि इसका उपयोग कैसे करें और सिद्धांत को "छोड़ें":
if (~list.indexOf(item)) {
// item in list
} else {
// item *not* in list
}
++
और --
क्योंकि वे "अत्यधिक चालाकी को प्रोत्साहित करते हैं" और फिर भी किसी तरह ~
बच गए (छाया में
list.indexOf(item) >= 0
या ... > -1
चूंकि जावास्क्रिप्ट शून्य-आधारित है और इसे शुरू से ही संबोधित नहीं करना है। इसके अलावा, सिर्फ राय (एयरबीएनबी के रूप में), कोई भी जो जावास्क्रिप्ट में कुछ भी सार्थक कर रहा है वह जानता है ++
, और जबकि --
कम आम है, अर्थ का अनुमान लगाया जा सकता है।
++
और --
आदिम तरीकों की वजह से थोड़ी देर में map
, forEach
आदि मेरी बात और है कि जब उन्होंने ~
मानक का उपयोग और वेतन वृद्धि संचालकों को शामिल नहीं किया तो वे अत्यधिक मुश्किल क्यों नहीं समझे । कुछ करने से मना करने पर CIS101 का कोई मतलब नहीं है।
एक परिणाम से एक सत्य मूल्य बनाने के लिए टिल्ड ट्रिक का उपयोग करने पर विचार करने वालों के लिए indexOf
, यह अधिक स्पष्ट है और इसके बजाय includes
विधि काString
उपयोग करने के लिए कम जादू है ।
'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false
ध्यान दें कि यह ईएस 2015 के रूप में एक नया मानक तरीका है इसलिए यह पुराने ब्राउज़रों पर काम नहीं करेगा। ऐसे मामलों में जहां यह मायने रखता है, String.prototype.includes polyfill का उपयोग करने पर विचार करें ।
समान सिंटैक्स का उपयोग करके सरणियों के लिए भी यह सुविधा उपलब्ध है :
['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false
यदि आपको पुराने ब्राउज़र समर्थन की आवश्यकता है तो यहां Array.prototype.includes पॉलीफ़िल है।