दिलचस्प पोस्ट
जावास्क्रिप्ट को TextArea इनपुट को .value या। WinnerHTML के माध्यम से मिलता है? संदर्भ और पॉइंटर्स के साथ dynamic_cast का उपयोग करते समय व्यवहार में अंतर शेष चौड़ाई लेने के लिए एक div का विस्तार करें यूआरएल को फिर से लिखना MySQL कहां में () Dplyr के साथ कई प्रतिगमन मॉडल फिटिंग कार्यात्मक प्रोग्रामिंग में बिंदु मुक्त शैली क्या है? कौन सा, और क्यों, क्या आप अपवाद या वापसी कोड पसंद करते हैं? बेनामी टाइप करने के लिए कास्ट करें केस असंवेदनशील jQuery विशेषता चयनकर्ता गिटोलाइट का उपयोग करते समय उपयोगकर्ताओं को पासवर्ड के लिए कहा जाता है सकारात्मक पूर्णांकियों की एक सूची में पूर्णांकों की सूची को विभाजित करना और नकारात्मक पूर्णांक की एक सूची को विभाजित करना LINQ: अलग मूल्य पृष्ठ दिखाए गए मस्तप्ललिब पर स्क्रॉलबार PHP – स्ट्रिंग में वैरिएबल सम्मिलित या सीधे सम्मिलित करें

क्या जावास्क्रिप्ट एक पास-बाय-रेफरेंस या पास-बाय-वैल्यू भाषा है?

आदिम प्रकार (संख्या, स्ट्रिंग, इत्यादि) मूल्य से पारित होते हैं, लेकिन वस्तुएं अज्ञात होती हैं, क्योंकि वे दोनों पास-बाय-वैल्यू हो सकती हैं (यदि हम मानते हैं कि ऑब्जेक्ट धारण करने वाला कोई चरम वस्तु वस्तु का संदर्भ है ) और पारित-संदर्भ (जब हम मानते हैं कि ऑब्जेक्ट में वेरिएबल ऑब्जेक्ट ही रखता है)।

हालांकि अंत में वास्तव में कोई बात नहीं है, मैं जानना चाहता हूं कि सम्मेलनों को पारित करने के तर्कों को प्रस्तुत करने का सही तरीका क्या है। क्या जावास्क्रिप्ट विनिर्देश से एक अंश है, जो इस बात को परिभाषित करता है कि इस बारे में क्या अर्थ होना चाहिए?

Solutions Collecting From Web of "क्या जावास्क्रिप्ट एक पास-बाय-रेफरेंस या पास-बाय-वैल्यू भाषा है?"

यह जावास्क्रिप्ट में दिलचस्प है इस उदाहरण पर विचार करें:

 function changeStuff(a, b, c) { a = a * 10; b.item = "changed"; c = {item: "changed"}; } var num = 10; var obj1 = {item: "unchanged"}; var obj2 = {item: "unchanged"}; changeStuff(num, obj1, obj2); console.log(num); console.log(obj1.item); console.log(obj2.item); 

यह हमेशा मान से पास होता है, लेकिन ऑब्जेक्ट के लिए वेरिएबल का मान एक संदर्भ होता है। इस वजह से, जब आप ऑब्जेक्ट पास करते हैं और इसके सदस्यों को बदलते हैं , तो ये परिवर्तन फ़ंक्शन के बाहर जारी रहती हैं। यह संदर्भ से पास की तरह दिखता है । लेकिन अगर आप वास्तव में ऑब्जेक्ट वेरिएबल के मूल्य को बदलते हैं तो आप देखेंगे कि परिवर्तन नहीं होता, यह साबित करता है कि यह वास्तव में मूल्य से पास है।

उदाहरण:

 function changeObject(x) { x = {member:"bar"}; alert("in changeObject: " + x.member); } function changeMember(x) { x.member = "bar"; alert("in changeMember: " + x.member); } var x = {member:"foo"}; alert("before changeObject: " + x.member); changeObject(x); alert("after changeObject: " + x.member); /* change did not persist */ alert("before changeMember: " + x.member); changeMember(x); alert("after changeMember: " + x.member); /* change persists */ 

आउटपुट:

 before changeObject: foo in changeObject: bar after changeObject: foo before changeMember: foo in changeMember: bar after changeMember: bar 

चर ऑब्जेक्ट "पकड़" नहीं करता है, यह एक संदर्भ रखता है आप उस संदर्भ को एक अन्य चर के लिए निर्दिष्ट कर सकते हैं, अब दोनों ही ऑब्जेक्ट का संदर्भ लें। यह हमेशा मूल्य से पारित होता है (यहां तक ​​कि जब वह मूल्य संदर्भ होता है …)

पैरामीटर के रूप में पारित किए गए वैरिएबल के मान को परिवर्तित करने का कोई तरीका नहीं है, जो संभव हो सकता है अगर जेएस संदर्भ से गुजर रहा हो।

मेरे 2 सेंट …. यह मैं इसे समझने का तरीका है। (अगर मुझे गलत है तो मुझे सही करने के लिए बेझिझक)

यह मूल्य / संदर्भ से पास के बारे में आपके बारे में सब कुछ जानने के लिए समय है।

क्योंकि जावास्क्रिप्ट में, इससे कोई फर्क नहीं पड़ता कि यह मूल्य से या संदर्भ से या जो भी हो चुका है क्या मायने रखता है एक समारोह में पारित पैरामीटर के उत्परिवर्तन बनाम असाइनमेंट।

ठीक है, मुझे ये समझाने के लिए अपनी पूरी कोशिश करें कि मेरा क्या मतलब है। मान लें कि आपके पास कुछ ऑब्जेक्ट हैं

 var object1 = {}; var object2 = {}; 

हमने जो किया है "असाइनमेंट" है … हमने 2 अलग खाली ऑब्जेक्ट्स को "ऑब्जेक्ट 1" और "ऑब्जेक्ट 2" चर में आवंटित किया है।

अब, हम कहते हैं कि हम object1 को बेहतर पसंद करते हैं … तो, हम एक नया चर "असाइन करें"

 var favoriteObject = object1; 

अगला, जो भी कारण से, हम यह तय करते हैं कि हम ऑब्जेक्ट 2 की तरह बेहतर इसलिए, हम केवल थोड़ी-फिर से असाइनमेंट करते हैं।

 favoriteObject = object2; 

वस्तु 1 या वस्तु 2 में कुछ भी नहीं हुआ। हमने कोई भी डेटा नहीं बदला है। हमने जो कुछ किया था वह सब फिर से सौंपा गया जो हमारे पसंदीदा ऑब्जेक्ट है यह जानना महत्वपूर्ण है कि object2 और पसंदीदा ऑब्जेक्ट दोनों एक ही ऑब्जेक्ट को सौंपा गया है। हम उस ऑब्जेक्ट को किसी भी व्हेरिएबल के माध्यम से बदल सकते हैं।

 object2.name = 'Fred'; console.log(favoriteObject.name) // logs Fred favoriteObject.name = 'Joe'; console.log(object2.name); // logs Joe 

ठीक है, अब हम उदाहरण के लिए तार की तरह प्राथमिकताओं को देखते हैं

 var string1 = 'Hello world'; var string2 = 'Goodbye world'; 

फिर, हम पसंदीदा चुनते हैं।

 var favoriteString = string1; 

हमारे पसंदीदा स्ट्रिंग और स्ट्रिंग 1 वेरिएबल्स दोनों को 'हैलो वर्ल्ड' नाम दिया गया है। अब, अगर हम अपनी पसंदीदा स्ट्रिंग बदलना चाहते हैं ??? क्या होगा???

 favoriteString = 'Hello everyone'; console.log(favoriteString); // Logs 'Hello everyone' console.log(string1); // Logs 'Hello world' 

उह ओह …. क्या हुआ है हम स्ट्रिंग 1 को पसंदीदा स्ट्रिंग बदलकर नहीं बदल सके … क्यों ?? क्योंकि तार अपरिवर्तनीय हैं और हम इसे बदल नहीं सकते हैं हम सभी को "पुनः अभिविन्यास" पसंदीदा स्ट्रिंग नए स्ट्रिंग के लिए किया था। यह अनिवार्य रूप से इसे string1 से डिस्कनेक्ट किया गया था पिछले उदाहरण में, जब हमने अपना ऑब्जेक्ट नाम दिया, हमने कुछ भी असाइन नहीं किया (खैर, असल में … हमने किया, हमने नाम की संपत्ति को एक नई स्ट्रिंग में निर्दिष्ट किया है।) इसके बजाय, हम उस ऑब्जेक्ट को बस बदलते हैं जो 2 चर और अंतर्निहित ऑब्जेक्ट्स के बीच कनेक्शन रखता है।

अब, फ़ंक्शन पर और मापदंडों को पारित करना …. जब आप किसी फ़ंक्शन को कॉल करते हैं, और एक पैरामीटर पास करते हैं, तो आप जो अनिवार्य रूप से कर रहे हैं वह एक नया वैरिएबल के लिए "असाइनमेंट" है, और यह ठीक उसी तरह से काम करता है जैसे कि आप बराबर (=) चिन्ह

इन उदाहरणों को लें

 var myString = 'hello'; // Assign to a new variable (just like when you pass to a function) var param1 = myString; param1 = 'world'; // Re assignment console.log(myString); // logs 'hello' console.log(param1); // logs 'world' 

अब, एक ही बात है, लेकिन एक फ़ंक्शन के साथ

 function myFunc(param1) { param1 = 'world'; console.log(param1); // logs 'world' } var myString = 'hello'; // Calls myFunc and assigns param1 to myString just like param1 = myString myFunc(myString); console.log(myString); // logs 'hello' 

ठीक है, अब देता है कुछ वस्तुओं का उपयोग करने के बजाय कुछ उदाहरण … पहले, समारोह के बिना

 var myObject = { firstName: 'Joe', lastName: 'Smith' }; // Assign to a new variable (just like when you pass to a function) var otherObj = myObject; // Let's mutate our object otherObj.firstName = 'Sue'; // I guess Joe decided to be a girl console.log(myObject.firstName); // Logs 'Sue' console.log(otherObj.firstName); // Logs 'Sue' // Now, let's reassign otherObj = { firstName: 'Jack', lastName: 'Frost' }; // Now, otherObj and myObject are assigned to 2 very different objects // And mutating one object no longer mutates the other console.log(myObject.firstName); // Logs 'Sue' console.log(otherObj.firstName); // Logs 'Jack'; 

अब, एक ही बात है, लेकिन फ़ंक्शन कॉल के साथ

 function myFunc(otherObj) { // Let's mutate our object otherObj.firstName = 'Sue'; console.log(otherObj.firstName); // Logs 'Sue' // Now let's re-assign otherObj = { firstName: 'Jack', lastName: 'Frost' }; console.log(otherObj.firstName); // Logs 'Jack' // Again, otherObj and myObject are assigned to 2 very different objects // And mutating one object no longer mutates the other } var myObject = { firstName: 'Joe', lastName: 'Smith' }; // Calls myFunc and assigns otherObj to myObject just like otherObj = myObject myFunc(myObject); console.log(myObject.firstName); // Logs 'Sue', just like before 

ठीक है, अगर आप इस पूरे पोस्ट के माध्यम से पढ़ते हैं, तो शायद आपको बेहतर ढंग से समझना होगा कि फ़ंक्शन कॉल कैसे जावास्क्रिप्ट पर काम करता है यह कोई फर्क नहीं पड़ता कि कुछ संदर्भ द्वारा या मूल्य से पारित किया गया है … क्या काम असाइनमेंट बनाम उत्परिवर्तन है

हर बार जब आप किसी फ़ंक्शन में एक चर पास करते हैं, तो आप पैरामीटर वेरिएबल के नाम को "असाइनिंग" कर रहे हैं, जैसे कि आप समान (=) चिह्न का उपयोग करते हैं

हमेशा याद रखें कि बराबर चिह्न (=) का मतलब है असाइनमेंट। हमेशा याद रखें कि किसी फ़ंक्शन को पैरामीटर देकर भी असाइनमेंट का अर्थ है। वे वही हैं और 2 चर बिल्कुल उसी तरह से जुड़े हुए हैं।

केवल एक बार जब एक वैरिएबल को संशोधित किया जाता है तो एक भिन्न वैरिएबल प्रभावित होता है जब अंतर्निहित ऑब्जेक्ट उत्परिवर्तित होता है।

ऑब्जेक्ट्स और प्रीमिटीव्स के बीच अंतर बनाने में कोई मतलब नहीं है, क्योंकि यह एक ही सटीक तरीके से काम करता है जैसे कि आपके पास फ़ंक्शन नहीं है और सिर्फ एक नया चर को निर्दिष्ट करने के लिए समान चिह्न का इस्तेमाल किया है।

एकमात्र प्राप्त किया गया है, जब आप उस फ़ंक्शन का नाम बदलते हैं, जो फ़ंक्शन पैरामीटर के नाम के समान होता है। जब ऐसा होता है, तो आपको फ़ंक्शन के अंदर पैरामीटर का इलाज करना होता है जैसे कि यह फ़ंक्शन के लिए एक पूर्ण नया वैरिएबल है (क्योंकि यह है)

 function myFunc(myString) { // myString is private and does not affect the outer variable myString = 'hello'; } var myString = 'test'; myString = myString; // Does nothing, myString is still 'test'; myFunc(myString); console.log(myString); // logs 'test' 

निम्नलिखित को धयान मे रखते हुए:

  1. चर मेमोरी में मान के संकेत हैं
  2. किसी चरम बिंदु को पुन: सौंपने पर केवल उस बिंदु को एक नए मान पर इंगित करता है।
  3. एक चर को पुन: असाइन करने से वे अन्य ऑब्जेक्ट को कभी प्रभावित नहीं करेगा जो उस ऑब्जेक्ट पर इंगित कर रहे थे

तो, "संदर्भ / मूल्य" से गुजरने के बारे में भूल जाओ "संदर्भ / मूल्य से पास" पर लटका मत प्राप्त करें क्योंकि:

  1. शब्दों का उपयोग केवल एक भाषा के व्यवहार का वर्णन करने के लिए किया जाता है, जरूरी नहीं कि वास्तविक अंतर्निहित कार्यान्वयन। इस अमूर्त के परिणामस्वरूप, एक सभ्य व्याख्या के लिए जरूरी महत्वपूर्ण विवरण खो जाते हैं, जो अनिवार्य रूप से वर्तमान स्थिति की ओर जाता है जहां एक शब्द पर्याप्त रूप से वास्तविक व्यवहार और पूरक जानकारी प्रदान नहीं करता है
  2. इन अवधारणाओं को मूल रूप से जावास्क्रिप्ट को विशेष रूप से वर्णन करने के इरादे से परिभाषित नहीं किया गया था और इसलिए मुझे उनको उपयोग करने के लिए मजबूर नहीं लगता है, जब वे केवल भ्रम को जोड़ते हैं

आपके प्रश्न का उत्तर देने के लिए: संकेतक पारित किए जाते हैं

 // code var obj = { name: 'Fred', num: 1 }; // illustration 'Fred' / / (obj) ---- {} \ \ 1 

 // code obj.name = 'George'; // illustration 'Fred' (obj) ---- {} ----- 'George' \ \ 1 

 // code obj = {}; // illustration 'Fred' (obj) {} ----- 'George' | \ | \ { } 1 

 // code var obj = { text: 'Hello world!' }; /* function parameters get their own pointer to * the arguments that are passed in, just like any other variable */ someFunc(obj); // illustration (caller scope) (someFunc scope) \ / \ / \ / \ / \ / { } | | | 'Hello world' 

कुछ अंतिम टिप्पणियां:

  • यह सोचने के लिए प्रलोभन होता है कि पुरातन तत्वों को विशेष नियमों द्वारा लागू किया जाता है, जबकि ऑब्जेक्ट नहीं होते हैं, लेकिन प्राथमिकता केवल सूचक श्रृंखला का अंत है।
  • अंतिम उदाहरण के रूप में, विचार करें कि सरणी साफ़ करने का एक आम प्रयास अपेक्षा के अनुरूप काम क्यों नहीं करता है

 var a = [1,2]; var b = a; a = []; console.log(b); // [1,2] // doesn't work because `b` is still pointing at the original array 

फ़ंक्शन के बाहर ऑब्जेक्ट एक फ़ंक्शन में पारित किया जाता है जो बाहरी ऑगजेक्ट के संदर्भ में देता है। जब आप उस ऑब्जेक्ट को हेरफेर करने के लिए संदर्भ का उपयोग करते हैं, तो ऑब्जेक्ट के बाहर इस प्रकार प्रभावित होता है। हालांकि, फ़ंक्शन के अंदर अगर आपने किसी और चीज़ के संदर्भ को इंगित करने का निर्णय लिया है, तो आपने ऑब्जेक्ट को बिल्कुल भी प्रभावित नहीं किया है, क्योंकि आपने जो कुछ किया है वह कुछ और के संदर्भ को पुनः निर्देशित करता है।

जावास्क्रिप्ट हमेशा पास-बाय-वैल्यू होता है , सब कुछ वैल्यू टाइप का होता है ऑब्जेक्ट्स मूल्य हैं, ऑब्जेक्ट्स के सदस्य फ़ंक्शन स्वयं का मान है (याद रखें कि कार्य जावास्क्रिप्ट में प्रथम श्रेणी के ऑब्जेक्ट हैं)। इसके अलावा, इस अवधारणा के बारे में कि जावास्क्रिप्ट में सब कुछ एक वस्तु है , यह गलत है। स्ट्रिंग, प्रतीकों, संख्याएं, बुलियन, नल और अपरिभाषित हैं प्राथमिकताएं इस अवसर पर वे अपने सदस्य प्रोटोटाइप से विरासत में मिले कुछ सदस्य कार्यों और गुणों का लाभ उठा सकते हैं, लेकिन यह सुविधा के लिए ही है, इसका मतलब यह नहीं है कि वे खुद को ऑब्जेक्ट हैं। संदर्भ के लिए निम्नलिखित प्रयास करें

 x = "test"; alert(x.foo); x.foo = 12; alert(x.foo); 

दोनों चेतावनियों में आपको मूल्य को अनिर्धारित किया जाएगा।

नकल, पारित और मूल्य के आधार पर और संदर्भ के बारे में एक बहुत विस्तृत व्याख्या "जावास्क्रिप्ट: निश्चित गाइड" पुस्तक के इस अध्याय में है।

संदर्भ से वस्तुओं और सरणियों को जोड़कर करने के विषय को छोड़ने से पहले, हमें नामकरण के एक बिंदु को साफ़ करना होगा। वाक्यांश "संदर्भ से पास" के कई अर्थ हो सकते हैं कुछ पाठकों के लिए, वाक्यांश फ़ंक्शन इनवॉइस तकनीक को संदर्भित करता है जो फ़ंक्शन को अपने तर्कों के लिए नए मानों को आवंटित करने और फ़ंक्शन के बाहर दृश्यमान उन संशोधित मानों को प्रदान करने की अनुमति देता है। यह इस पुस्तक में शब्द का उपयोग करने का तरीका नहीं है। यहाँ, हमारा मतलब है कि किसी ऑब्जेक्ट या सरणी के लिए कोई संदर्भ – ऑब्जेक्ट ही नहीं – फ़ंक्शन को पास किया गया है एक फ़ंक्शन ऑब्जेक्ट के गुणों को संशोधित करने या सरणी के तत्वों को संशोधित करने के लिए संदर्भ का उपयोग कर सकता है। लेकिन यदि फ़ंक्शन किसी नए ऑब्जेक्ट या ऑरेरे के संदर्भ से संदर्भ को ओवरराइट करता है, तो उस फ़ंक्शन को फ़ंक्शन के बाहर दिखाई नहीं दे रहा है। इस अवधि के अन्य अर्थ से परिचित पाठक यह कह सकते हैं कि वस्तुओं और सरणियों को मूल्य से पारित किया जाता है, लेकिन जो मूल्य पारित किया गया है वह वास्तव में वस्तु के बजाय एक संदर्भ है।

एक बात मैं अभी भी समझ नहीं सकता नीचे कोड जांचें कोई विचार?

 function A() {} A.prototype.foo = function() { return 'initial value'; } function B() {} B.prototype.bar = A.prototype.foo; console.log(A.prototype.foo()); //initial value console.log(B.prototype.bar()); //initial value A.prototype.foo = function() { return 'changed now'; } console.log(A.prototype.foo()); //changed now console.log(B.prototype.bar()); //Why still 'initial value'??? 

इसके बारे में सोचें: यह हमेशा मूल्य से गुजरता है हालांकि, किसी ऑब्जेक्ट का मान वस्तु ही नहीं है, लेकिन उस ऑब्जेक्ट का एक संदर्भ है।

यहाँ एक उदाहरण है, एक संख्या (एक आदिम प्रकार)

 function changePrimitive(val) { //at this point there are two '10's in memory. Changing one won't affect the other val = val * 10; } var x = 10; changePrimitive(x); //x === 10 

किसी ऑब्जेक्ट के साथ इसे दोहराते हुए अलग-अलग परिणाम देते हैं:

 function changeObject(obj) { //at this point there are two references (x and obj) in memory, but these both point to the same object. //changing the object will change the underlying object x and obj both hold a reference to obj.val = obj.val * 10; } var x = { val: 10 }; changeObject(x); //x === { val: 100 } 

एक और उदाहरण:

 function changeObject(obj) { //again, there are two references (x and obj) in memory, these both point to the same object. //now we create a completely new object and assign it. //obj's reference now points to the new object. x's reference doesn't change obj = { val: 100 }; } var x = { val: 10 }; changeObject(x); //x === { val: 10} 

जावास्क्रिप्ट में, मूल्य का प्रकार पूरी तरह से नियंत्रित करता है कि मूल्य उस मूल्य-प्रति या संदर्भ-प्रति द्वारा निर्दिष्ट किया जाएगा।

आदिम मान हमेशा मूल्य प्रति द्वारा सौंपा / पास किए जाते हैं :

  • null
  • undefined
  • तार
  • संख्या
  • बूलियन
  • ES6 में प्रतीक

यौगिक मूल्यों को संदर्भ-कॉपी द्वारा हमेशा असाइन किया गया / पारित किया जाता है

  • वस्तुओं
  • सरणियों
  • समारोह

उदाहरण के लिए

 var a = 2; var b = a; // `b` is always a copy of the value in `a` b++; a; // 2 b; // 3 var c = [1,2,3]; var d = c; // `d` is a reference to the shared `[1,2,3]` value d.push( 4 ); c; // [1,2,3,4] d; // [1,2,3,4] 

उपर्युक्त स्निपेट में, क्योंकि 2 एक स्केलर आदिम है, उस मूल्य की एक प्रारंभिक प्रतिलिपि रखती है, और b मूल्य की एक और प्रति को सौंपा गया है। जब b बदलते हैं, तो आप किसी भी मूल्य में बदलाव नहीं कर सकते।

लेकिन दोनों c और d समान साझा मूल्य [1,2,3] अलग संदर्भ हैं, जो कि एक मिश्रित मूल्य है। यह ध्यान रखना महत्वपूर्ण है कि न तो c और न ही " [1,2,3] मूल्य" का "मालिक" है – दोनों मूल्य के बराबर समान संदर्भ हैं इसलिए, वास्तविक रूप से साझा किए गए array मूल्य को संशोधित करने के लिए संदर्भ ( .push(4) ) का उपयोग करते समय, यह केवल एक साझा मूल्य को प्रभावित कर रहा है, और दोनों संदर्भ में नए संशोधित मान [1,2,3,4] संदर्भ दिया जाएगा।

 var a = [1,2,3]; var b = a; a; // [1,2,3] b; // [1,2,3] // later b = [4,5,6]; a; // [1,2,3] b; // [4,5,6] 

जब हम असाइनमेंट b = [4,5,6] बनाते हैं, तो हम प्रभावित करने के लिए पूरी तरह से कुछ नहीं कर रहे हैं, जहां अभी भी संदर्भित है ( [1,2,3] )। ऐसा करने के लिए, b को array संदर्भ के बजाय एक संकेतक होना चाहिए – लेकिन जेएस में ऐसी कोई क्षमता मौजूद नहीं है!

 function foo(x) { x.push( 4 ); x; // [1,2,3,4] // later x = [4,5,6]; x.push( 7 ); x; // [4,5,6,7] } var a = [1,2,3]; foo( a ); a; // [1,2,3,4] not [4,5,6,7] 

जब हम तर्क में a पास करते हैं, तो यह x संदर्भ में एक प्रति देते हैं x और a अलग संदर्भ [1,2,3] मूल्य पर इंगित करते हैं। अब, फ़ंक्शन के अंदर, हम उस संदर्भ का उपयोग मूल्य को स्वयं बदलना ( push(4) ) कर सकते हैं। लेकिन जब हम असाइनमेंट x = [4,5,6] बनाते हैं, तो इसका कोई प्रभाव नहीं पड़ता है जहां शुरुआती संदर्भ की ओर इशारा करते हैं – फिर भी (अब संशोधित) [1,2,3,4] मूल्य पर अंक।

मूल्य-प्रति द्वारा यौगिक मूल्य ( array तरह) को प्रभावी रूप से पारित करने के लिए, आपको स्वयं की प्रतिलिपि बनाने की आवश्यकता है, ताकि संदर्भ पारित अभी तक मूल को इंगित न करें। उदाहरण के लिए:

 foo( a.slice() ); 

यौगिक मूल्य (वस्तु, सरणी, आदि) जिसे संदर्भ-प्रति द्वारा पारित किया जा सकता है

 function foo(wrapper) { wrapper.a = 42; } var obj = { a: 2 }; foo( obj ); obj.a; // 42 

यहां, obj स्केलर आदिम संपत्ति के लिए एक आवरण के रूप में कार्य करता a । जब foo(..) को पारित किया जाता है, obj संदर्भ की एक प्रति में पारित किया जाता है और wrapper पैरामीटर पर सेट किया जाता है। अब हम साझा वस्तु का उपयोग करने के लिए wrapper संदर्भ का उपयोग कर सकते हैं, और अपनी संपत्ति को अपडेट कर सकते हैं। फ़ंक्शन समाप्त होने के बाद, obj.a अपडेट किए गए मान 42 देखेंगे।

स्रोत

यहाँ जेएस में शब्द "पास से संदर्भ" के उपयोग के बारे में कुछ चर्चा है , लेकिन आपके प्रश्न का उत्तर देने के लिए:

विशेष रूप से इसे निर्दिष्ट करने की आवश्यकता के बिना एक ऑब्जेक्ट संदर्भ द्वारा स्वचालित रूप से पारित किया गया है

(ऊपर वर्णित लेख से।)

The most succinct explanation I found was in the AirBNB style guide :

  • Primitives : When you access a primitive type you work directly on its value

    • string
    • number
    • boolean
    • शून्य
    • undefined

उदाहरण के लिए:

 var foo = 1, bar = foo; bar = 9; console.log(foo, bar); // => 1, 9 
  • Complex : When you access a complex type you work on a reference to its value

    • object
    • array
    • समारोह

उदाहरण के लिए:

 var foo = [1, 2], bar = foo; bar[0] = 9; console.log(foo[0], bar[0]); // => 9, 9 

Ie effectively primitive types are passed by value, and complex types are passed by reference.

Passing arguments to a function in JavaScript is analogous to passing parameters by pointer value in C:

 /* The following C program demonstrates how arguments to JavaScript functions are passed in a way analogous to pass-by-pointer-value in C. The original JavaScript test case by @Shog9 follows with the translation of the code into C. This should make things clear to those transitioning from C to JavaScript. function changeStuff(num, obj1, obj2) { num = num * 10; obj1.item = "changed"; obj2 = {item: "changed"}; } var num = 10; var obj1 = {item: "unchanged"}; var obj2 = {item: "unchanged"}; changeStuff(num, obj1, obj2); console.log(num); console.log(obj1.item); console.log(obj2.item); This produces the output: 10 changed unchanged */ #include <stdio.h> #include <stdlib.h> struct obj { char *item; }; void changeStuff(int *num, struct obj *obj1, struct obj *obj2) { // make pointer point to a new memory location // holding the new integer value int *old_num = num; num = malloc(sizeof(int)); *num = *old_num * 10; // make property of structure pointed to by pointer // point to the new value obj1->item = "changed"; // make pointer point to a new memory location // holding the new structure value obj2 = malloc(sizeof(struct obj)); obj2->item = "changed"; free(num); // end of scope free(obj2); // end of scope } int num = 10; struct obj obj1 = { "unchanged" }; struct obj obj2 = { "unchanged" }; int main() { // pass pointers by value: the pointers // will be copied into the argument list // of the called function and the copied // pointers will point to the same values // as the original pointers changeStuff(&num, &obj1, &obj2); printf("%d\n", num); puts(obj1.item); puts(obj2.item); return 0; } 

Semantics!! Setting concrete definitions will necessarily make some answers and comments incompatible since they are not describing the same thing even when using the same words and phrases, but it is critical to get past the confusion (especially for new programmers).

First of all, there are multiple levels of abstraction that not everyone seems to grasp. Newer programmers who have learned on 4th or 5th generation languages may have difficulty wrapping their mind around concepts familiar to assembly or C programmers not phased by pointers to pointers to pointers. Pass-by-reference does not simply mean the ability to change a referenced object using a function parameter variable.

Variable : Combined concept of a symbol which references a value at a particular location in memory. This term is usually too loaded to be used alone in discussing details.

Symbol : Text string used to refer to variable (ie variable's name).

Value : Particular bits stored in memory and referenced using variable's symbol.

Memory location : Where a variable's value is stored. (The location itself is represented by a number separate from the value stored at the location.)

Function parameter : Variable declared in a function definition, used for referencing variables passed to the function.

Function argument : Variable outside the function which is passed to the function by the caller.

Object variable : Variable whose basic underlying value is not the "object" itself, rather its value is a pointer (memory location value) to another location in memory where the object's actual data is stored. In most higher-generation languages, the "pointer" aspect is effectively hidden by automatic de-referencing in various contexts.

Primitive variable : Variable whose value IS the actual value. Even this concept can be complicated by auto-boxing and object-like contexts of various languages, but the general ideas is that the variable's value IS the actual value represented by the variable's symbol rather than a pointer to another memory location.

Function arguments and parameters are not the same thing. Also, a variable's value is not the variable's object (as already pointed out by various people, but apparently ignored). These distinctions are critical to proper understanding.

Pass-by-value or Call-by-sharing (for objects) : The function argument's value is COPIED to another memory location which is referenced by the function's parameter symbol (regardless of whether it's on the stack or heap). In other words, the function parameter received a copy of the passed argument's value… AND (critical) the argument's value IS NEVER UPDATED / ALTERED / CHANGED by the calling function. Remember, an object variable's value is NOT the object itself, rather it is the pointer to the object, so passing an object variable by value copies the pointer to the function parameter variable. The function parameter's value points to the exact same object in memory. The object data itself can be altered directly via the function parameter, BUT the function argument's value IS NEVER UPDATED, so it will continue to point to the same object throughout and even after the function call (even if its object's data was altered or if the function parameter is assigned a different object altogether). It is incorrect to conclude that the function argument was passed by reference just because the referenced object is updatable via the function parameter variable.

Call / Pass-by-reference : The function argument's value can/will be updated directly by the corresponding function parameter. If it helps, the function parameter becomes an effective "alias" for the argument–they effectively refer to the same value at the same memory location. If a function argument is an object variable, the ability to change the object's data is no different than the pass-by-value case since the function parameter will still point to the same object as the argument. But in the object variable case, if the function parameter is set to a completely different object, then the argument will likewise also point to the different object–this does not happen in the pass-by-value case.

JavaScript does not pass by reference. If you read closely, you will realize that all contrary opinions misunderstand what is meant by pass-by-value and they falsely conclude that the ability to update an object's data via the function parameter is synonymous to "pass-by-value".

Object clone/copy : A new object is created and the original object's data is copied. This can be a deep copy or shallow copy, but the point is that a new object is created. Creating a copy of an object is a separate concept from pass-by-value. Some languages distinguish between class object and structs (or the like), and may have different behavior for passing variables of the different types. But JavaScript does not do anything like this automatically when passing object variables. But the absence of automatic object cloning does not translate to pass-by-reference.

An easy way to determine whether something is "pass by reference" is whether you can write a "swap" function. For example, in C, you can do:

 void swap(int *i, int *j) { int t; t = *i; *i = *j; *j = t; } 

If you can't do the equivalent of that in Javascript, it is not "pass by reference".

My simple way to understand this…

  • When calling a function, you are passing the content (reference or value) of the argument variables, not the the variables themselves.

     var var1 = 13; var var2 = { prop: 2 }; //13 and var2's content (reference) are being passed here foo(var1, var2); 
  • Inside the function, parameter variables, inVar1 and inVar2 , receive the contents being passed.

     function foo(inVar1, inVar2){ //changing contents of inVar1 and inVar2 won't affect variables outside inVar1 = 20; inVar2 = { prop: 7 }; } 
  • Since inVar2 received the reference of { prop: 2 } , you can change the value of the object's property.

     function foo(inVar1, inVar2){ inVar2.prop = 7; } 

In a low level language, if you want to pass a variable by reference you have to use a specific syntax in the creation of the function:

 int myAge = 14; increaseAgeByRef(myAge); function increaseAgeByRef(int &age) { *age = *age + 1; } 

The &age is a reference to myAge , but if you want the value you have to convert the reference, using *age .

Javascript is a high level language that does this conversion for you. So, although objects are passed by reference, the language converts the reference parameter to the value. You don't need to use & , on the function definition, to pass it by reference, neither * , on the function body, to convert the reference to the value, JS does it for you.

That's why when you try to change an object inside a function, by replacing it's value (ie age = {value:5} ), the change doesn't persist, but if you change it's properties (ie age.value = 5 ), it does.

और अधिक जानें

I have found the extend method of the Underscore.js library very useful when I want to pass in an object as a parameter which may either be modified or replaced entirely.

 function replaceOrModify(aObj) { if (modify) { aObj.setNewValue('foo'); } else { var newObj = new MyObject(); // _.extend(destination, *sources) _.extend(newObj, aObj); } } 
  1. Primitives (Number, Boolean) are passed by value.
    • Strings are immutable, so it doesn't really matter for them.
  2. Objects are passed by reference ( the reference is passed by value)

I've read through these answers multiple times, but didn't REALLY get it until I learned about the technical definition of "Call by sharing" as termed by Barbara Liskov

The semantics of call by sharing differ from call by reference in that assignments to function arguments within the function aren't visible to the caller (unlike by reference semantics)[citation needed], so eg if a variable was passed, it is not possible to simulate an assignment on that variable in the caller's scope. However, since the function has access to the same object as the caller (no copy is made), mutations to those objects, if the objects are mutable, within the function are visible to the caller, which may appear to differ from call by value semantics. Mutations of a mutable object within the function are visible to the caller because the object is not copied or cloned — it is shared.

That is, parameter references are alterable if you go and access the parameter value itself. On the other hand, assignment to a parameter will disappear after evaluation, and is non-accessible to the function caller.

For programming language lawyers, I've went through the following sections of ECMAScript 5.1 (which is easier to read than the latest edition), and go as far as asking it on the ECMAScript mailing list.

TL;DR : Everythings're passed by value, but properties of Objects are references, and the definition of Object is creepily lacking in the standard.

Construction of Argument Lists

Section 11.2.4 "Argument Lists" says the following on producing a argument list consisting of only 1 argument:

The production ArgumentList : AssignmentExpression is evaluated as follows:

  1. Let ref be the result of evaluating AssignmentExpression.
  2. Let arg be GetValue(ref).
  3. Return a List whose sole item is arg.

The section also enumerate cases where argument list has 0 or >1 arguments.

Thus, everything's are passed by reference.

Access of Object Properties

Section 11.2.1 "Property Accessors"

The production MemberExpression : MemberExpression [ Expression ] is evaluated as follows:

  1. Let baseReference be the result of evaluating MemberExpression.
  2. Let baseValue be GetValue(baseReference).
  3. Let propertyNameReference be the result of evaluating Expression.
  4. Let propertyNameValue be GetValue(propertyNameReference).
  5. Call CheckObjectCoercible(baseValue).
  6. Let propertyNameString be ToString(propertyNameValue).
  7. If the syntactic production that is being evaluated is contained in strict mode code, let strict be true, else let strict be false.
  8. Return a value of type Reference whose base value is baseValue and whose referenced name is propertyNameString, and whose strict mode flag is strict.

Thus, properties of Objects are always available as reference.

On Reference

It is described in section 8.7 "The Reference Specification Type", that references are not real types in the language – they're only used to describe the behavior of the delete, the typeof, and the assignment operators.

Definition of "Object"

It is defined in 5.1 edition that "An Object is a collection of properties". Therefore, we can infer, that the value of the object is the collection, but as to what is the value of the collection is poorly defined in the spec, and requires a bit of effort to understand.

Simple values inside functions will not change those values outside of the function (they are passed by value), whereas complex ones will (they are passed by reference).

 function willNotChange(x) { x = 1; } var x = 1000; willNotChange(x); document.write('After function call, x = ' + x + '<br>'); //still 1000 function willChange(y) { y.num = 2; } var y = {num: 2000}; willChange(y); document.write('After function call y.num = ' + y.num + '<br>'); //now 2, not 2000 
  1. primitive type variable like string,number are always pass as pass by value.
  2. Array and Object is passed as pass by reference or pass by value based on these two condition.

    • if you are changing value of that Object or array with new Object or Array then it is pass by Value.

      object1 = {item: "car"}; array1=[1,2,3];

    here you are assigning new object or array to old one.you are not changing the value of property of old object.so it is pass by value.

    • if you are changing a property value of an object or array then it is pass by Reference.

      object1.key1= "car"; array1[0]=9;

    here you are changing a property value of old object.you are not assigning new object or array to old one.so it is pass by reference.

कोड

  function passVar(object1, object2, number1) { object1.key1= "laptop"; object2 = { key2: "computer" }; number1 = number1 + 1; } var object1 = { key1: "car" }; var object2 = { key2: "bike" }; var number1 = 10; passVar(object1, object2, number1); console.log(object1.key1); console.log(object2.key2); console.log(number1); Output: - laptop bike 10 

I would say it is pass-by-copy –

Consider arguments and variable objects are objects created during the execution context created in the beginning of function invocation – and your actual value/reference passed into the function just get stored in this arguments + variable objects.

Simply speaking, for primitive types, the values get copied in the beginning of function call, for object type, the reference get copied.

sharing what I know of references in javascript

In Javascript, objects are stored as references:

 var a = { a: 1, b: 2, c: 3 }; var b = a; //bc is referencing to ac value console.log(bc) //output: 2 //changing value of bc bc = 4 //also changes the value of ac console.log(ac) //output: 4 

Primitives are passed by value and objects are passed by reference. This is quite different from other languages like C, VB or Delphi. I can't say how they handle objects and primitives exactly, but I know of VB and Delphi that it can (and should) be specified.

php does something similar since version 5: all objects are passed by reference, but all primitives may be passed by reference, if preceeded by an ampersand (&). Otherwise primitives are passed by value.

So in javascript, if I pass an object X into a function via a parameter, it will still be X. If you are changing data inside the function (or any other object, but that's not important) that new value is also available outside the function.

In some case, this may be helpful to alter anArg :

 function alterMyArg(func) { // process some data // ... func(data); } alertMyArg(function(d) {anArg = d;}); 
  • When an object is created, it exists on the heap.
  • When a primitive value is established, it lives on the stack.
  • In order to use either, you must have a variable associated with it.

With an object, the variable is essentially a pointer on the stack that points to the memory location on the heap where the object is stored. With a primitive, the variable and the value are stored together on the stack.

When you pass an object variable in JavaScript, it is always passed by Reference, meaning that the a copy of the REFERENCE is passed to the callee. If the underlying object is manipulated by the callee, the original object will be modified outside the function as well.

When you pass a stack variable in JavaScript, a copy of the actual value is passed to the callee. If the callee modifies the value it receives, the value is not modified outside of the function.