JS中可枚舉屬性(enumerable)和propertyIsEnumerable()

什么是可枚舉屬性

枚舉就是列舉谈撒,可枚舉屬性就是可以列舉的屬性咧七,直白一點就是可以用for in遍歷到的屬性。

propertyIsEnumerable()的用法

obj.propertyIsEnumerable(prop) 是用來判斷屬性是否可枚舉的

  • obj: 要檢測的對象
  • 參數(shù) prop: 要檢測的屬性的名稱。
  • 返回值: Boolean類型锌妻,可枚舉屬性的時候返回true。

可枚舉屬性會對那些操作產(chǎn)生影響

for…in
Object.keys()
JSON.stringify()

下面我們詳細測試一下

1. 可枚舉屬性的遍歷

首先我們看一個栗子:

var p = {name: '張三', age: 28};
for (var key in p) {
    console.log('屬性名:' + key + '旬牲,是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:
//->屬性名:name仿粹,是否可枚舉:true
//->屬性名:age,是否可枚舉:true

p上的name和age兩個屬性都被遍歷了原茅,這兩個屬性都是可枚舉屬性吭历,那什么是不可枚舉屬性呢?

2. 不可枚舉屬性不會被遍歷

我們再看一個栗子:

Object.prototype.get_name = function () {
    return this.name;
};
var p = new Object({name: '張三'});
for (var key in p) {
    console.log('屬性名:' + key + '擂橘,是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:
// ->屬性名:name晌区,是否可枚舉:true
// ->屬性名:get_name,是否可枚舉:false

可能有疑問get_name判斷可枚舉返回的是false怎么還遍歷出來了呢通贞?其實正確的理解是這樣的朗若, get_name不是實例p的屬性是Object原型上的屬性,對于實例p來說是不可枚舉的昌罩,但是對于原型來說是可枚舉的(下面代碼有測試)哭懈。(for…in遍歷,只要在遍歷對象和對象所在的原型鏈上的可枚舉屬性都會被遍歷)
大家想一個問題茎用,get_name是Object的原型上的屬性遣总,被遍歷了。Object的原型上還有很多的屬性绘搞,有toString彤避、hasOwnProperty還有我們現(xiàn)在正在研究的propertyIsEnumerable都是原型上的屬性,怎么就只有自定義的get_name被遍歷出來了呢夯辖?因為其它屬性都是不可枚舉的琉预。看下面代碼:

console.log(p.__proto__.propertyIsEnumerable('get_name'));//->true
console.log(p.__proto__.propertyIsEnumerable('toString'));//->false
console.log(p.__proto__.propertyIsEnumerable('propertyIsEnumerable'));//->false
console.log(p.__proto__.propertyIsEnumerable('hasOwnProperty'));//->false

我們已經(jīng)知道了什么是可枚舉屬性蒿褂,知道了propertyIsEnumerable得用法圆米,我們可不可以自定義一個不可枚舉屬性呢卒暂?當(dāng)然可以。

3. 自定義不可枚舉屬性

var p = new Object({name: '張三'});
//為p設(shè)置不可枚舉屬性
Object.defineProperty(p, "age", {
    value: 20,
    enumerable: false
});
for (var key in p) {
    console.log('屬性名:' + key + '娄帖,是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:屬性名:name也祠,是否可枚舉:true
console.log('age是不是p的可枚舉屬性:' + p.propertyIsEnumerable('age')+',age屬性的值是多少:'+ p.age);
//age是不是p的可枚舉屬性:false近速,age屬性的值是多少:20

通過defineProperty我們就自定義了一個不可枚舉的屬性诈嘿,并且可以正常使用。

4. 不可枚舉屬性對Object.keys()和JSON.stringify()的影響

Object.keys()和JSON.stringify()也不會列舉出不可枚舉屬性削葱,也不會列舉出原型鏈上的所有屬性奖亚。

Object.prototype.get_name = function () {};
var p = new Object({name: '張三'});
//為p設(shè)置不可枚舉屬性
Object.defineProperty(p, "age", {
    value: 20,
    enumerable: false
});
console.log(Object.keys(p));//輸出結(jié)果->["name"]
console.log(JSON.stringify(p));//輸出結(jié)果->{"name":"張三"}

如果文檔哪里不正確歡迎指正。
本文主要參考文檔:http://www.cnblogs.com/kongxy/p/4618173.html
歡迎轉(zhuǎn)載析砸,但請注明出處昔字。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市首繁,隨后出現(xiàn)的幾起案子作郭,更是在濱河造成了極大的恐慌,老刑警劉巖弦疮,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夹攒,死亡現(xiàn)場離奇詭異,居然都是意外死亡挂捅,警方通過查閱死者的電腦和手機芹助,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闲先,“玉大人状土,你說我怎么就攤上這事∷趴罚” “怎么了蒙谓?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長训桶。 經(jīng)常有香客問我累驮,道長,這世上最難降的妖魔是什么舵揭? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任谤专,我火速辦了婚禮,結(jié)果婚禮上午绳,老公的妹妹穿的比我還像新娘置侍。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布蜡坊。 她就那樣靜靜地躺著杠输,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秕衙。 梳的紋絲不亂的頭發(fā)上蠢甲,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音据忘,去河邊找鬼鹦牛。 笑死,一個胖子當(dāng)著我的面吹牛若河,可吹牛的內(nèi)容都是我干的能岩。 我是一名探鬼主播寞宫,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼萧福,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辈赋?” 一聲冷哼從身側(cè)響起鲫忍,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钥屈,沒想到半個月后悟民,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡篷就,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年射亏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竭业。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡智润,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出未辆,到底是詐尸還是另有隱情窟绷,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布咐柜,位于F島的核電站兼蜈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拙友。R本人自食惡果不足惜为狸,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遗契。 院中可真熱鬧辐棒,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至立叛,卻和暖如春负敏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秘蛇。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工其做, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赁还。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓妖泄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艘策。 傳聞我的和親對象是個殘疾皇子蹈胡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1.屬性的簡潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明,ES6 允許在對象之中朋蔫,直接寫變量罚渐。這時,屬性名為變量...
    雨飛飛雨閱讀 1,136評論 0 3
  • 屬性的簡潔表示法 ES6允許直接寫入變量和函數(shù)驯妄,作為對象的屬性和方法荷并。這樣的書寫更加簡潔。 上面代碼表明青扔,ES6允...
    呼呼哥閱讀 2,925評論 0 2
  • 概述 JavaScript提供了一個內(nèi)部數(shù)據(jù)結(jié)構(gòu)源织,用來描述一個對象的屬性的行為,控制它的行為微猖。這被稱為“屬性描述對...
    zjh111閱讀 727評論 0 0
  • 本篇主要介紹JS中常用Object的屬性方法谈息。 delete 操作 in 運算符 obj.hasOwnProper...
    boySpray閱讀 2,001評論 0 2
  • 這個年紀(jì),這種生活背景下想寫的第一篇小隨筆励两,讓自己很意外的是這個主題黎茎。一切都是機緣巧合,在今天邂逅這個平臺以...
    靜夜星月閱讀 166評論 0 1