文章如有錯誤請聯(lián)系我 anmingzhe@me.com
Object.assign() ?合并對象
多個參數(shù)错洁,除第一個參數(shù)的所有參數(shù)合并在第一個參數(shù)上
let obj = {a: 1} ? ??
let copy = Object.assign({}, obj) ??
copy ?// {a: 1}
obj.a = 2
copy.a // 1
copy.a = 3
obj.a // 2
得出結(jié)論蝉绷,兩個對象的指針不是同一個进栽。但是 只限于 一層對象说莫,如果對象是{a: {b:1}}那么就出問題了,她們的引用指針就成一個了跟啤,不是兩個獨立的對象了熬甫,? 建議拷貝對象的話,用JSON.parse(JSON.stringify(Object))這種方式進(jìn)行?
let o1 = {a: 1}
let o2 = {b: 2}
let o3 = {b: 3}
let obj = Object.assign(o1, o2, o3)
obj // {a: 1, b: 2, c: 3}
o1 // {a: 1, b: 2, c: 3} ?
得出結(jié)論 吧o2 ?o3合并在o1 上面?
obj.a = 10
o1.a // 10?
得出結(jié)論? 吧o2? o3合并在o1 上面 并賦值給obj 所以 o1和obj共用一個引用指針划提。
Object.create() ?創(chuàng)建對象 和 繼承對象
let a = {} ? ?a.__proto__ ?// 出來一大堆對象自帶的方法和屬性
let b = Object.create(null)? 創(chuàng)建一個以null為原型 的對象? b.__proto__ // undefined ?很干凈
一般當(dāng)你不想繼承任何Object.prototype枫弟,想要得到一個純凈對象時可以用Object.create(null)
function A() {}?
A.prototype.aaa = function(){console.log(111)}
function B() {}
B.prototype = Object.create(A.prototype) ? // 繼承,B 繼承了 A
let b = new B()
b.aaa() ?// 111
object.defineProperties() 在對象添加或修改屬性并返回改對象
Obj.defineProperty() 添加或修改對象上某個屬性鹏往,并返回此對象
Object.entries() 將對象轉(zhuǎn)化為數(shù)組
let obj = {name:'amz',age:23}
console.log( Object,entres(obj) )? //? [ ['name','amz'], ['age', 23] ]
目前就火狐和谷歌實現(xiàn)淡诗,別的瀏覽器都不兼容
Object.getOwnPropertyDescriptor() 返回對象上一個自有屬性的屬性描述符(特性)就是可不可以修改 可以不可以枚舉那些東東?
let obj = {a: 2}
let d = Object.getOwnPropertyDescriptor(obj, 'a')
d // {value: 2, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptors() 獲取對象所有自身屬性的描述符(特性)
var obj = {a: 1,b: 2}
var o = Object.getOwnPropertyDescriptors(obj)
o //{{value: 1, writable: true, enumerable: true, configurable: true},{value: 2, writable: true, enumerable: true, configurable: true}}
Object.getOwnPropertyNames() 返回由對象所有的自身屬性名組成的數(shù)組
var obj = {a: 1}
obj.b = 2
Object.getOwnpropertyNames(obj) ?// ['a','b']
Object.getPrototypeOf() 返回指定對象的原型
let proto = {}
let obj = Object.create(proto)
Object.getprototypeOf(obj) === proto
Object.is()? 傳2參 判斷2參是否相等 于 === 區(qū)別在于 is會讓NaN和NaN相等 +0 -0 不想等,=== 是+0 -0 相等,NaN和NaN不想等
Object.preventExtensions() 讓一個對象不可擴(kuò)展伊履,永遠(yuǎn)不能添加新屬性 但是可以刪除已有屬性
Object.isExtensble()判斷一個對象是否可擴(kuò)展韩容,也就是可以添加新屬性不?
var obj = {}? ? Object.isExtensble(obj) //true ? 可以添加新屬性
Object.freeze() 凍結(jié)對象 改對象永遠(yuǎn)不變,不可修改不可刪除
var obj = {a: 2}
Object.freeze(obj)
obj.a = 10
console.log(obj.a) // 2 ? 不可以修改的
Object.isFrozen() 判斷一個對象是否被凍結(jié)
let obj = {} ? Object.isFrozen(obj) ?//false ? 未凍結(jié)
Object.seal()可以密封一個對象唐瀑,密封是指不能添加和刪除屬性群凶,不能需改屬性的可枚舉可寫可讀的配置,但可以修改已有屬性的指
Object.isSealed() ?判斷一個對象是否被密封 是密封則返true?
Object.keys() 返回由對象鍵組成的一個數(shù)組 如果傳入值不是對象 則會強(qiáng)制轉(zhuǎn)為對象(在es5之前會報錯哄辣,es2015開始才強(qiáng)制轉(zhuǎn)化為對象)
Object.keys('amz') // ['0','1','2']
Object.keys('[1,2,3]') //['0','1','2']
let obj = {a:'aa',m:'mm',z:'zz'} ?Object.keys(obj) // ['a','m','z']
Object.prototype.hasOwnProperty() 判斷屬性是否存在(自有非繼承屬性)
let o = {a: 1} ?o.hasOwnProperty('a') // true ? ?o.hasOwnProperty('toString') //false
Object.prototype.isprototypeOf() 判斷一個對象是否在另一個對象的原型上
let a = {amz: 1} ? ? ?let b = Object.create(a) ? ? a.isPrototypeOf(b) //true
Object.prototype.propertyIsEnumerbale()判斷一個真身屬性在當(dāng)前對象是否可枚舉
let o = {a: 1} ??
o.propertyIsEnumerable('a') //true
Object.defineProperties(o, {b:{value:2,enumerbale:false}}) ?
o.propertyIsEnumerbale('b') //false
Object.prototype.toLocaleString()方法返回一個該對象的字符串表示 (http://www.reibang.com/p/9f442f0c43b4)這里有詳細(xì)講
let o = {a: 1}? o.toLocaleString() ? //"[object Object]"
Object.prototype.toString() ?返回對象的字符串表示
let o = {a: 1}? o.toString()? //"[object Object]"