一些日常的筆記,但願有所幫助bash
能夠理解爲:一組"鍵值對"(key-value)的集合,是一種無序的複合數據集合。函數
let obj = { foo:"Hello", bar:"world" } //對象的全部鍵名都是字符串(ES6又引入了Symbol值也能夠做爲鍵名) //因此不加引號也行 let obj2 = { "foo":"Hello", "bar":"World" }
對象的全部鍵名都是字符串,不用引號也是能夠的。code
var a = { 1: 'a', 3.2: 'b', 1e2: true, 1e-2: true, .234: true, 0xFF: true }; console.log(a) /* Object { 1: "a", 3.2: "b", 100: true, 0.01: true, 0.234: true, 255: true }*/ console.log(a["100"]);// true //看上去鍵名是數值,可是會所有自動轉換爲字符串
看上面鍵名是數值,可是會所有自動轉換爲字符串對象
// 不報錯 let b = { '1p': 'Hello World', 'h w': 'Hello World', 'p+q': 'Hello World' };
let c= { p: function (x) { return 2 * x; } }; console.log(c.p(3));//6 // c對象的屬性p,指向一個函數
上面c對象的屬性p,指向一個函數繼承
let d = {}; d.foo = 123; console.log(d.foo);//123
let e = { p:"hello world" } console.log(e.p);//hello world console.log(e["p"]);//hello world
使用[]時鍵名必須放在引號裏面,不然會被當作變量處理字符串
let f = { 123: 'hello world' }; // fff.123 // 報錯 f[123] // "hello world"
數字鍵能夠不用引號。可是不能用點運算io
// js容許屬性後綁定 let g = {}; g.foo = "Hello"; g["bar"] = "World";
let h ={p:1}; //等價於 let j={}; j.p =1;
let i = { key1:1, key2:2 } console.log(Object.keys(i));
let k={p:1}; console.log(Object.keys(k));//["p"] delete k.p; console.log(k.p);//1 console.log(Object.keys(k));//[]
值得注意的,刪除不存在的屬性,照樣返回trueconsole
let l = {}; console.log(delete obj.p);//true
注意:delete沒法刪除繼承屬性function
// in運算符有一個問題,他不能識別哪些屬性是對象自身的,哪些是繼承的 let m = {p:1}; console.log("p" in m);//true console.log('toString' in m);//true
// 這時須要hasOwnProperty的方法判斷一下,是否爲對象自身屬性 let n ={}; if('toString' in obj){ console.log(n.hasOwnProperty('toString'));//false }
var o = {a: 1, b: 2, c: 3}; for (let i in o) { console.log('鍵名:', i); console.log('鍵值:', o[i]); } // 鍵名: a // 鍵值: 1 // 鍵名: b // 鍵值: 2 // 鍵名: c // 鍵值: 3 // for in須要注意的兩個點 // 1:他遍歷的是對象全部可遍歷的屬性,會跳過不可遍歷的屬性 // 2:不只遍歷自身的屬性,還遍歷繼承的屬性
只遍歷自身屬性class
let person = {name:"123"} for(let key in person){ if(person.hasOwnProperty(key)){ console.log(key); } }