亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

枚舉是什么意思?

枚舉是什么意思?

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 關注
  • 1537 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號