شرح - كيف يمكنني تعداد خصائص كائن JavaScript؟




شرح جافا سكريبت (10)

هذا السؤال لديه بالفعل إجابة هنا:

كيف يمكنني تعداد خصائص كائن JavaScript؟

أرغب فعلاً في سرد ​​جميع المتغيرات المحددة وقيمها ، لكني تعلمت أن تعريف متغير يؤدي في الواقع إلى إنشاء خاصية كائن النافذة.


أعتقد أن أحد الأمثلة على القضية التي فاجأتني هو أمر ذو صلة:

var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
  document.writeln( propertyName + " : " + myObject[propertyName] );
}

ولكن لدهشتي ، الإخراج

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}

لماذا ا؟ قام نص برمجي آخر في الصفحة بتمديد نموذج الكائن:

Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};

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

أسلوب آخر مفيد هو استخدام كائن Prototype's.JJON () لإجراء تسلسل الكائن إلى JSON ، والذي سيعرض لك أسماء وقيم الخصائص.

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

http://www.prototypejs.org/api/object/tojson


استخدم for..in loop لتعداد خصائص الكائن ، لكن كن حذرًا. سيعرض التعداد خصائص ليس فقط الكائن الذي تم تعداده ، ولكن أيضًا من النماذج الأولية لأي كائنات رئيسية.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

لتجنب تضمين الخصائص الموروثة في التعداد الخاص بك ، قم hasOwnProperty() الاختيار الخاص بك hasOwnProperty() :

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

تعديل: أنا لا أوافق على تصريح JasonBunting بأننا لسنا بحاجة إلى القلق بشأن تعداد الخصائص الموروثة. هناك خطر في تعداد الخصائص الموروثة التي لا تتوقعها ، لأنه يمكن تغيير سلوك التعليمة البرمجية الخاصة بك.

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

هذا هو السبب في أن JavaScript يوفر hasOwnProperty() ، وهذا هو السبب في أنه يجب عليك استخدامه للتأكد من أن رمز الطرف الثالث (أو أي رمز آخر قد يعدل نموذج أولي) لا يكسر لك. وبصرف النظر عن إضافة بضعة بايت إضافية من التعليمات البرمجية ، لا يوجد أي جانب سلبي لاستخدام hasOwnProperty() .


الطريقة القياسية ، التي تم اقتراحها بالفعل عدة مرات هي:

for (var name in myObject) {
  alert(name);
}

ومع ذلك ، فإن Internet Explorer 6 و 7 و 8 به خطأ في مترجم JavaScript ، وهو ما يؤثر على عدم تعداد بعض المفاتيح. إذا قمت بتشغيل هذا الرمز:

var obj = { toString: 12};
for (var name in obj) {
  alert(name);
}

إذا كان سيتم تنبيه "12" في جميع المتصفحات باستثناء IE. سوف IE ببساطة تجاهل هذا المفتاح. قيم المفتاح المتأثرة هي:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

لكي تكون آمنًا في IE فعليك استخدام شيء من هذا القبيل:

for (var key in myObject) {
  alert(key);
}

var shadowedKeys = [
  "isPrototypeOf",
  "hasOwnProperty",
  "toLocaleString",
  "toString",
  "valueOf"
];
for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) {
  if map.hasOwnProperty(a[i])) {
    alert(a[i]);
  }
}

والخبر السار هو أن EcmaScript 5 يقوم بتعريف Object.keys(myObject) ، والتي تقوم بإرجاع مفاتيح كائن كصفيف وبعض المتصفحات (على سبيل المثال Safari 4) تقوم بالفعل بتطبيقها.


في المستعرضات الحديثة (ECMAScript 5) ، يمكنك الحصول على جميع الخصائص التي يمكنك عدها:

Object.keys(obj) (راجع الرابط للحصول على مقتطف للتوافق مع الإصدارات السابقة على المتصفحات القديمة)

أو للحصول على خصائص لا يمكن عدها:

Object.getOwnPropertyNames(obj)

تحقق من جدول التوافق الخاص بـ ECMAScript 5

معلومات إضافية: ما هي السمة التي يمكن عدها؟


فيما يلي كيفية تعداد خصائص الكائن:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}

لدى طريقة بايثون طريقة "مفاتيح" ، وهذا مفيد حقًا. أعتقد أنه في جافا سكريبت يمكننا الحصول على شيء ما:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

تحرير: لكن إجابة @ كارلوس-روانا تعمل بشكل جيد للغاية. اختبرت Object.keys (نافذة) ، والنتيجة هي ما كنت أتوقع.


لقد وجدتها ... for (property in object) { // do stuff } ستدرج جميع الخصائص ، وبالتالي جميع المتغيرات المعلنة عالميا على كائن النافذة.


يمكنك استخدام للحلقة.

إذا كنت تريد استخدام صفيف Object.keys (object1)


for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}






properties