js中的對(duì)象

js中的對(duì)象理解和使用起來(lái)都很簡(jiǎn)單,并且很頻繁的使用兑宇。但是碍侦,總有細(xì)節(jié),是我們可能會(huì)忽略的隶糕、或者是拿捏不定的
參考鏈接:http://javascript.ruanyifeng.com/grammar/object.html

1. 概述#

1.1對(duì)象的含義
所謂對(duì)象瓷产,就是一種無(wú)序的數(shù)據(jù)集合,由若干個(gè)“鍵值對(duì)”(key-value)構(gòu)成枚驻。
對(duì)象的生成方法测秸,通常有三種方法:

var o1 = {};
var o2 = new Object();
var o3 = Object.create(null);

1.2 對(duì)象的引用
如果不同的變量名指向同一個(gè)對(duì)象,那么它們都是這個(gè)對(duì)象的引用,也就是說(shuō)指向同一個(gè)內(nèi)存地址。修改其中一個(gè)變量贷岸,會(huì)影響到其他所有變量。

var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a // 1

o2.b = 2;
o1.b // 2

此時(shí)螟蒸,如果取消某一個(gè)變量對(duì)于原對(duì)象的引用七嫌,不會(huì)影響到另一個(gè)變量。

var o1 = {};
var o2 = o1;
o1 = 1;
o2 // {}

但是,這種引用只局限于<code>對(duì)象</code>惹资,對(duì)于原始類(lèi)型的數(shù)據(jù)則是<code>傳值引用</code>猴誊,也就是說(shuō)翅娶,都是值的拷貝党觅。

var x = 1;
var y = x;
x = 2;
y // 1

1.3 表達(dá)式還是語(yǔ)句區(qū)別
對(duì)象采用大括號(hào)表示卫漫,這導(dǎo)致了一個(gè)問(wèn)題:如果行首是一個(gè)大括號(hào)宏悦,它到底是表達(dá)式還是語(yǔ)句?

{ foo: 123 }

JavaScript引擎讀到上面這行代碼砖瞧,會(huì)發(fā)現(xiàn)可能有兩種含義。第一種可能是褂乍,這是一個(gè)表達(dá)式,表示一個(gè)包含foo屬性的對(duì)象;第二種可能是,這是一個(gè)語(yǔ)句僻澎,表示一個(gè)代碼區(qū)塊逗堵,里面有一個(gè)標(biāo)簽foo汁咏,指向表達(dá)式123。

為了避免這種歧義厚掷,JavaScript規(guī)定勤哗,如果行首是<b>大括號(hào)</b>,一律解釋為語(yǔ)句(<b>即代碼塊</b>)。如果要解釋為表達(dá)式(<b>即對(duì)象</b>)笑诅,必須在大括號(hào)前加上<b>圓括號(hào)</b>。
這種差異在eval語(yǔ)句中反映得最明顯:

eval('{foo: 123}') // 123
eval('({foo: 123})') // {foo: 123}

2. 相關(guān)操作#

2.1 查看所有key

var o = { key1: 1, key2: 2};
Object.keys(o);// ['key1', 'key2']

2.2 刪除屬性
delet命令用于刪除對(duì)象的屬性疮鲫,刪除成功后返回true吆你。

var o = {p: 1};
Object.keys(o) // ["p"]
delete o.p // true

o.p // undefined
Object.keys(o) // []

注意,刪除一個(gè)不存在的屬性俊犯,delete不報(bào)錯(cuò)妇多,而且返回true。

  var o = {};
delete o.p // true

因此燕侠,不能根據(jù)delete命令的結(jié)果者祖,認(rèn)定某個(gè)屬性是存在的。

var o = Object.defineProperty({}, 'p', { value: 123, configurable: false});
o.p // 123
delete o.p // false

<code>delete命令只能刪除對(duì)象本身的屬性!!!</code>

2.3 in運(yùn)算符
in運(yùn)算符用于檢查對(duì)象是否包含某個(gè)屬性(注意贬循,檢查的是鍵名咸包,不是鍵值),如果包含就返回true杖虾,否則返回false。in運(yùn)算符的一個(gè)問(wèn)題是媒熊,它不能識(shí)別對(duì)象<i>繼承</i>的屬性奇适。

var o = new Object();
o.hasOwnProperty('toString') // false
'toString' in o // true

使用for in遍歷對(duì)象

var o = {a: 1, b: 2, c: 3};
for (var i in o) {
 console.log(o[i]);
}
//提取對(duì)象屬性
var obj = { x: 1, y: 2};
var props = [];
var i = 0;
for (props[i++] in obj);
props // ['x', 'y']

2.4 with語(yǔ)句
(1)它的作用是操作同一個(gè)對(duì)象的多個(gè)屬性時(shí)坟比,提供一些書(shū)寫(xiě)的方便。

// 例一
with (o) {
 p1 = 1;
 p2 = 2;
}
// 等同于
o.p1 = 1;
o.p2 = 2;

// 例二
with (document.links[0]){
 console.log(href); 
 console.log(title);
 console.log(style);
}
// 等同于
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);

注意嚷往,with區(qū)塊內(nèi)部的變量葛账,必須是當(dāng)前對(duì)象已經(jīng)存在的屬性,否則會(huì)創(chuàng)造一個(gè)當(dāng)前作用域的全局變量皮仁。這是因?yàn)閣ith區(qū)塊沒(méi)有改變作用域籍琳,它的內(nèi)部依然是當(dāng)前作用域。

var o = {};
with (o) {
 x = "abc";
}
o.x // undefined
x // "abc"

(2)這是with語(yǔ)句的一個(gè)很大的弊病贷祈,就是綁定對(duì)象不明確趋急。

with (o) { console.log(x);}

單純從上面的代碼塊,根本無(wú)法判斷x到底是全局變量势誊,還是o對(duì)象的一個(gè)屬性呜达。這非常不利于代碼的除錯(cuò)和模塊化,編譯器也無(wú)法對(duì)這段代碼進(jìn)行優(yōu)化粟耻,只能留到運(yùn)行時(shí)判斷查近,這就拖慢了運(yùn)行速度。因此挤忙,建議不要使用with
語(yǔ)句霜威,可以考慮用一個(gè)<code>臨時(shí)變量</code>代替with。

with(o1.o2.o3) { console.log(p1 + p2);}
// 可以寫(xiě)成
var temp = o1.o2.o3;console.log(temp.p1 + temp.p2);

(3)with語(yǔ)句少數(shù)有用場(chǎng)合之一册烈,就是替換模板變量戈泼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茄厘,隨后出現(xiàn)的幾起案子矮冬,更是在濱河造成了極大的恐慌,老刑警劉巖次哈,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胎署,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窑滞,警方通過(guò)查閱死者的電腦和手機(jī)琼牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哀卫,“玉大人巨坊,你說(shuō)我怎么就攤上這事〈烁模” “怎么了趾撵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我占调,道長(zhǎng)暂题,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任究珊,我火速辦了婚禮薪者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剿涮。我一直安慰自己言津,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布取试。 她就那樣靜靜地躺著悬槽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪想括。 梳的紋絲不亂的頭發(fā)上陷谱,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音瑟蜈,去河邊找鬼烟逊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铺根,可吹牛的內(nèi)容都是我干的宪躯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼位迂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼访雪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掂林,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤臣缀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后泻帮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體精置,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锣杂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脂倦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡元莫,死狀恐怖赖阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踱蠢,我是刑警寧澤火欧,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響布隔,放射性物質(zhì)發(fā)生泄漏离陶。R本人自食惡果不足惜稼虎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一衅檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎俩,春花似錦哀军、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柳击,卻和暖如春猿推,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捌肴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工蹬叭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人状知。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓秽五,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饥悴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坦喘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 第一章: JS簡(jiǎn)介 從當(dāng)初簡(jiǎn)單的語(yǔ)言,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互西设,擁有閉包瓣铣、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,651評(píng)論 0 6
  • 《ijs》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 5,089評(píng)論 0 7
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法贷揽,類(lèi)相關(guān)的語(yǔ)法棠笑,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法擒滑,異常的語(yǔ)法腐晾,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 2016.7.3 猴年馬月最后一天 愿你我都勇敢又執(zhí)著 愿世界和平,霧霾不再來(lái) 好的一并期待丐一,壞的一律包容 接受意...
    秝詴莔閱讀 240評(píng)論 0 0
  • 當(dāng)前win10系統(tǒng)中库车,在環(huán)境變量中新增了相關(guān)的變量巨柒,但是打開(kāi)默認(rèn)的cmd,還是沒(méi)有這個(gè)變量。 如果想辦法打開(kāi)管理員...
    五大RobertWu伍洋閱讀 1,435評(píng)論 0 0