ملخص جملة واحدة: لن تغير القيمة الأصلية القيمة الأصلية بغض النظر عما إذا كانت مهمة متغيرة أو تمريرة دالة. سواء كانت مهمة متغيرة أو تمريرة دالة ، إذا تم إعادة تعيين المتغير الجديد ، فلن يؤثر ذلك على القيمة المرجعية الأصلية. إذا كان المتغير الجديد عبارة عن عملية مباشرة ، فسيؤثر ذلك على القيمة المرجعية الأصلية.
بادئ ذي بدء ، من الواضح أن القيم والأنواع هما مفهومين مختلفين. على سبيل المثال ، NULL هي القيمة الفريدة للنوع الفارغ ، غير المحددة هي القيمة الفريدة للنوع غير المحدد ، والصحيح والخطأ هما القيمان الوحيدتان للنوع المنطقي ، وما إلى ذلك. في أي لغة ، يمكن تلخيص تشغيل القيمة في الجوانب الثلاثة التالية.
نسخ القيمة: أي ، قم بتعيين القيمة إلى متغير جديد ، أو تعيين القيمة إلى عنصر أو سمة أو صفيف متغير آخر من خلال المتغير.
تمرير القيمة: أي تمرير القيمة كمعلمة إلى وظيفة أو طريقة.
قارن القيم: أي ، قارن القيمة بقيمة أخرى لمعرفة ما إذا كانت متساوية.
نظرًا لأن قيم بيانات نوع القيمة والبيانات المرجعية لها نماذج مختلفة ، فإن طرق تشغيلها بشكل طبيعي والنتائج المنتجة تختلف أيضًا. لاحظ أنه عندما تكون القيمة هي بيانات نوع القيمة ، فإننا نسميها القيمة الأصلية أو القيمة الأساسية ؛ عندما تتم الرجوع إلى البيانات ، فإننا نسميها القيمة المرجعية أو القيمة المركبة.
1. استخدم القيم الأصلية
بالنسبة للقيمة الأصلية ، يتم شرح المستويات الثلاثة من تشغيلها على النحو التالي.
1) انسخ القيمة
في بيان المهمة ، ستنتج عملية التشغيل نسخة من القيمة الفعلية. لا يوجد اتصال بين قيمة النسخة والقيمة الفعلية. وهي موجودة في مناطق كومة مختلفة أو مناطق كومة وحدها. يمكن لهذه النسخة تخزين المتغيرات وخصائص الكائنات وعناصر الصفيف. على سبيل المثال:
var n = 123 ، a ، b = [] ، c = {} ؛ أ = ن ؛ // انسخ الرقم 123 B [0] = n ؛ // انسخ الرقم 123 cx = n ؛ // انسخ الرقم 123 (a == b [0]) && (a == cx) && (b [0] == cx) && alert ("القيم النسخ متساوية") ؛ // الكشف عن أن قيمها متساويةفي المثال أعلاه ، يتم نسخ القيمة 123 3 نسخ إلى المتغير A ، المصفوفة B والكائن C على التوالي. على الرغم من أن قيمها متساوية ، إلا أنها مستقلة عن بعضها البعض.
2) تمرير القيمة
عند تمرير قيمة إلى وظيفة أو طريقة ، تكون القيمة التي تم تمريرها مجرد نسخة ، وليس القيمة نفسها. على سبيل المثال ، إذا قمت بتعديل القيمة التي تم تمريرها في دالة ، فيمكن أن تؤثر النتيجة فقط على نسخة من قيمة المعلمة ولن تؤثر على القيمة الأصلية.
var a = 123 ؛ // وظيفة القيمة الأصلية f (x) {x = x + x ؛ } f (a) ؛ // استدعاء الوظيفة لتعديل تنبيه القيمة المرتفع (A) ؛ // تحقق مما إذا كانت قيمة المتغير A تتأثر. قيمة الإرجاع هي 123 ، مما يشير إلى عدم وجود تغيير3) قيمة المقارنة
في المثال أعلاه ، يمكننا أيضًا أن نرى أنه عند مقارنة القيم الأصلية ، يتم إجراء مقارنة بايت بايت لتحديد ما إذا كانت متساوية. مقارنة القيم نفسها ، وليس الموقع الذي تكون فيه القيم. على الرغم من أن نتائج المقارنة قد تكون متساوية ، إلا أنها تعني فقط أن معلومات البايت التي تحتوي عليها هي نفسها.
2. استخدم القيم المرجعية
بالنسبة للقيم المرجعية ، يتم شرح المستويات الثلاثة لعملياتها على النحو التالي.
1) انسخ القيمة
في عبارة التخصيص ، القيمة المخصصة هي مرجع إلى القيمة الأصلية ، وليس نسخة القيمة الأصلية ، ولا القيمة الأصلية نفسها. وهذا يعني ، بعد تنفيذ المهمة ، يحفظ المتغير الإشارات إلى القيمة الأصلية (أي عنوان تخزين القيمة الأصلية). عند نسخها بين متغيرات متعددة أو عناصر الصفيف أو خصائص الكائن ، ستكون جميعها هي نفسها المراجع التي يحفظها المتغير الأصلي.
جميع المراجع لها نفس التأثير والوظيفة ويمكن تنفيذها. إذا تم تحرير البيانات من خلال أحد المراجع ، فسيتم انعكاس هذا التعديل في القيمة الأصلية والمراجع الأخرى ذات الصلة. على سبيل المثال:
var a = [1،2،3] ؛ // تعيين مرجع صفيف ب = أ ؛ // copy value b [0] = 4 ؛ // تعديل قيمة العنصر الأول في تنبيه المتغير B (A [0]) ؛ // إرجاع 4 ، مع عرض قيمة العنصر الأول في المتغير A أيضًا إلى 4
ومع ذلك ، إذا تم إعادة تعيين قيمة جديدة للمتغير B ، فلن تؤثر القيمة الجديدة على محتوى القيمة الأصلية. على سبيل المثال:
var a = [1،2،3] ؛ // تعيين مرجع صفيف ب = أ ؛ // copy value b = 4 ؛ // الكتابة فوق تنبيه المهمة (A [0]) ؛ // محتوى المتغير A يبقى دون تغيير
المهام المتكررة هي في الواقع تجاوز مرجع المتغير إلى القيمة الأصلية ، وتصبح نسخة من قيمة أخرى أو مرجع إليها. لذلك ، لن يؤثر على القيمة الأصلية ، ويظهر الشكل 4-2 مخطط العرض التوضيحي.
2) تمرير القيمة
عند استخدام مرجع لتمرير البيانات إلى وظيفة ، يكون تمريره إلى الوظيفة أيضًا مرجعًا إلى القيمة الأصلية. يمكن أن تستخدم الوظيفة هذا المرجع لتعديل القيمة الأصلية نفسها ، وأي تعديل مرئي خارج الوظيفة. على سبيل المثال:
var a = [1،2،3] ؛ دالة f (x) {x [0] = 4 ؛ // تعديل قيمة المعلمة في الدالة} f (a) ؛ // تمرير تنبيه القيمة المرجعية (A [0]) ؛ // إرجاع 4 ، تتغير القيمة الأصليةلاحظ أن ما يتم تعديله داخل الوظيفة هو مرجع إلى كائن أو صفيف خارجي ، وليس قيمة الكائن أو الصفيف نفسه. يمكنك استخدام مرجع لتعديل سمات كائن أو عناصر صفيف داخل الوظيفة ، ولكن إذا تم استخدام مرجع جديد داخل الوظيفة للكتابة المرجع الأصلي ، فلن يؤثر التعديل داخل الوظيفة على قيمة المرجع الأصلي ولا يمكن رؤيته خارج الوظيفة.
var a = [1،2،3] ؛ دالة f (x) {x = 4 ؛ // تعديل قيمة المعلمة في الدالة} f (a) ؛ // تمرير تنبيه القيمة المرجعية (A [0]) ؛ // إرجاع 1 ، لن تتغير القيمة الأصلية3) قيمة المقارنة
عند مقارنة قيمتين مرجعيتين ، تتم مقارنة العنوان المرجعي بمعرفة ما إذا كانت القيم الأصلية التي يتم الإشارة إليها هي نفس النسخة ، بدلاً من ما إذا كانت قيمهما الأصلية هي بايت متساوية. عند الرجوع إلى قيمتين مختلفتين ، على الرغم من أن لديهم نفس تكوين البايت ، فإن قيم المرجعين ليست متساوية.
var a = new number (1) ؛ // القيمة المرجعية a var b = new number (1) ؛ // القيمة المرجعية B var c = a ؛ // تعيين مرجع إلى C Alert (a == b) ؛ // إرجاع تنبيه كاذب (a == c) ؛ // إرجاع صحيح
لذلك ، {} == {} ، [] == [] ، كلها تعود خاطئة. لأن العنوان المرجعي مختلف.
باختصار ، بالنسبة لأي لغة ، فإن استخدام القيم واستخدام المراجع هما طريقتان أساسيتان لمعالجة البيانات. عندما نقوم بتشغيل البيانات ، فإن الطريقة التي يجب استخدامها لمعالجةها تعتمد بشكل أساسي على نوع البيانات. تختلف نوع القيمة والبيانات المرجعية في العمليات. تعمل بيانات نوع القيمة على البيانات باستخدام القيم ، بينما تعمل البيانات المرجعية على البيانات باستخدام المراجع. أساليب حساب مختلفة تنتج أيضًا نتائج مختلفة بشكل طبيعي. لنلقي نظرة على مثال آخر:
var s = "ABC" ؛ // string ، نوع القيمة بيانات var o = سلسلة (سلسلة) جديدة ؛ // string Object ، function boxed string f (v) {// operation function v.toString = function () {// method toString toString () return 123 ؛ } ؛ } f (s) ؛ // تمرير تنبيه القيمة (S) ؛ // إرجاع السلسلة "ABC" ، مما يشير إلى أن العملية لم تؤثر على البيانات الأصلية F (O) ؛ // تمرير التنبيه المرجعي (O) ؛ // إرجاع القيمة 123 ، مما يشير إلى أن العملية أثرت على الهيكل الداخلي للبيانات الأصليةيشارك نوع القيمة في العملية بالقيمة الفعلية ، لذلك لا يوجد اتصال مباشر مع البيانات الأصلية. يشارك النوع المرجعي في العملية مع العنوان المرجعي ، وستؤثر نتيجة الحساب على كتلة بيانات منطقة الكومة المرتبطة بعنوان المرجع. ومع ذلك ، هناك استثناء واحد. بالنسبة لسلاسل JavaScript ، تكون طرق تشغيلها معقدة نسبيًا. الرجاء Google للحصول على التفاصيل!
المقالة أعلاه javaScript Data Operation_A مناقشة موجزة حول جوهر تشغيل القيم الأصلية والقيم المرجعية هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.