为了账号安全,请及时绑定邮箱和手机立即绑定

枚举是什么意思?

枚举是什么意思?

GCT1015 2019-12-09 15:54:06
当它说“ for..in遍历对象的可枚举属性”时,我被定向到MDN的for..in页面。然后,我转到属性的可枚举和所有权页面,其中显示“可枚举的属性是可以通过for..in循环进行迭代的那些属性”。字典将可枚举定义为可数,但我无法真正想象这意味着什么。我能举个例子吗?
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

可枚举的属性是可以在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


查看完整回答
反对 回复 2019-12-09
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这比应该可视化的东西要无聊得多。


实际上,所有属性上都有一个称为“可枚举”的属性。如果将其设置为false,则该for..in方法将跳过该属性,并假装该属性不存在。


对象上有很多属性都将“可枚举”设置为false,例如“ 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”。


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 1378 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信