摘要:此時,如果取消某一個變量對于原對象的引用,不會影響到另一個變量。因為圓括號的里面,只能是表達式,所以確保大括號只能解釋為對象。
具體來說,如果一個屬性的enumerable為false,下面三個操作不會取到該屬性。
for..in循環 可繼承
Object.keys方法 不可
JSON.stringify方法 不可
object.getpropertynames都可以遍歷 不可繼承
概述
生成方法
鍵名
對象的引用
表達式還是語句?加()里都是表達式 不加為語句
屬性的操作
屬性的讀取
屬性的賦值
屬性的查看
屬性的刪除:delete 命令
屬性是否存在:in 運算符
屬性的遍歷:for...in 循環
with 語句
參考鏈接
1.概述
1.1生成方法
對象就是一組“鍵值對”(key-value)的集合,是一種無序的復合數據集合。
1.2鍵名
1.2.1對象的所有鍵名都是字符串(ES6 又引入了 Symbol 值也可以作為鍵名),所以加不加引號都可以
1.2.2對象的所有鍵名都是字符串(ES6 又引入了 Symbol 值也可以作為鍵名),所以加不加引號都可以
var obj = {
1: "a",
3.2: "b",
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
obj
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }
obj["100"] // true
1.2.3如果鍵名不符合標識名的條件(比如第一個字符為數字,或者含有空格或運算符),且也不是數字,則必須加上引號,否則會報錯
1.3對象的引用
拷貝的是內存地址,指向同一個
如果不同的變量名指向同一個對象,那么它們都是這個對象的引用,也就是說指向同一個內存地址。修改其中一個變量,會影響到其他所有變量。
此時,如果取消某一個變量對于原對象的引用,不會影響到另一個變量。
var o1 = {};
var o2 = o1;
o1 = 1;
o2 // {}
上面代碼中,o1和o2指向同一個對象,然后o1的值變為1,這時不會對o2產生影響,o2還是指向原來的那個對象。
但是,這種引用只局限于對象,如果兩個變量指向同一個原始類型的值。那么,變量這時都是值的拷貝。
var x = 1;
var y = x;
x = 2;
y // 1
上面的代碼中,當x的值發生變化后,y的值并不變,這就表示y和x并不是指向同一個內存地址。
1.4表達式還是語句?
如果要解釋為對象,最好在大括號前加上圓括號。因為圓括號的里面,只能是表達式,所以確保大括號只能解釋為對象。
({ foo: 123 }) // 正確
({ console.log(123) }) // 報錯
這種差異在eval語句(作用是對字符串求值)中反映得最明顯。
eval("{foo: 123}") // 123
eval("({foo: 123})") // {foo: 123
2.屬性的操作
2.1屬性的讀取
obj.p
obj["p"]
2.1.1如果使用方括號運算符,鍵名必須放在引號里面,否則會被當作變量處理。
var foo = "bar";
var obj = {
foo: 1,
bar: 2
};
obj.foo // 1
obj[foo] // 2
2.1.2方括號運算符內部還可以使用表達式。
obj["hello" + " world"]
obj[3 + 3]
2.1.3數字鍵可以不加引號,因為會自動轉成字符串。注意,數值鍵名不能使用點運算符(因為會被當成小數點),只能使用方括號運算符
var obj = {
0.7: "Hello World"
};
obj["0.7"] // "Hello World"
obj[0.7] // "Hello World"
2.2屬性的賦值
2.3屬性的查看
查看一個對象本身的所有屬性,可以使用Object.keys方法。
不可遍歷不可遍歷的
2.4屬性的刪除:delete 命令
返回真假
刪除一個不存在的屬性,delete不報錯,而且返回true
刪除一個construct不可的為假
delete命令只能刪除對象本身的屬性,無法刪除繼承的屬性(關于繼承參見《面向對象編程》章節)。
var obj = {};
delete obj.toString // true
obj.toString // function toString() { [native code] }
2.5屬性是否存在:in 運算符
可以繼承的無關遍歷 在不在而已
這時,可以使用對象的hasOwnProperty方法判斷一下,是否為對象自身的屬性。
var obj = {};
if ("toString" in obj) {
console.log(obj.hasOwnProperty("toString")) // false
}
2.6屬性的遍歷:for...in 循環
跳過不可遍歷 可以繼承
舉例來說,對象都繼承了toString屬性,但是for...in循環不會遍歷到這個屬性。
var obj = {};
// toString 屬性是存在的
obj.toString // toString() { [native code] }
for (var p in obj) {
console.log(p);
} // 沒有任何輸出
上面代碼中,對象obj繼承了toString屬性,該屬性不會被for...in循環遍歷到,因為它默認是“不可遍歷”的
如果繼承的屬性是可遍歷的,那么就會被for...in循環遍歷到。但是,一般情況下,都是只想遍歷對象自身的屬性,所以使用for...in的時候,應該結合使用hasOwnProperty方法,在循環內部判斷一下,某個屬性是否為對象自身的屬性。
var person = { name: "老張" };
for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
// name
3.with 語句
里面必須是已有的屬性,否則為全局變量
with (對象) {
語句;
}
它的作用是操作同一個對象的多個屬性時,提供一些書寫的方便
// 例一
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;
// 例二
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
var obj = {};
with (obj) {
p1 = 4;
p2 = 5;
}
obj.p1 // undefined
p1 // 4
一個很大的弊病,就是綁定對象不明確,只能運營時判斷,拖慢運行速度
不要使用with語句,可以考慮用一個臨時變量代替with。
with(obj1.obj2.obj3) {
console.log(p1 + p2);
}
// 可以寫成
var temp = obj1.obj2.obj3;
console.log(temp.p1 + temp.p2);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106013.html
摘要:平時在復習基礎知識時,經常會遇到數據類型基礎數據類型內置對象包裝類型對象,檢測數據類型時,用到的值,感覺都差不多,但是又有差異。值與數據類型關系對比下圖,即可知值相較于基礎數據類型少多 平時在復習JS基礎知識時,經常會遇到JS數據類型、基礎數據類型、內置對象、包裝類型對象,檢測數據類型時,用到的typeof值,感覺都差不多,但是又有差異。今天特地整理下,方便理解。 JS數據類型 基礎數...
摘要:可用于判斷多種數據類型基本數據類型和內置對象,然而對于一些自定義構造函數生成的對象就不能進行判斷了。判斷是不是所有數據類型中,只有不等于它本身判斷數組的方法除了上文提到的三種方法可判斷外,還有一個構造函數自帶的方法可判斷。 數據類型的分類 要想判斷數據類型,首先要知道數據類型的分類。數據類型分為基本數據類型和引用數據類型。 基本數據類型 基本數據類型有 五 種,ES6中新加了第 六 種...
摘要:對于與的設計在中所設計的純對象類型的與方法,它們的返回如下方法返回值對象本身。與三個強制轉換函數,所對應的就是在標準中的三個內部運算轉換的對照表。 在JS中的運算符共同的情況中,(+)符號是很常見的一種,它有以下的使用情況: 數字的加法運算,二元運算 字符串的連接運算,二元運算,最高優先 正號,一元運算,可延伸為強制轉換其他類型的運算元為數字類型 當然,如果考慮多個符號一起使用時,...
摘要:原理中的數據類型分為兩類,簡單數據類型和復雜數據類型簡單數據類型包括數值,字符串布爾值復雜數據類型對象即屬性的集合先了解數據類型在計算機中的存儲簡單數據類型存儲的是對象的原始數據復雜數據類型對象的原型也是引用類型,對象類型的值單獨存放。 在js中將一個值a賦值給另一個值b,在什么情況下改變了b的值會影響a的值?在知道哪種類型賦值后改變值會影響原對象的情況下該怎么做才不會影響原對象?就是...
摘要:引用數據類型轉換由的繼承和向上轉型,子類可以很自然地轉換為父類對象,即父類類型可以直接引用子類對象,但是子類類型不能直接引用父類對象,需要進行強制轉換。但是將功能較弱的類型父類強制轉功能較強的對象子類時,就不一定可以行了。 1、引用數據類型轉換: 由java的繼承和向上轉型,子類可以很自然地轉換為父類對象,即父類類型可以直接引用子類對象,但是子類類型不能直接引用父類對象,需要進行強制轉...
摘要:類最基本的作用,在于通過類獲取到相應的對象,在向對象發送消息時以期望對象做某些特定的事情。先導概念引用中一切皆對象,因此采用一個指向對象的引用來操縱對象。對象可以存活于作用域之外。 歡迎各位讀者關注我的微信公眾號,共同探討Java相關技術。生命不止,學習不休! showImg(https://segmentfault.com/img/bVboaBO?w=129&h=129); 也許你慢...
閱讀 1537·2021-11-04 16:10
閱讀 2774·2021-09-30 09:48
閱讀 2839·2019-08-29 11:31
閱讀 1578·2019-08-28 18:22
閱讀 3225·2019-08-26 13:44
閱讀 1319·2019-08-26 13:42
閱讀 2845·2019-08-26 10:20
閱讀 754·2019-08-23 17:00