關於陣列以及物件一些api的註解和使用
- 陣列
- arr.join(“連線符”)
作用:用連線符把數組裡面的元素連線成字串;
注意:arr.join("")能無縫連線,即將陣列轉化為字串。
- arr.concat("a","b",arr1)
作用:進行拼接
注意:Ⅰ不會修改原陣列,返回新陣列。
Ⅱconcat方法中的陣列會被打散為單個元素再拼接。
舉例:
var arr=['0'];
var arrConcat=arr.concat('1','2',[‘3’,’4’]);
console.log(arr);//輸出結果為[‘0’]
console.log(arrConcat);//輸出結果為["0", "1", "2", "3","4"]
- arr.slice(start[,end])
作用:從下標start開始擷取到end-1
注意:Ⅰend是可選的,若end缺失,表示擷取到陣列的最後一個元素
Ⅱ支援負數,表示倒數第幾個,start永遠小於end
Ⅲ不會修改元素組,返回新陣列
舉例:
var arr=["1","2","3","4","5","6"];
var arrSlice1=arr.slice(0,3);
var arrSlice2=arr.slice(-3,-1);
console.log(arr);//輸出結果為["1", "2", "3", "4", "5", "6"]
console.log(arrSlice1);//輸出結果為["1", "2", "3"]
console.log(arrSlice2);//輸出結果為["4", "5"]
- arr.splice(start,n[,value1,value2...])
作用:從start開始刪除插入或替換陣列的n個元素
注意: Ⅰstart是必須的,表示操作的開始,n也是必須的,表示操作 的 個數,start可以是負數
Ⅱ原陣列會被修改
Ⅲ返回被刪除的陣列,若n=0,返回陣列為[]
舉例:
Ⅰ刪除
var arr=["1","2","3","4","5","6"];
var arrSplice1=arr.splice(2,2);
console.log(arr);//輸出結果為["1", "2", "5", "6"]
console.log(arrSplice1);//輸出結果為["3", "4"]
Ⅱ插入--n=0就可以了
var arr=["1","2","3","4","5","6"];
var arrSplice2=arr.splice(2,0,7,8);
console.log(arr);//輸出結果為["1", "2", 7, 8, "3", "4", "5", "6"]
console.log(arrSplice2);//輸出結果為[]
Ⅲ替換--刪除後面加上替換的資料
var arr=["1","2","3","4","5","6"];
var arrSplice3=arr.splice(2,3,7,8,9);
console.log(arr);//輸出結果為["1", "2", 7, 8, 9, "6"]
console.log(arrSplice3);//輸出結果為["3", "4", "5"]
- arr.reverse()
作用:翻轉陣列
注意:直接修改原陣列
舉例:
var arr=["1","2","3","4","5"];
Var arrReverse=arr.reverse();
console.log(arr);//輸出結果為[ "5", "4", "3", "2", "1"]
console.log(arrReverse);//輸出結果為[ "5", "4", "3", "2", "1"]
- arr.sort()
作用:陣列排序
注意: Ⅰ直接修改原陣列
Ⅱ預設根據陣列元素的第一位ASCII碼值升序(從小到大)排列
Ⅲ可以使用比較器函式來控制升降序,只限陣列中是數字或者數字字串
升序:arr.sort(function(a,b){return a-b;});
降序:arr.sort(function(a,b){return b-a;});
Ⅳ隨機打亂陣列,陣列可以是任意的型別
arr.sort(function(){return Math.random()>.5 ? 1 : -1;});
舉例:無
- arr.indexOf(value[,from])或arr.lastIndexOf(value[,from])
作用:查詢value元素在陣列中的位置
注意:Ⅰ如果存在就返回陣列元素的下標,如果不存在就返回-1
ⅡlastIndexOf是當有多個的時候返回最後一個,indexOf如果有 多個的時候返回的是第一個
舉例:
var beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
console.log(beasts.indexOf('bison'));// 輸出為1
console.log(beasts.indexOf('bison', 2));// 輸出為4
console.log(beasts.indexOf('giraffe'));// 輸出為-1
console.log(beasts.lastIndexOf('bison'));//輸出為4
- arr.some(function(value,index,arr){ //do Something})
作用:判斷是否有符合的元素,只要遇到符合條件的就退出迴圈
注意:Ⅰ返回的是boolean值
Ⅱvalue是指每個陣列元素值,index是指下標
Ⅲ如果函式中沒有return,返回的一定是false
舉例:
var arr=["1","2","3","4","5","6"];
var arrSome1=arr.some(function(value,index,arr){
if(value%2){return value}
});
console.log(arrSome1);//輸出true
var arrSome2=arr.some(function(value,index,arr){
if(value%2){
console.log(index)//輸出0,2,4
}
});
console.log(arrSome2);//輸出false
var arrSome3=arr.some(function(value,index,arr){
return value>5});
console.log(arrSome3);//輸出true
- arr.every(function(value,index,arr){//do Something})
作用:判斷陣列元素是否否符合條件
注意:Ⅰ返回的是boolean值
Ⅱ如果函式中沒有return,返回的一定是false
舉例:
var arr=["1","2","3","4","5","6"];
var arrEvery=arr.every(function(value,index,arr){
return value%2});
console.log(arrEvery);//輸出false
- arr.filter(function(value,index,arr){//do Something})
作用:過濾陣列,返回符合條件的元素組成的新陣列。
注意:Ⅰ不會改變原陣列
舉例:
var arr=["1","2","3","4","5","6"];
var arrFilter=arr.filter(function(value,index,arr){
return value%2});
console.log(arrFilter);//輸出["1", "3", "5"]
console.log(arr);//輸出["1", "2", "3", "4", "5", "6"]
- arr.forEach(function(value,index,arr){})
作用:迴圈陣列,沒有返回值
注意:無
舉例:無
- arr.map(function(value,index,arr){})
作用:迴圈陣列,沒有返回值
注意:無
舉例:無
- arr.reduce(function(pre,value,index,arr){return pre + value;})
作用:彙總所有陣列元素的和
注意:Ⅰpre是指前面所有元素的和
Ⅱ一定要有return
Ⅲ如果是return pre,則只會返回1
舉例:
var arr=[1,2,3,4,5,6];
var arrReduce=arr.reduce(function(pre,value,index,arr){
return pre+value});
console.log(arrReduce);//輸出21
- String(arr)或arr.toString()
作用:將陣列中的元素用逗號連線成字串,類似於arr.join(",")。
注意:無
舉例:無
- arr.unshift(value)
作用:在陣列的最開頭插入元素。
注意:Ⅰ修改原陣列
Ⅱ返回新陣列的length
舉例:
var arr=[1,2,3,4,5,6];
var arrUnshift=arr.unshift(0);
console.log(arr);//輸出[0, 1, 2, 3, 4, 5, 6]
console.log(arrUnshift);//輸出7
- arr.shift()
作用:彈出陣列最開頭的元素
注意:Ⅰ修改原陣列
Ⅱ返回被彈出的元素
舉例:
var arr=[1,2,3,4,5,6];
var arrShift=arr.shift();
console.log(arr);//輸出[2, 3, 4, 5, 6]
console.log(arrShift);//輸出1
- arr.push(value1[,value2,arr1])
作用:在陣列末尾追加元素
注意:Ⅰ修改原陣列。
Ⅱ返回新陣列的length
Ⅲ追加進去的陣列不會被打散
舉例:
var arr=[1,2,3,4,5,6];
var arrPush=arr.push(0,[1,2]);
console.log(arr);//輸出[1, 2, 3, 4, 5, 6, 0, [1,2]]
console.log(arrPush);//輸出8
- arr.pop()
作用:彈出陣列最末尾的元素
注意:Ⅰ修改原陣列
Ⅱ返回被彈出的元素
舉例:
var arr=[1,2,3,4,5,6];
var arrPop=arr.pop();
console.log(arr);//輸出[1, 2, 3, 4, 5]
console.log(arrPop);//輸出6
- 陣列
- arr.join(“連線符”)
作用:用連線符把數組裡面的元素連線成字串;
注意:arr.join("")能無縫連線,即將陣列轉化為字串。
- arr.concat("a","b",arr1)
作用:進行拼接
注意:Ⅰ不會修改原陣列,返回新陣列。
Ⅱconcat方法中的陣列會被打散為單個元素再拼接。
舉例:
var arr=['0'];
var arrConcat=arr.concat('1','2',[‘3’,’4’]);
console.log(arr);//輸出結果為[‘0’]
console.log(arrConcat);//輸出結果為["0", "1", "2", "3","4"]
- arr.slice(start[,end])
作用:從下標start開始擷取到end-1
注意:Ⅰend是可選的,若end缺失,表示擷取到陣列的最後一個元素
Ⅱ支援負數,表示倒數第幾個,start永遠小於end
Ⅲ不會修改元素組,返回新陣列
舉例:
var arr=["1","2","3","4","5","6"];
var arrSlice1=arr.slice(0,3);
var arrSlice2=arr.slice(-3,-1);
console.log(arr);//輸出結果為["1", "2", "3", "4", "5", "6"]
console.log(arrSlice1);//輸出結果為["1", "2", "3"]
console.log(arrSlice2);//輸出結果為["4", "5"]
- arr.splice(start,n[,value1,value2...])
作用:從start開始刪除插入或替換陣列的n個元素
注意: Ⅰstart是必須的,表示操作的開始,n也是必須的,表示操作 的 個數,start可以是負數
Ⅱ原陣列會被修改
Ⅲ返回被刪除的陣列,若n=0,返回陣列為[]
舉例:
Ⅰ刪除
var arr=["1","2","3","4","5","6"];
var arrSplice1=arr.splice(2,2);
console.log(arr);//輸出結果為["1", "2", "5", "6"]
console.log(arrSplice1);//輸出結果為["3", "4"]
Ⅱ插入--n=0就可以了
var arr=["1","2","3","4","5","6"];
var arrSplice2=arr.splice(2,0,7,8);
console.log(arr);//輸出結果為["1", "2", 7, 8, "3", "4", "5", "6"]
console.log(arrSplice2);//輸出結果為[]
Ⅲ替換--刪除後面加上替換的資料
var arr=["1","2","3","4","5","6"];
var arrSplice3=arr.splice(2,3,7,8,9);
console.log(arr);//輸出結果為["1", "2", 7, 8, 9, "6"]
console.log(arrSplice3);//輸出結果為["3", "4", "5"]
- arr.reverse()
作用:翻轉陣列
注意:直接修改原陣列
舉例:
var arr=["1","2","3","4","5"];
Var arrReverse=arr.reverse();
console.log(arr);//輸出結果為[ "5", "4", "3", "2", "1"]
console.log(arrReverse);//輸出結果為[ "5", "4", "3", "2", "1"]
- arr.sort()
作用:陣列排序
注意: Ⅰ直接修改原陣列
Ⅱ預設根據陣列元素的第一位ASCII碼值升序(從小到大)排列
Ⅲ可以使用比較器函式來控制升降序,只限陣列中是數字或者數字字串
升序:arr.sort(function(a,b){return a-b;});
降序:arr.sort(function(a,b){return b-a;});
Ⅳ隨機打亂陣列,陣列可以是任意的型別
arr.sort(function(){return Math.random()>.5 ? 1 : -1;});
舉例:無
- arr.indexOf(value[,from])或arr.lastIndexOf(value[,from])
作用:查詢value元素在陣列中的位置
注意:Ⅰ如果存在就返回陣列元素的下標,如果不存在就返回-1
ⅡlastIndexOf是當有多個的時候返回最後一個,indexOf如果有 多個的時候返回的是第一個
舉例:
var beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
console.log(beasts.indexOf('bison'));// 輸出為1
console.log(beasts.indexOf('bison', 2));// 輸出為4
console.log(beasts.indexOf('giraffe'));// 輸出為-1
console.log(beasts.lastIndexOf('bison'));//輸出為4
- arr.some(function(value,index,arr){ //do Something})
作用:判斷是否有符合的元素,只要遇到符合條件的就退出迴圈
注意:Ⅰ返回的是boolean值
Ⅱvalue是指每個陣列元素值,index是指下標
Ⅲ如果函式中沒有return,返回的一定是false
舉例:
var arr=["1","2","3","4","5","6"];
var arrSome1=arr.some(function(value,index,arr){
if(value%2){return value}
});
console.log(arrSome1);//輸出true
var arrSome2=arr.some(function(value,index,arr){
if(value%2){
console.log(index)//輸出0,2,4
}
});
console.log(arrSome2);//輸出false
var arrSome3=arr.some(function(value,index,arr){
return value>5});
console.log(arrSome3);//輸出true
- arr.every(function(value,index,arr){//do Something})
作用:判斷陣列元素是否否符合條件
注意:Ⅰ返回的是boolean值
Ⅱ如果函式中沒有return,返回的一定是false
舉例:
var arr=["1","2","3","4","5","6"];
var arrEvery=arr.every(function(value,index,arr){
return value%2});
console.log(arrEvery);//輸出false
- arr.filter(function(value,index,arr){//do Something})
作用:過濾陣列,返回符合條件的元素組成的新陣列。
注意:Ⅰ不會改變原陣列
舉例:
var arr=["1","2","3","4","5","6"];
var arrFilter=arr.filter(function(value,index,arr){
return value%2});
console.log(arrFilter);//輸出["1", "3", "5"]
console.log(arr);//輸出["1", "2", "3", "4", "5", "6"]
- arr.forEach(function(value,index,arr){})
作用:迴圈陣列,沒有返回值
注意:無
舉例:無
- arr.map(function(value,index,arr){})
作用:迴圈陣列,沒有返回值
注意:無
舉例:無
- arr.reduce(function(pre,value,index,arr){return pre + value;})
作用:彙總所有陣列元素的和
注意:Ⅰpre是指前面所有元素的和
Ⅱ一定要有return
Ⅲ如果是return pre,則只會返回1
舉例:
var arr=[1,2,3,4,5,6];
var arrReduce=arr.reduce(function(pre,value,index,arr){
return pre+value});
console.log(arrReduce);//輸出21
- String(arr)或arr.toString()
作用:將陣列中的元素用逗號連線成字串,類似於arr.join(",")。
注意:無
舉例:無
- arr.unshift(value)
作用:在陣列的最開頭插入元素。
注意:Ⅰ修改原陣列
Ⅱ返回新陣列的length
舉例:
var arr=[1,2,3,4,5,6];
var arrUnshift=arr.unshift(0);
console.log(arr);//輸出[0, 1, 2, 3, 4, 5, 6]
console.log(arrUnshift);//輸出7
- arr.shift()
作用:彈出陣列最開頭的元素
注意:Ⅰ修改原陣列
Ⅱ返回被彈出的元素
舉例:
var arr=[1,2,3,4,5,6];
var arrShift=arr.shift();
console.log(arr);//輸出[2, 3, 4, 5, 6]
console.log(arrShift);//輸出1
- arr.push(value1[,value2,arr1])
作用:在陣列末尾追加元素
注意:Ⅰ修改原陣列。
Ⅱ返回新陣列的length
Ⅲ追加進去的陣列不會被打散
舉例:
var arr=[1,2,3,4,5,6];
var arrPush=arr.push(0,[1,2]);
console.log(arr);//輸出[1, 2, 3, 4, 5, 6, 0, [1,2]]
console.log(arrPush);//輸出8
- arr.pop()
作用:彈出陣列最末尾的元素
注意:Ⅰ修改原陣列
Ⅱ返回被彈出的元素
舉例:
var arr=[1,2,3,4,5,6];
var arrPop=arr.pop();
console.log(arr);//輸出[1, 2, 3, 4, 5]
console.log(arrPop);//輸出6
2.物件
- 建立物件的兩種方式
Ⅰ:var o = new Object()
Ⅱ:var o = {}; // 推薦,但其實兩者沒有什麼區別
- Object構造器的成員
Object.protoType
注意:該屬性是所有物件的原型(包括 Object物件本身),語言中
的其他物件正是通過對該屬性上新增東西來實現它們之間的繼
承關係的。所以要小心使用。
舉例:
var str= new String('ObjectTest');
var strObj={'str':'ObjectTest'};
Object.prototype.custom = 1;
console.log(str);//輸出結果如圖
console.log(strObj);//輸出結果如圖
- Object.prototype 的成員
最基礎的:
Ⅰ:Object.prototype.constructor
作用:指向用來構造該函式物件的構造器
舉例:①Object.prototype.constructor === Object; // true
②var o = new Object();
o.constructor === Object; // true
Ⅱ:Object.prototype.toString(radix)
作用:該方法返回的是一個用於描述目標物件的字串。
注意:當目標是一個Number物件時,可以傳遞一個用於進位制數的引數radix,該引數radix,該引數的預設值為10(即可以進行數制的轉換)。
舉例:①var o = {prop:1};
o.toString(); // '[object Object]'
②var n = new Number(255);
n.toString(); // '255'
n.toString(16); // 'ff'
console.log(typeof(n.toString(16)));//string
console.log((parseInt(n.toString(16))));//NaN
console.log(parseInt(n.toString(2)));//11111111
Ⅲ:Object.prototype.toLocaleString()
與toString的功能一樣,但是一些物件會做本地化的處理。
另外可以使用navigator.language來了解當前所使用的語言。
Ⅳ:Object.prototype.valueOf()
作用:該方法返回的是用基本型別所表示的this值
注意:如果可以用基本型別表示的話。比如Number物件返回的是它的基 本數值,而Date物件返回的是一個時間戳(timestamp)。如果 無法用基本資料型別表示,該方法會返回this本身。
舉例:①var o = {};
console.log(typeof o.valueOf());//object
Console.log(o.valueOf());//{}
console.log(o.valueOf() === o);//true
②var n = new Number(101);
console.log(typeof n);//object
console.log(typeof n.valueOf);//function
console.log(typeof (n.valueOf()));//number
③var d = new Date();
typeof d.valueOf(); // 'number'
d.valueOf(); // 1542009185998
Ⅴ:Object.prototype.hasOwnProperty(prop)
作用:該方法僅在目標屬性為物件自身屬性時返回true,而當該屬性是 從原型鏈中繼承而來或根本不存在時,返回false。
舉例:var o = {prop:1};
o.hasOwnProperty('prop'); // true
o.hasOwnProperty('toString'); // false
o.hasOwnProperty('formString'); // false
Ⅵ:Object.prototype.isPrototypeOf(obj)
作用:如果目標物件是當前物件的原型,該方法就會返回true.
注意:並不侷限與它的直系關係。
舉例:var s = new String('');
Object.prototype.isPrototypeOf(s); // true
String.prototype.isPrototypeOf(s); // true
Array.prototype.isPrototypeOf(s); // false
Ⅶ:Object.prototype.propertyIsEnumerable(prop)
作用:如果目標屬效能在for in迴圈中被顯示出來,該方法就返回true
舉例:var a = [1,2,3];
a.propertyIsEnumerable('length'); // false
a.propertyIsEnumerable(0); // true
ES5:
Ⅰ:屬性描述符
作用:value——當試圖獲取屬性時所返回的值。
writable——該屬性是否可寫。
enumerable——該屬性在for in迴圈中是否會被列舉
configurable——該屬性是否可被刪除。
set()——該屬性的更新操作所呼叫的函式。
get()——獲取屬性值時所呼叫的函式。
注意:資料描述符(其中屬性為:enumerable,configurable,value, writable)與存取描述符(其中屬性為enumerable,configurable, set(),get())之間是有互斥關係的。在定義了set()和get()之 後,描述符會認為存取操作已被 定義了,其中再定義value和 writable會引起錯誤。
舉例:①ES3風格
var person = {};
person.legs = 2;
②資料描述符
var person = {};
Object.defineProperty(person, 'legs', {
value: 2,
writable: true,
configurable: true,
enumerable: true
});
console.log(person.legs);//2
③儲存描述符--防止別人篡改屬性就必須使用儲存描述符
var person = {};
Object.defineProperty(person, 'legs', {
set:function(v) {
return this.value = v;
},
get: function(v) {
return this.value;
},
configurable: true,
enumerable: true
});
person.legs = 2;
Ⅱ:Object.defineProperty(obj, prop, descriptor)
Object.defineProperties(obj, props)
作用:定義一個或多個物件
舉例:①定義一個見上一條
②var glass = Object.defineProperties({'test':'test'}, {
'color': {
value: 'transparent',
writable: true
},
'fullness': {
value: 'half',
writable: false
}
});
console.log(glass.fullness);//half
console.log(glass.test);//test
Ⅲ:Object.getPrototypeOf(obj)
作用:輸出某個物件的原型
注意:Object的原型為null
舉例:
Object.getPrototypeOf([]) === Array.prototype; // true
Object.getPrototypeOf(Array.prototype)===Object.prototype; // true
Object.getPrototypeOf(Object.prototype) === null; // true
Ⅳ:Object.create(obj, descr)
作用:該方法主要用於建立一個新物件,併為其設定原型。
舉例:
var parent = {hi: 'Hello'};
var o = Object.create(parent, {
prop: {
value: 1
}
});
o.hi; // 'Hello'
// 獲得它的原型
Object.getPrototypeOf(parent) === Object.prototype; // true 說明parent的原型是Object.prototype
Object.getPrototypeOf(o); // {hi: "Hello"} // 說明o的原型是{hi: "Hello"}
o.hasOwnProperty('hi'); // false 說明hi是原型上的
o.hasOwnProperty('prop'); // true 說明prop是原型上的自身上的屬性。
Ⅴ:Object.getOwnPropertyDesciptor(obj, property)
作用:該方法可以讓我們詳細檢視一個屬性的定義。
注意:甚至可以通過它一窺那些內建的,之前不可見的隱藏屬性。
舉例:
Object.getOwnPropertyDescriptor(Object.prototype, 'toString');
// {writable: true, enumerable: false, configurable: true, value: ƒ toString()}
Ⅵ:Object.getOwnPropertyNames(obj)
作用:該方法返回一個數組,其中包含了當前物件所有屬性的名稱(字 符串)。
注意:不論它們是否可列舉。當然,也可以用Object.keys()來單獨返 回可列舉的屬性。
舉例:
Object.getOwnPropertyNames(Object);
// ["length", "name", "arguments", "caller", "prototype", "assign", "getOwnPropertyDescriptor", "getOwnPropertyDescriptors", "getOwnPropertyNames", "getOwnPropertySymbols", "is", "preventExtensions", "seal", "create", "defineProperties", "defineProperty", "freeze", "getPrototypeOf", "setPrototypeOf", "isExtensible", "isFrozen", "isSealed", "keys", "entries", "values"]
Ⅶ:Object.preventExtensions(obj)
作用:用於禁止向某一物件新增更多屬性。
舉例:
var deadline = {};
Object.preventExtensions(deadline);
Object.isExtensible(deadline); // false
Ⅷ:Object.isExtensible(obj)
作用:則用於檢查某物件是否還可以被新增屬性。
舉例:
var deadline = {};
Object.isExtensible(deadline); // true
deadline.date = 'yesterday'; // 'yesterday'
Ⅸ:Object.seal(obj) Object.isSeal(obj)
作用:seal()方法可以讓一個物件密封,並返回被密封后的物件。
seal()方法的作用與preventExtensions()基本相同,但除此之外,它還會將現有屬性
舉例:
var person = {legs:2};
// person === Object.seal(person); // true
Object.isSealed(person); // true
Object.getOwnPropertyDescriptor(person, 'legs');
// {value: 2, writable: true, enumerable: true, configurable: false}
delete person.legs; // false (不可刪除,不可配置)
Object.defineProperty(person, 'legs',{value:2});
person.legs; // 2
person.legs = 1;
person.legs; // 1 (可寫)
Object.defineProperty(person, "legs", { get: function() { return "legs"; } });
// 丟擲TypeError異常
Ⅹ:Object.freeze(obj) Object.isFrozen(obj)
作用:freeze()方法用於執行一切不受seal()方法限制的屬性值變更。Object.freeze() 方法可以凍結一個物件
注意:凍結指的是不能向這個物件新增新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該物件已有屬性的可列舉性、可配置性、可寫性。也就是說,這個物件永遠是不可變的。該方法返回被凍結的物件。
舉例:
var deadline = Object.freeze({date: 'yesterday'});
deadline.date = 'tomorrow';
deadline.excuse = 'lame';
deadline.date; // 'yesterday'
deadline.excuse; // undefined
Object.isSealed(deadline); // true;
Object.isFrozen(deadline); // true
Object.getOwnPropertyDescriptor(deadline, 'date');
// {value: "yesterday", writable: false, enumerable: true, configurable: false} (不可配置,不可寫)
Object.keys(deadline); // ['date'] (可列舉)
Ⅺ:Object.keys(obj)
作用:該方法是一種特殊的for-in迴圈。它只返回當前物件的屬性(不像for-in)
注意:而且這些屬性也必須是可列舉的(這點和Object.getOwnPropertyNames()不同,不論是否可以列舉)。返回值是一個字串陣列。
舉例:
Object.prototype.customProto = 101;
Object.getOwnPropertyNames(Object.prototype);
// [..., "constructor", "toLocaleString", "isPrototypeOf", "customProto"]
Object.keys(Object.prototype); // ['customProto']
var o = {own: 202};
o.customProto; // 101
Object.keys(o); // ['own']
ES6:
Ⅰ:Object.is(value1, value2)
作用:該方法用來比較兩個值是否嚴格相等。它與嚴格比較運算子(===)的行為基本一致。
注意:一是+0不等於-0,二是NaN等於自身。
舉例:
Object.is('xuanyuan', 'xuanyuan'); // true
Object.is({},{}); // false
Object.is(+0, -0); // false
+0 === -0; // true
Object.is(NaN, NaN); // true
NaN === NaN; // false
Ⅱ:Object.assign(target, ...sources)
作用:該方法用來源物件(source)的所有可列舉的屬性複製到目標物件(target)
注意:它至少需要兩個物件作為引數,第一個引數是目標物件target,後面的引數都是源物件(source)。只有一個引數不是物件,就會丟擲TypeError錯誤
Object.assign只複製自身屬性,不可列舉的屬性(enumerable為false)和繼承的屬性不會被複制。
舉例:
var target = {a: 1};
var source1 = {b: 2};
var source2 = {c: 3};
obj = Object.assign(target, source1, source2);
target; // {a:1,b:2,c:3}
obj; // {a:1,b:2,c:3}
target === obj; // true
// 如果目標物件與源物件有同名屬性,或多個源物件有同名屬性,則後面的屬性會覆蓋前面的屬性。
var source3 = {a:2,b:3,c:4};
Object.assign(target, source3);
target; // {a:2,b:3,c:4}
Ⅲ:Object.getOwnPropertySymbols(obj)
作用:該方法會返回一個數組,該陣列包含了指定物件自身的(非繼承的)所有 symbol 屬性鍵。
舉例:Object.getOwnPropertySymbols({a: 'b', [Symbol('c')]: 'd'});// [Symbol(c)]
Ⅳ:Object.setPrototypeOf(obj, prototype)
作用:該方法設定一個指定的物件的原型 ( 即, 內部[[Prototype]]屬性)到另一個物件或 null。
注意:__proto__屬性用來讀取或設定當前物件的prototype物件。目前,所有瀏覽器(包括IE11)都部署了這個屬性。
舉例:
// ES6寫法
var obj = {
method: function(){
// code ...
}
};
// obj.__proto__ = someOtherObj;
// ES5寫法
var obj = Object.create(someOtherObj);
obj.method = function(){
// code ...
};
ES8:
Ⅰ:Object.getOwnPropertyDescriptors(obj)
作用:它可以用來獲取一個物件的所有自身屬性的描述符。
注意:
舉例:
Object.getOwnPropertyDescriptor(Object.prototype, 'toString');
// {writable: true, enumerable: false, configurable: true, value: ƒ toString()}
Object.getOwnPropertyDescriptors(Object.prototype); // 太長
Ⅱ:Object.values(obj)
作用:返回一個給定物件自己的所有可列舉屬性值的陣列,值的順序與使用for...in迴圈的順序相同 ( 區別在於for-in迴圈列舉原型鏈中的屬性 )。
舉例:
var obj = {a:1,b:2,c:3};
Object.keys(obj); // ['a','b','c']
Object.values(obj); // [1,2,3]
Ⅲ:Object.entries(obj)
作用:Object.entries() 方法返回一個給定物件自己的可列舉屬性[key,value]對的陣列,陣列中鍵值對的排列順序和使用 for...in 迴圈遍歷該物件時返回的順序一致(區別在於一個for-in迴圈也列舉原型鏈中的屬性)。
舉例:
var obj = {a:1,b:2,c:3};
Object.keys(obj); // ['a','b','c']
Object.values(obj); // [1,2,3]
Object.entries(obj); // [['a',1],['b',2],['c',3]]