Numaralandırılabilir ne anlama geliyor?


151

MDN's for .. sayfasına yönlendirildimBir nesnenin numaralandırılabilir özellikleri üzerinde yinelendiğinde, "için ..." .

Sonra "Numaralandırılabilir özellikler for..in döngüsü tarafından yinelenebilir olanlar" dedi burada numaralandırılabilirlik ve mülkiyet sahipliği sayfasına gitti.

Sözlük numaralandırılabilir sayılabilir olarak tanımlar, ancak bunun ne anlama geldiğini gerçekten göremiyorum. Numaralandırılabilir bir şeyin örneğini alabilir miyim?


Ne yaptığını anlıyor musun for-in?

Ben var .. cevaplar bir nesnenin tüm numaralandırılabilir özellikleri için for ifadesi ile kullanılabilir olmasını sağlar
Patrick

6
En basit anlamı: bir mülkün bir for indöngü tarafından üretilip üretilmeyeceği (ayrıntıları bilmek istemeyenler veya sadece umursamayanlar için))
Tomasz Racia

Yanıtlar:


158

Numaralandırılabilir bir özellik, for..indöngülere dahil edilebilen ve ziyaret edilebilen bir mülktür (veya benzer bir mülk yinelemesi gibi Object.keys()).

Bir özellik numaralandırılabilir olarak tanımlanmazsa, döngü nesnenin içinde olduğunu yoksayar.

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"

Bir mülk, kendi [[Enumerable]]özelliğiyle numaralandırılabilir veya tanımlanamaz olarak tanımlanır . Bunu mülkün tanımlayıcısının bir parçası olarak görebilirsiniz :

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 }

Bir for..indöngü daha sonra nesnenin özellik adları üzerinden yinelenir.

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

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

Ancak, ifadesini sadece - console.log(prop);bu durumda - [[Enumerable]]niteliği olan mülkler için değerlendirir true.

Bu koşul, nesnelerin özellikle mirastan çok daha fazla özelliğe sahip olması nedeniyle mevcuttur :

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

Bu özelliklerin her biri hala nesnede bulunur :

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

Ancak, for..indöngü tarafından atlanırlar çünkü numaralandırılamazlar.

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

console.log(descriptor.enumerable); // false

Yapıcı özelliği for..in döngüsünde görünmediğinden numaralandırılamaz. Nesneden her birini console.log yapabildiğiniz için, bar veya baz gibi özelliklerin adları numaralandırılabilirken?
Patrick

5
Bu tamamen doğru değildir: But, they are skipped (or not counted) by the for..in loop because they are not enumerable. Üzerinde özellikler, Object.prototypenumaralandırılamadıkları için değil, prototip zincirinde daha ileri oldukları için yok sayılır. Ne getOwnPropertyNames()ya keys()ait olmayan bir nesne en vardır özellikler gösterirler. Bir yan not olarak, yerleşik özelliklerin çoğunun numaralandırılamadığı ve dolayısıyla gösterilmeyeceği doğrudur keys(), ancak prototip zincirini geçmek istiyorsanız ekstra kod yazmanız gerekecektir.
Magnus

Kelimenin tam anlamıyla, numaralandırılabilir anlamına gelir sayılabilir
Christian Matthew

49

Bir nesne myObj = {foo: 'bar'}veya onun etrafında bir şey oluşturursanız , tüm özellikler numaralandırılabilir. Sorulması daha kolay olan soru, numaralandırılamayan şey nedir? Belirli nesnelerin numaralandırılamayan bazı özellikleri vardır, örneğin, Object.getOwnPropertyNames([])([] üzerinde numaralandırılabilir veya döndürülemez tüm özelliklerin bir dizisini döndürürseniz),['length'] bir dizinin numaralandırılamayan özelliğini içeren "uzunluk" .

Aşağıdaki numarayı arayarak kendi numaralandırılamayan mülklerinizi oluşturabilirsiniz 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'

Bu örnek , JavaScript'teki numaralandırılamayan özelliklerden büyük ölçüde ödünç alıyor , ancak bir nesnenin numaralandırıldığını gösterir. Özellikler yazılabilir, yapılandırılabilir veya numaralandırılabilir olabilir veya olmayabilir. John Resig bunu ECMAScript 5 Nesneleri ve Özellikleri kapsamında tartışıyor .

Ayrıca, mülkleri neden numaralandırılamaz hale getirmek istediğinizle ilgili bir Yığın Taşması sorusu vardır .


Hm, hem upvotes hem de downvotes. Kesinlikle, bu cevap hakkında aşağı oy vermeye değer bir şey varsa, lütfen buraya bir yorum ekleyin.
carpeliam

1
Başka bir cevap yazdı: var o = {}; o ['foo'] = 0; // numaralandırılabilir, normal Object.defineProperty (o, 'bar', {değer: 1}); // sayılamaz, tuhaf Neden açıkça numaralandırılabilir ekleyin: false?
Patrick

5
@Patrick, bunu kısmen bir seçenek olarak ekledim, böylece bir seçenek olduğu açıktır, ancak kitlenize bağlı olarak, açık olmak, kodunuzu okuyan herkes için açık olmak için sağlam bir karar olabilir.
carpeliam

@carpeliam Bu kısa ve çok net açıklama için teşekkürler, sizinkine geçene kadar kabul edilen cevabı alamadım: D
sandeepKumar

37

Görselleştirilmesi gereken bir şeyden çok daha sıkıcı.

Kelimenin tam anlamıyla "numaralandırılabilir" adı verilen tüm özellikler üzerinde bir özellik vardır. False değerine ayarlandığındafor..in yöntem bu özelliği atlar, var gibi davranır.

"Sayılabilir" değeri "valueOf" ve "hasOwnProperty" gibi yanlış olarak ayarlanmış nesnelerde çok fazla özellik vardır, çünkü JavaScript motorunun bunlar üzerinde yinelenmesini istemediğiniz varsayılmıştır.

Object.definePropertyYöntemi kullanarak kendi numaralandırılamayan özelliklerinizi oluşturabilirsiniz :

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

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

Şimdi, araba hakkında bir sır bile var. Tabii ki yine de doğrudan tesise erişebilir ve cevap alabilirler:

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

Ancak, mülkün önce var olduğunu bilmek zorunda kalacaklar, çünkü mülküne erişmeye çalışıyorlarsa for..inveya Object.keystamamen gizli kalacaklarsa:

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

Sadece "forInAble" demeliydiler.


5
Bu son satır için seçildi - Sanırım gerçekten çağrılmış olsaydı, hiç kimse bunu sormazdı. Hangi sorumu getirir - neden olur numaralandırılabilir olmayacak bir özelliği ayarlamak (veya neden olurdu)? Bir dizinin length özelliği, numaralandırılamayan bir özelliğe örnek olarak oldukça sık kullanılır, ancak neden onu numaralandırılabilir olarak ayarlayamadınız (JavaScript kısıtlaması değil, yani, neden JavaScript'te numaralandırılamayacak şekilde ayarlandı? ilk etapta)?
Chris

Sorumu açıklığa kavuşturmak için, aşağıdakilerin neden bir seçenek olmadığına karar verildi: Marka: Honda modeli: Sivil sır: Kedi işemek uzunluğu: 12
Chris

Hmmm ... Kendi sorumun cevabını bulmuş olabilirim. Google aramada "Numaralandırılmış veri türleriyle ne demek istiyorsun?" Numaralandırılmış verilerin sınırlı bir değer kümesi vardır. Numaralandırılmış veri türü, bu tür için izin verdiğiniz değerlerden veya numaralandırılmış değerlerden oluşur. Tamsayı tabanlı numaralandırılmış türler için, her numaralandırılmış değer bir ad ve altta yatan sayısal bir değerden oluşur. her uzunluğa. Bu doğru mu?
Chris

İlk sorunuzu ele almak, bir nesne üzerinde numaralandırılamayan bir özellik ayarlamak biraz haksızdır, çünkü o nesnede ne olduğunu öğrenmenin tek yolu koda ve kod tabanı olarak bakmak olacaktır. gömülebilir geliştirir. Yani, genellikle, bunu kullanmak istemezsiniz. Bir dizedeki karakterlerin veya bir dizideki öğelerin sayısını veren '.length' ile ilgili olarak, 'for ... in' kullansaydık, dahil edilmesini istemediğimizi düşündüğümüz bir şeydir. J'lerin tanrılarının neden bu şekilde yaptıklarına cevap veremiyorum. Anlayışımızın ötesinde nedenleri ( ahem ) var .
Gabriel Kunkel

... ve sayılan veri türleri hakkındaki ikinci sorunuzu cevaplayabileceğimi sanmıyorum, ancak zamanım olsaydı bir süre çiğnenebileceğim bir şey gibi görünüyor. :-)
Gabriel Kunkel

9

Eğer "numaralandırılabilir olmak ne anlama geliyor?" neden kendinize sormuyorsunuz, sayılamaz olmak ne anlama geliyor ?

Biraz böyle düşünüyorum, sayılmaz bir özellik var ama kısmen gizli ; yani sayılamayacak kadar tuhaf. Artık geride kalanlar olarak sayılabilir - Nesneleri keşfettiğimizden beri karşılaştığımız daha doğal özellik . Düşünmek

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

Şimdi bir for..in, sahte kod gibi düşünün

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

Eğer yazdığınız döngü gövdesi nerede JavaScript yerindedir/* whatever */


8

ENUMERABLE'ın bir satır tanımını yazacağım

Enumerable: Özelliğin bir for / in döngüsünde döndürülüp döndürülemeyeceğini belirtir.

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

0

yöntemler numaralandırılamaz; ya da daha doğrusu yerleşik yöntemler değildir .. java betiği için numaralandırılabilir ne anlama geldiğini araştırdıktan sonra ; sadece bir özellik özniteliğini ifade eder .. ecma3 tüm oluşturulan nesneler numaralandırılabilir ve ecma5 u şimdi tanımlayabilirsiniz .... işte bu ..: D lol cevap bulmak için beni biraz aldı; ama onun David Flanagan'ın kitabında konuşulduğuna inanıyorum .. bu yüzden "gizli" anlamına geliyor, ya da bu yöntemlerde "gizli" değil, döngüde gösterilmiyor ve bu nedenle "gizli"


0

Enum veri türünü düşünün, sadece farklı sayılara karşılık gelen nesnelerin yapısı. Bir şeyi numaralandırılabilir olarak bildirmek, belirli bir sayıya karşılık geldiğini beyan etmek ve söz konusu nesneye Sözlük içinde bir nesnenin sayılabilir bileşenlerini temsil eden bir yer verilmesini sağlamaktır. Basitçe ifade etmek gerekirse, bir nesneyi numaralandırılabilir yapmak derleyiciye "Hey, bu özellik önemlidir, bu nesne üzerindeki verileri kontrol ettiğimde bunu görmek istiyorum."


0

Nesnelerin miras aldığı yerleşik yöntemler numaralandırılamaz, ancak açıkça belirtilmedikçe kodunuzun nesnelere eklediği özellikler numaralandırılabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.