سؤال

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

ولكن، عندما كنت تعديل نسخة، يتم تعديل أيضا الأصلي! نلقي نظرة:

<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>

هل هناك أي طريقة للاحتفاظ الأصلي وتعديل النسخة؟

هل كانت مفيدة؟

المحلول

وأنت لم تقدم نسخة من مجموعة. يمكنك ببساطة تعيين مجموعة لمتغير آخر. هذا لا نسخ في جافا سكريبت. في المثال الخاص بك لا يوجد سوى مجموعة واحدة مع اثنين من المتغيرات التي يمكنك الوصول إليه. لا توجد وسيلة المدمج في لنسخ المصفوفات في جافا سكريبت لذلك سوف تحتاج لكتابة وظيفة الخاصة بك للقيام بذلك.

ونلقي نظرة على هذا السؤال ستاكوفيرفلوو للحصول على لمحة عن كيفية تطبيق في الواقع نسخ من العناصر في المصفوفة.

نصائح أخرى

ووبعض من بني في وظائف صفيف فعلا إنشاء نسخة لك. أحد هؤلاء هو شريحة.

وعلى سبيل المثال:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

http://my.opera.com/GreyWyvern/blog/ show.dml / 1725165

ما تقومون به ليس هو خلق نسخة من مجموعة، انها فقط إنشاء نسخة من الإشارة إلى مجموعة، حتى تحصل على مرجعين إلى نفس الكائن مجموعة.

وهذه هي الطريقة التي يمكنك إنشاء نسخة الفعلية للمجموعة:

var np = op.concat();

وطريقة concat يخلق مجموعة جديدة هي نسخة من مجموعة مع أي بنود إضافية المضافة. إذا لم تقم بتحديد أي بنود إضافية لك مجرد الحصول على نسخة من مجموعة.

Array.prototype.copy = function() {
    return this.slice(0, this.length);
  }

وبعد ذلك


var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)

ويجب أن استنساخ مجموعة الثانية بدلا من نسخها.

و--- تحديث

إذا قمت بتعيين كائن إلى متغير، يتم نسخ فقط الإشارة (هذا يعني، وكلاهما يشيران إلى نفس البيانات). لوجود نسخة مستقلة من هذا الكائن تحتاج إلى استنساخ ذلك. وهناك عدة طرق كيفية ذلك، على سبيل المثال <لأ href = "https://stackoverflow.com/questions/122102/what-is-the-most-efficent-way-to-clone-a-javascript-object" > هنا هو طريق استنساخ كائن باستخدام مسج.

ويمكنك فقط استخدام الأسلوب slice الأصلي الذي يعود على نسخة من مجموعة:

var np = op.slice(0,op.length);

يجب أن تكون المعلمة الثانية اختياري، ولكن في IE أعتقد هو مطلوب منها.

والتعليمات البرمجية الخاصة بك، مع استكمال التغيير:

var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)

لإنشاء مجموعة جديدة قد ترغب في النظر فيما يلي:

   var op = [];

لنسخ صفيف:

var np=op.slice();

أو

var np=op.concat();

وCONCAT أسرع، في حين أن شريحة يستغرق أقل حرف واحد. بعض الناس الملقب ب "شريحة" أو "CONCAT" ك "نسخة" بحيث يكون أكثر وضوحا أن كنت صنع نسخة منه.

لا حاجة لمعلمات في كلتا الحالتين. سوف المعلمات في شريحة جعل مجرد رمز أكبر وأبطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top