Object

建立對象不繼承任何屬性的方法

var obj = Object.create(null)
複製代碼

Set Map Object的區別

  1. 因此對象的屬性名必須是字符串類型,若是屬性名不是字符串也會轉換成字符串,而且屬性名在對象中是惟一的。
var obj = Object.create(null)
map[5] = 5
map['5'] // 5
複製代碼
var obj = Object.create(null)
var key1 = {}
var key2 = {}
map[key1] = 100
mapp[key2] // 100 緣由:Object->String的類型轉換中被轉換成了"[object,Object]"
複製代碼

Object.getOwnPropertyDescriptor()

var obj = {
    name:'luoyi'
}
Object.getOwnPropertyDescriptor(obj,'name')
複製代碼

Object.defineProperty()

Object.defineProperty(obj,'sex',{
  value:'girl',
  writable:true, //是否能夠修改屬性的值
  configurable:true, //是否可使用defineProperty來修改屬性的描述
  enumerable:true //是否會出如今對象的枚舉中
})
複製代碼

writable

決定是否能夠修改屬性的值數組

configurable

是否能夠經過defineProperty配置對象的屬性安全

  1. configurable設置爲false以後,能夠將writable設置爲false以外,可是不能再將writable設置爲false。
  2. configurable設置爲false以後,用delete刪除屬性也會失敗。

enumerable

設置對象的屬性是否可枚舉bash

writable:false和configurable:false配合使用能夠建立一個常量屬性。

var obj = {}
Object.defineProperty(obj,'CONSTVALUE',{
    value:40,
    writable:false,
    configurable:false
})
複製代碼

Object.defineProperties()

Object.preventExtensions()

禁止對象擴展屬性,可是能夠修改屬性的值app

var obj = {
    name:'luoyi'
}
Object.preventExtensions(obj)
obj.sex = 'girl'
obj.sex // undefined
obj.name = 'luoyi3'
obj.name // 'luoyi3'
delete obj.name 
obj.name // undefined
複製代碼

Object.seal() :Object.preventExtensions() + 全部屬性的configurable設置爲false

不能添加新屬性,不能從新配置屬性的描述,不能刪除屬性,可是能夠修改屬性的值函數

Object.freeze():Object.preventExtensions() + 全部屬性的configurable設置爲false + 全部屬性的writable設置爲flase

hasOwnProperty()

只會檢查對象自己,不會檢查原型鏈ui

var obj = {
    a : 1,
    b : 2
}
obj.hasOwnProperty(a) // true
obj.hasOwnProperty(c) // false
複製代碼

propertyIsEnumerable()

檢查給定屬性是否直接存在於對象中,而且知足enumerable:truespa

var obj = {a : 1}
obj.propertyIsEnumerable('a') //true

複製代碼

Object.keys()

返回對象自己可枚舉屬性組成的數組,不包括Symbol類型code

var obj = {a : 1}
Object.keys(obj) // ["a"]
複製代碼

Object.getOwnPropertyNames()

返回對象自己全部屬性的組成的數組包括可枚舉和不可枚舉 不包括Symbol類型cdn

Object.getPrototypeOf()

獲取實例對象的原型對象

Object.getOwePropertySymbols()

返回包含全部Symbol自有屬性的數組。

Reflect.onKeys(obj)

獲取對象的全部類型的key值包括Symbol類型

如何實現對象的淺拷貝和深拷貝

淺拷貝

  1. Object.assing()
var obj = {
    name :'luoyi',
    age:3
}
var obj1 = Object.assign({},obj)
複製代碼

2. 擴展運算符

var obj3 = {...obj}
複製代碼

深拷貝

對於JSON安全的對象(能夠被序列化爲JSON字符串而且能夠根據這個字符串解析出一個結構和值徹底同樣的對象)

var someObj = {
    name:'luoyi',
    age: 3
}
var newObj = JSON.parse(JSON.stringify(someObj))
複製代碼
  • 問題
  1. 不能正確處理Data類型和RegExp類型的數據。
  2. 會忽略symbol和undefined。

實現一個深拷貝的函數

  • 原則
  1. 若是是基本數據類型直接返回。
  2. 若是是 RegExp 或者 Date 類型,返回對應的類型。
  3. 若是是複雜數據類型,進行遞歸。
  4. 考慮循環引用的問題。
function deepClone(obj,hash=new WeakMap(){
    // 判斷循環引用
    if(hash.has(obj)){
        return hash.get(obj)
    }
    if(obj instanceof Date){
        return new Date(obj)
    }
    if(obj instanceof RegExp){
        return new RegExp(obj)
    }
    var t = new obj.constructor()
    hash.set(obj,t)
    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            t[key] = deepClone(obj[key],hash)
        }
    }
    return t
}
複製代碼

爲對象增長一個遍歷器的方法

相關文章
相關標籤/搜索