javascript - atscript - मूल्य बनाम संदर्भ बनाम जावास्क्रिप्ट




स्क्रिप्टिंग भाषा (3)

  1. स्ट्रिंग की तरह आदिम प्रकार परिवर्तनीय, संख्या हमेशा मूल्य से गुजरती है।
  2. ऐरे और ऑब्जेक्ट को संदर्भ के अनुसार पास किया जाता है या इन दो स्थितियों के आधार पर मूल्य से गुजरता है।

    • यदि आप उस ऑब्जेक्ट या सरणी के मान को नए ऑब्जेक्ट या ऐरे के साथ बदल रहे हैं तो यह वैल्यू द्वारा पास किया जाता है।

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

    यहां आप पुराने ऑब्जेक्ट या सरणी को पुराने में असाइन कर रहे हैं। आप पुराने ऑब्जेक्ट की संपत्ति के मूल्य को नहीं बदल रहे हैं। इसलिए यह मूल्य से गुजरता है।

    • यदि आप किसी ऑब्जेक्ट या सरणी के प्रॉपर्टी वैल्यू को बदल रहे हैं तो यह संदर्भ द्वारा पास किया जाता है।

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

    यहां आप पुराने ऑब्जेक्ट का एक प्रॉपर्टी वैल्यू बदल रहे हैं। आप नए ऑब्जेक्ट या सरणी को पुराने में असाइन नहीं कर रहे हैं। इसलिए यह संदर्भ से गुजरता है।

कोड

    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

इस प्रश्न का उत्तर यहां दिया गया है:

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

मैंने बहुत सारी खोज की है और बहुत से विशिष्ट उदाहरण (उनमें से कई यहां SO पर) ढूंढ चुके हैं, जिससे मैं वास्तविक नियमों के टुकड़ों को एकसाथ टुकड़ा करना शुरू कर सकता हूं, लेकिन मुझे अभी तक एक एकल, अच्छी तरह से लिखित दस्तावेज़ नहीं मिला है यह सब वर्णन करता है।

साथ ही, क्या भाषा में संदर्भ या मूल्य से कुछ पारित किया गया है या नहीं, इस पर नियंत्रण करने के तरीके हैं?

यहां कुछ प्रकार के प्रश्न हैं जिन्हें मैं समझना चाहता हूं। ये केवल उदाहरण हैं - मैं वास्तव में उन विशिष्ट नियमों को समझने की कोशिश कर रहा हूं, जो कि विशिष्ट उदाहरणों के उत्तर न केवल भाषा के नियमों को समझते हैं। लेकिन, यहां कुछ उदाहरण दिए गए हैं:

function f(a,b,c) {
   a = 3;
   b.push("foo");
   c.first = false;
}

var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);

एक्स, वाई और जेड की सामग्री कब विभिन्न प्रकार के लिए एफ के दायरे से बाहर हो गई है?

function f() {
    var a = ["1", "2", "3"];
    var b = a[1];
    a[1] = "4";
    // what is the value of b now for all possible data types that the array in "a" might hold?
}

function f() {
    var a = [{yellow: "blue"}, {red: "cyan"}, {green: "magenta"}];
    var b = a[1];
    a[1].red = "tan";
    // what is the value of b now and why?
    b.red = "black";
    // did the value of a[1].red change when I assigned to b.red?
}

अगर मैं किसी ऑब्जेक्ट की पूरी तरह से स्वतंत्र प्रतिलिपि बनाना चाहता हूं (कोई संदर्भ नहीं), तो ऐसा करने का सबसे अच्छा तरीका क्या है?


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

एक उदाहरण:

function changeParam(x, y, z) {
  x = 3;
  y = "new string";
  z["key2"] = "new";
  z["key3"] = "newer";

  z = {"new" : "object"};
}

var a = 1,
    b = "something",
    c = {"key1" : "whatever", "key2" : "original value"};

changeParam(a, b, c);

// at this point a is still 1
// b is still "something"
// c still points to the same object but its properties have been updated
// so it is now {"key1" : "whatever", "key2" : "new", "key3" : "newer"}
// c definitely doesn't point to the new object created as the last line
// of the function with z = ...

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

लेकिन, मुझे लगता है कि आप इसे पहले ही एसओ पर पढ़ चुके हैं; here आपके पास वह दस्तावेज है जो आप चाहते हैं:

here






pass-by-value