මගේ ශත දෙක ... මම එය තේරුම් ගන්නා ආකාරය මෙයයි. (මා වැරදියි නම් මාව නිවැරදි කිරීමට නිදහස් වන්න)
අගය / යොමු කිරීම අනුව ඔබ දන්නා සියල්ල ඉවත දැමීමට කාලයයි.
ජාවාස්ක්රිප්ට් හි, එය අගය හෝ යොමු කිරීම හෝ වෙනත් දෙයක් මගින් සම්මත වී ඇත්ද යන්න ගැටළුවක් නොවේ. වැදගත් වන්නේ විකෘතියට එදිරිව පරාමිතීන් ශ්රිතයකට පැවරීමයි.
හරි, මා අදහස් කරන දේ පැහැදිලි කිරීමට මගේ උපරිමය කිරීමට මට ඉඩ දෙන්න. අපි ඔබට වස්තු කිහිපයක් ඇති බව කියමු.
var object1 = {};
var object2 = {};
අප කර ඇත්තේ "පැවරුම" යන්නයි ... අපි "object1" සහ "object2" යන විචල්යයන් සඳහා වෙනම හිස් වස්තු 2 ක් පවරා ඇත.
දැන් අපි කියමු අපි object1 වඩා හොඳට කැමතියි ... ඉතින්, අපි නව විචල්යයක් "පවරමු".
var favoriteObject = object1;
ඊළඟට, කුමන හේතුවක් නිසා හෝ, අපි වස්තුව 2 වඩා හොඳට තීරණය කරමු. ඉතින්, අපි ටිකක් නැවත පැවරීමක් කරන්නෙමු.
favoriteObject = object2;
Object1 හෝ object2 ට කිසිවක් සිදු නොවීය. අපි කිසිසේත් දත්ත වෙනස් කර නැත. අප කළේ අපගේ ප්රියතම වස්තුව කුමක්ද යන්න නැවත පැවරීමයි. Object2 සහ favoriteObject යන දෙකම එකම වස්තුවකට පවරා ඇති බව දැන ගැනීම වැදගත්ය. එම විචල්යයන්ගෙන් එකක් හරහා අපට එම වස්තුව වෙනස් කළ හැකිය.
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'
අහ් .... මොකද උනේ. ප්රියතම ස්ට්රිං වෙනස් කිරීමෙන් අපට string1 වෙනස් කළ නොහැක ... ඇයි ?? මොකද අපි අපේ නූල් වස්තුව වෙනස් කළේ නැහැ . අප කළේ නව නූලකට කැමතිම ස්ට්රිං විචල්යය "RE ASSIGN" පමණි . මෙය අත්යවශ්යයෙන්ම එය 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 the variable
otherObj = {
firstName: 'Jack',
lastName: 'Frost'
};
// Now, otherObj and myObject are assigned to 2 very different objects
// And mutating one object has no influence on 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 doesn't magically mutate 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'