it-swarm.asia

ماذا يعني لا تعد ولا تحصى؟

تم توجيهي إلى MDN's for..in page عندما قال ، "for..in يتكرّر في الخصائص الكثيرة للكائن."

ثم انتقلت إلى صفحة التعداد وملكية العقارات حيث قالت "الخصائص القابلة للتعداد هي تلك التي يمكن تكرارها بواسطة حلقة for..in."

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

125
Patrick

الخاصية التي لا تعد ولا تحصى هي تلك التي يمكن تضمينها وزارتها خلال حلقات for..in (أو تكرار مماثل للخصائص ، مثل Object.keys()).

إذا لم يتم تحديد خاصية على أنها قابلة للتعداد ، ستتجاهل الحلقة أنها داخل الكائن.

var obj = { key: 'val' };

console.log('toString' in obj); // true
console.log(typeof obj.toString); // "function"

for (var key in obj)
    console.log(key); // "key"

يتم تعريف الخاصية على أنها قابلة للتعداد أو لا يتم تحديدها بواسطة السمة [[Enumerable]] الخاصة بها . يمكنك عرض هذا كجزء من واصف الخاصية :

var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, 'bar');

console.log(descriptor.enumerable); // true
console.log(descriptor.value);      // 1

console.log(descriptor);
// { value: 1, writable: true, enumerable: true, configurable: true }

حلقة for..in ثم تتكرر من خلال أسماء خصائص الكائن.

var foo = { bar: 1, baz: 2};

for (var prop in foo)
    console.log(prop); // outputs 'bar' and 'baz'

لكن ، يقوم فقط بتقييم بيانه - console.log(prop); في هذه الحالة - لتلك الخصائص التي تكون سمة [[Enumerable]]true.

هذه الحالة في مكانها لأن الكائنات لها العديد من الخصائص ، خاصة من الميراث :

console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]

كل من هذه الخصائص لا تزال موجودة على الكائن :

console.log('constructor' in foo); // true
console.log('toString' in foo);    // true
// etc.

ولكن ، يتم تخطيها بواسطة حلقة for..in لأنها غير قابلة للتعداد.

var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');

console.log(descriptor.enumerable); // false
123
Jonathan Lonowski

إذا قمت بإنشاء كائن عبر myObj = {foo: 'bar'} أو أي شيء آخر ، فستكون جميع الخصائص قابلة للعد. لذا فإن السؤال الأسهل هو: ما الذي لا يمكن حصره؟ تحتوي بعض الكائنات على بعض الخصائص غير القابلة للتعداد ، على سبيل المثال ، إذا قمت بالاتصال بـ Object.getOwnPropertyNames([]) (والتي تُرجع صفيفًا من جميع الخصائص ، غير قابلة للتعداد أو لا ، في []) ، فسوف تُرجع ['length'] ، والتي تتضمن الخاصية غير القابلة للتعداد لصفيف ، ' الطول'.

يمكنك إنشاء خصائصك غير القابلة للتعداد عن طريق الاتصال بـ Object.defineProperty:

var person = { age: 18 };
Object.defineProperty(person, 'name', { value: 'Joshua', enumerable: false });

person.name; // 'Joshua'
for (prop in person) {
  console.log(prop);
}; // 'age'

يستعير هذا المثال بشكل كبير من الخصائص غير القابلة للتعداد في JavaScript ، لكنه يُظهر كائن يتم تعداده. يمكن أن تكون الخصائص إما قابلة للكتابة أو قابلة للتكوين أو قابلة للتعداد. يناقش John Resig هذا في نطاق ECMAScript 5 Objects and Properties .

وهناك سؤال حول تجاوز سعة المكدس حول لماذا تريد أن تجعل العقارات غير قابلة للتعداد .

42
carpeliam

إنها مملة أكثر بكثير من شيء يجب أن يتصور.

هناك حرفيا سمة على جميع الخصائص تسمى "تعداد". عندما يتم ضبطه على "خطأ" ، سيتخطى الأسلوب for..in تلك الخاصية ، ويتظاهر بأنه غير موجود.

هناك الكثير من الخصائص على الكائنات التي تم ضبطها "معدودة" على "خطأ" ، مثل "valueOf" و "hasOwnProperty" ، لأنه من المفترض أنك لا ترغب في تكرار محرك JavaScript على تلك.

يمكنك إنشاء خصائصك غير القابلة للتعداد باستخدام طريقة Object.defineProperty:

  var car = {
    make: 'Honda',
    model: 'Civic',
    year: '2008',
    condition: 'bad',
    mileage: 36000
  };

  Object.defineProperty(car, 'mySecretAboutTheCar', {
    value: 'cat pee in back seat',
    enumerable: false
  });

الآن ، حقيقة أن هناك سر حول السيارة مخفية. بالطبع لا يزال بإمكانهم الوصول إلى العقار مباشرة والحصول على الجواب:

console.log(car.mySecretAboutTheCar); // prints 'cat pee in back seat'

لكن ، عليهم أن يعرفوا أن العقار موجود أولاً ، لأنه إذا كانوا يحاولون الوصول إليه من خلال for..in أو Object.keys ، فسيظلون سريين تمامًا:

console.log(Object.keys(car)); //prints ['make', 'model', 'year', 'condition', 'mileage']

يجب أن يطلقوا عليه للتو ، "forInAble".

30
Gabriel Kunkel

إذا كنت تواجه صعوبة في تصور "ماذا يعني أن تكون معدودة؟" لماذا لا تسأل نفسك ، ماذا يعني أن تكون لا تعد ولا تحصى ؟

أفكر في الأمر قليلاً من هذا القبيل ، غير قابل للتعداد property موجود لكن جزئيًا مخفي ؛ وهذا يعني أن لا تعد ولا تحصى هو واحد غريب. الآن يمكنك أن تتخيل عددًا لا حصر له من الأشياء المتبقية - الخاصية الأكثر طبيعية التي اعتدنا على مواجهتها منذ اكتشافنا الكائنات . يعتبر

var o = {};
o['foo'] =  0;                               // enumerable, normal
Object.defineProperty(o, 'bar', {value: 1}); // nonenumerable, weird

الآن في for..in ، تخيل أنه مثل الرمز الكاذب

for property in o:
    if not property enumerable continue // skip non-enumerable, "bar"
    else do /* whatever */              // act upon enumerable, "foo"

حيث نص الحلقة الذي كتبته في JavaScript في مكان /* whatever */

9
Paul S.

سأكتب تعريف سطر واحد منعدد

Enumerable: تحديد ما إذا كان يمكن إرجاع الخاصية في حلقة لـ/في.

var obj = {};
Object.defineProperties(data, {
    set1: {enumerable: true},
    set2: {enumerable: false},
});
Object.keys(obj); // ["set1"]
Object.getOwnPropertyNames(obj); // ["set1", "set2"]
6
Ved

الأساليب غير قابلة للتعداد ؛ أو بالأحرى المدمج في الأساليب ليست .. بعد البحث على ما عد - يعني لبرنامج جافا النصي ؛ إنه يشير فقط إلى سمة خاصية .. كل الكائنات التي تم إنشاؤها في ecma3 قابلة للتعداد ، ويمكن الآن ecma5 u تعريفها .... هذا كل شيء ..: D lol أخذني قليلاً للعثور على الإجابة ؛ لكنني أعتقد أن الحديث عنها في كتاب ديفيد فلاناجان .. لذلك أعتقد أنه يعني "مخفي" ، أو لا "مخفي" في تلك الأساليب لا تظهر في حلقة في ، وبالتالي "مخفية"

0
user316264