javascript - على - شرح جافا سكريبت




هل يتم دفع الكائنات إلى مصفوفة في جافا سكريبت في نسخة عميقة أم ضحلة؟ (2)

سؤال بديهي ذاتي ... عند استخدام .push () على صفيف في javascript ، يتم دفع الكائن إلى الصفيف مؤشر (ضحل) أو الكائن الفعلي (عميق) بغض النظر عن النوع.


jfriend00 محق في العلامة هنا ، لكن توضيح واحد صغير: هذا لا يعني أنه لا يمكنك تغيير ما يشير إليه المتغير. أي ، في البداية ، تشير إلى بعض المتغيرات التي تضعها في المصفوفة ، ولكن يمكنك حينئذٍ أن تأخذ المتغير المسمى y ، وتفصله عن الكائن الموجود في المصفوفة الآن ، وتربط y (أي ، اجعله مرجعاً ) شيئًا مختلفًا تمامًا بدون تغيير الكائن المشار إليه الآن بواسطة الصفيف فقط .

http://jsfiddle.net/rufwork/5cNQr/6/

var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};

// 1.) pushes a copy
array.push(x);
x = 5;
document.write(array[0] + "<br>");    // alerts 4 because it's a copy

// 2.) pushes a reference
array.push(y);
y.name = "foo";

// 3.) Disconnects y and points it at a new object
y = {}; 
y.name = 'bar';
document.write(array[1].name + ' :: ' + y.name + "<br>");   
// alerts "foo :: bar" because y was a reference, but then 
// the reference was moved to a new object while the 
// reference in the array stayed the same (referencing the 
// original object)

// 4.) Uses y's original reference, stored in the array,
// to access the old object.
array[1].name = 'foobar';
document.write(array[1].name + "<br>");
// alerts "foobar" because you used the array to point to 
// the object that was initially in y.

هذا يعتمد على ما تدفعه يتم دفع الكائنات والصفائف كمؤشر للكائن الأصلي. يتم دفع أنواع بدائية مدمجة مثل الأرقام أو booleans كنسخة. لذلك ، بما أن الكائنات لا يتم نسخها بأي شكل من الأشكال ، فليس هناك نسخة عميقة أو ضحلة بالنسبة لهم.

إليك مقتطف عمل يوضح ذلك:

var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};

// primitive value pushes a copy of the value 4
array.push(x);                // push value of 4
x = 5;                        // change x to 5
console.log(array[0]);        // array still contains 4 because it's a copy

// object reference pushes a reference
array.push(y);                // put object y reference into the array
y.name = "foo";               // change y.name property
console.log(array[1].name);   // logs changed value "foo" because it's a reference





push