js對象的方法速覽---數組的靜態方法,實例方法和屬性合集,各包含一個示例

tip:

本文僅作為查找和基本使用的展示,需要深入了解這些方法的使用請參考:Object - JavaScript | MDN (mozilla.org)

可以通過目錄快速鎖定需要查找的方法和查看它的使用

目錄

tip:

新建一個對象

?實例屬性

實例方法

hasOwnProperty(key)

isPrototypeOf(obj)

propertyIsEnumerable(prop)

toLocaleString()

toString()

?valueOf()

靜態方法

?Object.assign(target, ...sources)

?Object.create(proto) ?

Object.defineProperties(obj, props)

Object.defineProperty(obj, prop, descriptor)

Object.entries(obj)

Object.fromEntries(iterable)

Object.getOwnPropertyDescriptor(obj, prop)

Object.getOwnPropertyDescriptors(obj)

?Object.getOwnPropertyNames(obj)

Object.getOwnPropertySymbols(obj)

Object.getPrototypeOf(obj)

Object.groupBy(item, callback)---2024新增

Object.hasOwn(obj, prop)

Object.is(value1, value2)

Object.preventExtensions(obj),Object.isExtensible(obj)

Object.freeze(obj)

Object.isFrozen(obj)

?Object.seal(obj),Object.isSealed(obj)

?Object.keys(obj)

?Object.values(obj)

?Object.setPrototypeOf(obj, prototype)

方法總覽


新建一個對象

// 新建一個對象const obj = {//通過{}name:'Tom',age:18
}
const obj1 = new Object({//通過構造函數name:'Tom',age:18
})
const obj2 = Object.create({ //通過靜態方法name:'Tom',age:18
})//注意這里的參數不是生成對象的結果,參數會作為obj2的原型,obj2本身是一個新的空對象console.log(obj,obj1,obj2);console.log("\n----------分割線----------\n");

?實例屬性

// 實例屬性// constructor 對象的實例屬性
// 除了 null 原型對象之外,任何對象都會在其 [[Prototype]] 上有一個 constructor 屬性。
// Object 實例的 constructor 數據屬性返回一個引用,指向創建該實例對象的構造函數(函數本身而不是字符串)
// 可以用來判斷對象類型
const arr = [];
const number = 1;
console.log(obj.constructor === Object);//true
console.log(arr.constructor === Array);//true
console.log(number.constructor === Number);//trueconsole.log("\n----------分割線----------\n");

實例方法

hasOwnProperty(key)

方法會返回一個布爾值,如果自身有這個key屬性(不包括原型中繼承的屬性),則返回 true,否則返回 false。

// hasOwnProperty(key) 方法會返回一個布爾值,如果自身有這個key屬性(不包括原型中繼承的屬性),則返回 true,否則返回 false。
console.log({name:'Tom'}.hasOwnProperty('name'));//true
console.log({name:undefined}.hasOwnProperty('name'));//true,這里的name值雖然是undefined,但是屬性存在
console.log(['Tom'].hasOwnProperty('0'));//true,數組也是對象,可以將索引看成key
console.log([].hasOwnProperty('length'));//true,數組固有的屬性lengthconsole.log("\n----------分割線----------\n");

isPrototypeOf(obj)

返回布爾值 判斷當前對象是否在obj的原型鏈中,(對象---原型鏈)和object instanceof AFunction不同,這是比較兩個對象的原型鏈 ,(原型鏈---原型鏈)

// isPrototypeOf(obj) 返回布爾值 判斷當前對象是否在obj的原型鏈中,(對象---原型鏈)
// 和object instanceof AFunction不同,這是比較兩個對象的原型鏈 ,(原型鏈---原型鏈)
console.log(Object.prototype.isPrototypeOf({}));//true,Object出現在{}的原型鏈中
console.log(Array.prototype.isPrototypeOf([]));//true,Array出現在[]的原型鏈中console.log("\n----------分割線----------\n");

propertyIsEnumerable(prop)

方法返回一個布爾值,表示prop是否是對象的可枚舉自有屬性(遍歷時是否會被訪問,能否出現在for in循環中)

大多數內置屬性默認情況下是不可枚舉的,而用戶創建的對象屬性通常是可枚舉的,除非明確指定為不可枚舉。

// propertyIsEnumerable(prop) 方法返回一個布爾值,表示prop是否是對象的可枚舉自有屬性(遍歷時是否會被訪問,能否出現在for in循環中)
// 大多數內置屬性默認情況下是不可枚舉的,而用戶創建的對象屬性通常是可枚舉的,除非明確指定為不可枚舉。
console.log({name:'Tom'}.propertyIsEnumerable('name'));//true,name屬性可以遍歷
console.log(['0'].propertyIsEnumerable('0'));//true,索引屬性可以遍歷
console.log(['0'].propertyIsEnumerable('length'));//false,length屬性不可遍歷console.log("\n----------分割線----------\n");

toLocaleString()

?返回一個字符串,返回調用toString()的結果(return this.toString())

// toLocaleString() 返回一個字符串,返回調用toString()的結果(return this.toString())
console.log({name:'Tom'}.toLocaleString());//"[object Object]"console.log("\n----------分割線----------\n");

toString()

返回一個表示該對象的字符串。打印實例時默認調用該方法

// toString() 返回一個表示該對象的字符串。打印實例時默認調用該方法
console.log({name:'Tom'}.toString());//"[object Object]"console.log("\n----------分割線----------\n");

?valueOf()

返回指定對象的原始值。值傳遞時可以使用valueOf將值提取出來

// valueOf() 返回指定對象的原始值。值傳遞時可以使用valueOf將值提取出來
const obj3 = {name:'Tom'}
let newObj = obj3.valueOf();// 值傳遞,此時newObj和obj3并不是指向同一個內存
console.log(obj3.valueOf());// {name:'Tom'},返回對象本身的值
console.log(obj3.valueOf() === obj3);//trueconsole.log("\n----------分割線----------\n");

靜態方法

?Object.assign(target, ...sources)

將source中所有可以遍歷的鍵值對,放入target中,返回target;target和source中相同的key,source中的值會覆蓋target中的值,target 待修改的對象 ,source 多個對象

// Object.assign(target, ...sources) 將source中所有可以遍歷的鍵值對,放入target中,返回target
// target和source中相同的key,source中的值會覆蓋target中的值
// target 待修改的對象 ,source 多個對象
console.log(Object.assign({},{name:'tom'},{age:'10'}));// {name:'tom',age:'10'}
console.log(Object.assign({},[1,2,3,4]));// {0:1,1:2,2:3,3:4}
console.log(Object.assign({},[1,2,3,4],'sss'));// { '0': 's', '1': 's', '2': 's', '3': 4 },字符串會被拆分成單個字符作為對象,后面的屬性值會覆蓋前面的console.log("\n----------分割線----------\n");

?Object.create(proto) ?

靜態方法以proto作為原型,創建一個新對象。

// Object.create(proto)  靜態方法以proto作為原型,創建一個新對象。
const obj4 = Object.create([]);//以[]作為原型,創建一個新對象,數組對象
console.log(obj4);//Array {}console.log("\n----------分割線----------\n");

Object.defineProperties(obj, props)

靜態方法直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性,并返回這個對象。

obj:在其上定義或修改屬性的對象; props: 一個對象,其中每個鍵表示要定義或修改的屬性的名稱,每個值是描述該屬性的對象(是否只讀,是否可枚舉遍歷,)

// Object.defineProperties(obj, props) 靜態方法直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性,并返回這個對象。
// obj:在其上定義或修改屬性的對象; props: 一個對象,其中每個鍵表示要定義或修改的屬性的名稱,每個值是描述該屬性的對象(是否只讀,是否可枚舉遍歷,)
console.log(Object.defineProperties({name:'Tom'
},
{//屬性描述對象name:{value:'Jerry',writable:true //可讀寫}
}));//{name:'Jerry'}console.log("\n----------分割線----------\n");

Object.defineProperty(obj, prop, descriptor)

靜態方法會直接在obj上定義一個新屬性prop,或修改其現有屬性prop,并返回此對象。

obj:待修改的對象 prop:obj對象待修改的屬性名 descriptor:屬性描述對象

// Object.defineProperty(obj, prop, descriptor) 靜態方法會直接在obj上定義一個新屬性prop,或修改其現有屬性prop,并返回此對象。
// obj:待修改的對象 prop:obj對象待修改的屬性名 descriptor:屬性描述對象
console.log(Object.defineProperty({name:'Tom'},'name',{value:'Jerry'}));//{name:'Jerry'}console.log("\n----------分割線----------\n");

Object.entries(obj)

返回一個obj自身可枚舉(可遍歷)屬性的鍵值對數組(元組),

其排列與使用 for...in 循環遍歷該對象時返回的順序一致(區別在于 for...in 循環還會枚舉其原型鏈中的屬性)。

// Object.entries(obj) 返回一個obj自身可枚舉(可遍歷)屬性的鍵值對數組(元組),
// 其排列與使用 for...in 循環遍歷該對象時返回的順序一致(區別在于 for...in 循環還會枚舉其原型鏈中的屬性)。
console.log(Object.entries({name:'Tom',age:18}));//[["name","Tom"],["age",18]]console.log("\n----------分割線----------\n");

Object.fromEntries(iterable)

將鍵值對列表(iterable)轉換為一個對象。

iterable:一個包含對象列表的可迭代對象,例如 Array 或者 Map。

每個對象都要有兩個屬性,0:表示屬性鍵的字符串或者 Symbol。1:屬性值。通常,該對象被實現為二元數組,第一個元素是屬性鍵,第二個元素是屬性值。

// Object.fromEntries(iterable) 將鍵值對列表(iterable)轉換為一個對象。
// iterable:一個包含對象列表的可迭代對象,例如 Array 或者 Map。
// 每個對象都要有兩個屬性,0:表示屬性鍵的字符串或者 Symbol。1:屬性值。通常,該對象被實現為二元數組,第一個元素是屬性鍵,第二個元素是屬性值。console.log(Object.fromEntries([['name','Tom'],['age',18]]));//{name:'Tom',age:18}console.log("\n----------分割線----------\n");

Object.getOwnPropertyDescriptor(obj, prop)

返回obj上一個自有屬性prop對應的屬性描述對象,如果obj上沒有prop屬性返回undefined。

obj:待查詢的對象 prop:string或者symbol 待查詢的屬性名

// Object.getOwnPropertyDescriptor(obj, prop) 返回obj上一個自有屬性prop對應的屬性描述對象,如果obj上沒有prop屬性返回undefined。
// obj:待查詢的對象 prop:string或者symbol 待查詢的屬性名console.log(Object.getOwnPropertyDescriptor({name:'Tom'},'name'));
//{value:'Tom',writable:true,enumerable:true,configurable:true}console.log("\n----------分割線----------\n");

Object.getOwnPropertyDescriptors(obj)

返回obj的所有自有屬性屬性描述對象。obj:待查詢的對象,類似于Object.getOwnPropertyDescriptor

// Object.getOwnPropertyDescriptors(obj) 返回obj的所有自有屬性屬性描述對象。obj:待查詢的對象,類似于Object.getOwnPropertyDescriptorconsole.log(Object.getOwnPropertyDescriptors({name:'Tom',age:18}));//{name:{...},age:{...}}console.log("\n----------分割線----------\n");

?Object.getOwnPropertyNames(obj)

返回obj對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol屬性)組成的數組。

// Object.getOwnPropertyNames(obj) 返回obj對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol屬性)組成的數組。console.log(Object.getOwnPropertyNames({name:'Tom',age:18}));//['name','age']console.log("\n----------分割線----------\n");

Object.getOwnPropertySymbols(obj)

返回obj對象自身的所有 Symbol 屬性的數組。

// Object.getOwnPropertySymbols(obj) 返回obj對象自身的所有 Symbol 屬性的數組。console.log(Object.getOwnPropertySymbols({[Symbol('name')]:1,[Symbol('age')]:2, name:'Tom',age:18}));//[Symbol(name),Symbol(age)]console.log("\n----------分割線----------\n");

Object.getPrototypeOf(obj)

返回obj對象的原型對象。即內部 [[Prototype]] 屬性的值

// Object.getPrototypeOf(obj) 返回obj對象的原型對象。即內部 [[Prototype]] 屬性的值console.log(Object.getPrototypeOf({}));//Object
console.log(Object.getPrototypeOf([]));//Arrayconsole.log("\n----------分割線----------\n");

Object.groupBy(item, callback)---2024新增

返回一個對象,對象內根據callback的返回值,將item進行分類。?item:待分類的可迭代對象 ?callback:回調函數,返回值作為分類的依據

const items = [{ name: "蘆筍", type: "蔬菜", quantity: 5 },{ name: "香蕉", type: "水果", quantity: 0 },{ name: "山羊", type: "肉", quantity: 23 },{ name: "櫻桃", type: "水果", quantity: 5 },{ name: "魚", type: "肉", quantity: 22 },
];
const result = Object.groupBy(items, ({type}) => type);//此方法目前只在瀏覽器支持
console.log(result);//{蔬菜:{...},水果:{...},肉:{...}}

Object.hasOwn(obj, prop)

返回布爾值,檢查obj對象自身是否具有指定的屬性prop。Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。


// Object.hasOwn(obj, prop) 返回布爾值,檢查obj對象自身是否具有指定的屬性prop。Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。console.log(Object.hasOwn({name:'Tom'},'name'));//trueconsole.log("\n----------分割線----------\n");

Object.is(value1, value2)

返回布爾值,判斷兩個值是否為同一個值。

Object.is() 與 == 運算符并不等價, 也不等價于 === 運算符,相比于 == Object.is()轉換類型比較,相比于 === Object.is()不會忽略 +0 和 -0,也不會把 NaN 等于 NaN。

// Object.is(value1, value2) 返回布爾值,判斷兩個值是否為同一個值。
// Object.is() 與 == 運算符并不等價, 也不等價于 === 運算符,相比于 == Object.is()轉換類型比較,相比于 === Object.is()不會忽略 +0 和 -0,也不會把 NaN 等于 NaN。
console.log(Object.is(1,1));//true
console.log(Object.is(NaN,NaN));//true , == 和 === 返回false
console.log(Object.is(0,-0));//false , == 和 === 返回trueconsole.log("\n----------分割線----------\n");

Object.preventExtensions(obj),Object.isExtensible(obj)

Object.preventExtensions(obj)可以防止新屬性被添加到obj中(即防止該對象被擴展)。它還可以防止對象的原型被重新指定。

Object.isExtensible(obj)返回布爾值,判斷對象是否可擴展(是否可以添加新的屬性)。

在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false

// Object.preventExtensions(obj) 靜態方法可以防止新屬性被添加到obj中(即防止該對象被擴展)。它還可以防止對象的原型被重新指定。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
// Object.isExtensible(obj) 返回布爾值,判斷對象是否可擴展(是否可以添加新的屬性)。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
const extensibleObj = Object.preventExtensions({name:'Tom'});console.log(Object.isExtensible(extensibleObj));//false,不可擴展
console.log(Object.isExtensible({name:'Tom'}));//true
console.log(Object.isExtensible(1));//falseconsole.log("\n----------分割線----------\n");

?

Object.freeze(obj)

凍結obj對象并將其返回,

凍結指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,

即這個對象本身以及屬性都不能在修改(新增、刪除、添加、修改),但是,當屬性是引用類型時可以修改引用類型內的屬性和值(淺凍結,只影響一層)

// Object.freeze(obj) 凍結obj對象并將其返回,
// 凍結指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,
// 即這個對象本身以及屬性都不能在修改(新增、刪除、添加、修改),但是,當屬性是引用類型時可以修改引用類型內的屬性和值(淺凍結,只影響一層)const obj5 = {//注意區分常量和凍結,常量表示的是obj5不能被復制,內部任然可以修改,(淺)凍結是內部的(一層)屬性不能被修改name:'Tom',age:18,info:{//此處內部不受淺凍結影響,若要深凍結則需要遍歷引用類型屬性凍結address:'beijing'}
}console.log(Object.freeze(obj5) === obj5);//{name:'Tom',age:18},返回凍結后的對象,和原對象一致

Object.isFrozen(obj)

返回布爾值,判斷對象是否被凍結。

在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false

// Object.isFrozen(obj) 返回布爾值,判斷對象是否被凍結。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
const freezeObj = Object.freeze({name:'Tom'});
console.log(Object.isFrozen(freezeObj));//true
console.log(Object.isFrozen({name:'Tom'}));//false
console.log(Object.isFrozen(1));//falseconsole.log("\n----------分割線----------\n");

?

?Object.seal(obj),Object.isSealed(obj)

Object.seal(obj) 返回傳遞的對象,使obj密封。

Object.isSealed(obj) 返回布爾值,判斷對象是否被密封(不能添加,刪除,修改)。

在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false

// Object.seal(obj) 返回傳遞的對象,使obj密封。
// Object.isSealed(obj) 返回布爾值,判斷對象是否被密封(不能添加,刪除,修改)。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
const sealObj = Object.seal({name:'Tom'});
console.log(Object.isSealed(sealObj));//true
console.log(Object.isSealed({name:'Tom'}));//falseconsole.log("\n----------分割線----------\n");

?Object.keys(obj)

返回一個包含所有自有可枚舉(可遍歷)屬性名稱的數組。obj:待查詢的對象,傳入基本類型返回空數組[]

// Object.keys(obj) 返回一個包含所有自有可枚舉(可遍歷)屬性名稱的數組。obj:待查詢的對象,傳入基本類型返回空數組[]console.log(Object.keys({name:'Tom',age:18}));//['name','age']console.log("\n----------分割線----------\n");

?Object.values(obj)

返回一個包含所有自有可枚舉(可遍歷)屬性值的數組。obj:待查詢的對象,傳入基本類型返回空數組[]

// Object.values(obj) 返回一個包含所有自有可枚舉(可遍歷)屬性值的數組。obj:待查詢的對象,傳入基本類型返回空數組[]console.log(Object.values({name:'Tom',age:18}));//['Tom',18]console.log("\n----------分割線----------\n");

?Object.setPrototypeOf(obj, prototype)

設置對象obj的原型為prototype,并返回該對象。

通常,作為正確的方式,應該使用 Object.setPrototypeOf() 方法來設置對象的原型。因為 Object.prototype.__proto__ 訪問器已被棄用。

如果傳入基本類型,則直接返回該基本類型,不進行任何其他操作

更改對象的 [[Prototype]] 在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作,要顧及性能應避免修改原型屬性

// Object.setPrototypeOf(obj, prototype),設置對象obj的原型為prototype,并返回該對象。
// 通常,作為正確的方式,應該使用 Object.setPrototypeOf() 方法來設置對象的原型。因為 Object.prototype.__proto__ 訪問器已被棄用。
// 如果傳入基本類型,則直接返回該基本類型,不進行任何其他操作
// 更改對象的 [[Prototype]] 在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作,要顧及性能應避免修改原型屬性const ob = {"0":0,"1":1}
Object.setPrototypeOf(ob,Array.prototype);
console.log(ob);//Array { '0': 0, '1': 1 }

方法總覽

// 新建一個對象const obj = {//通過{}name:'Tom',age:18
}
const obj1 = new Object({//通過構造函數name:'Tom',age:18
})
const obj2 = Object.create({ //通過靜態方法name:'Tom',age:18
})//注意這里的參數不是生成對象的結果,參數會作為obj2的原型,obj2本身是一個新的空對象console.log(obj,obj1,obj2);console.log("\n----------分割線----------\n");// 實例屬性// constructor 對象的實例屬性
// 除了 null 原型對象之外,任何對象都會在其 [[Prototype]] 上有一個 constructor 屬性。
// Object 實例的 constructor 數據屬性返回一個引用,指向創建該實例對象的構造函數(函數本身而不是字符串)
// 可以用來判斷對象類型
const arr = [];
const number = 1;
console.log(obj.constructor === Object);//true
console.log(arr.constructor === Array);//true
console.log(number.constructor === Number);//trueconsole.log("\n----------分割線----------\n");// 實例方法// hasOwnProperty(key) 方法會返回一個布爾值,如果自身有這個key屬性(不包括原型中繼承的屬性),則返回 true,否則返回 false。
console.log({name:'Tom'}.hasOwnProperty('name'));//true
console.log({name:undefined}.hasOwnProperty('name'));//true,這里的name值雖然是undefined,但是屬性存在
console.log(['Tom'].hasOwnProperty('0'));//true,數組也是對象,可以將索引看成key
console.log([].hasOwnProperty('length'));//true,數組固有的屬性lengthconsole.log("\n----------分割線----------\n");// isPrototypeOf(obj) 返回布爾值 判斷當前對象是否在obj的原型鏈中,(對象---原型鏈)
// 和object instanceof AFunction不同,這是比較兩個對象的原型鏈 ,(原型鏈---原型鏈)
console.log(Object.prototype.isPrototypeOf({}));//true,Object出現在{}的原型鏈中
console.log(Array.prototype.isPrototypeOf([]));//true,Array出現在[]的原型鏈中console.log("\n----------分割線----------\n");// propertyIsEnumerable(prop) 方法返回一個布爾值,表示prop是否是對象的可枚舉自有屬性(遍歷時是否會被訪問,能否出現在for in循環中)
// 大多數內置屬性默認情況下是不可枚舉的,而用戶創建的對象屬性通常是可枚舉的,除非明確指定為不可枚舉。
console.log({name:'Tom'}.propertyIsEnumerable('name'));//true,name屬性可以遍歷
console.log(['0'].propertyIsEnumerable('0'));//true,索引屬性可以遍歷
console.log(['0'].propertyIsEnumerable('length'));//false,length屬性不可遍歷console.log("\n----------分割線----------\n");// toLocaleString() 返回一個字符串,返回調用toString()的結果(return this.toString())
console.log({name:'Tom'}.toLocaleString());//"[object Object]"console.log("\n----------分割線----------\n");// toString() 返回一個表示該對象的字符串。打印實例時默認調用該方法
console.log({name:'Tom'}.toString());//"[object Object]"console.log("\n----------分割線----------\n");// valueOf() 返回指定對象的原始值。值傳遞時可以使用valueOf將值提取出來
const obj3 = {name:'Tom'}
let newObj = obj3.valueOf();// 值傳遞,此時newObj和obj3并不是指向同一個內存
console.log(obj3.valueOf());// {name:'Tom'},返回對象本身的值
console.log(obj3.valueOf() === obj3);//trueconsole.log("\n----------分割線----------\n");// 靜態方法// Object.assign(target, ...sources) 將source中所有可以遍歷的鍵值對,放入target中,返回target
// target和source中相同的key,source中的值會覆蓋target中的值
// target 待修改的對象 ,source 多個對象
console.log(Object.assign({},{name:'tom'},{age:'10'}));// {name:'tom',age:'10'}
console.log(Object.assign({},[1,2,3,4]));// {0:1,1:2,2:3,3:4}
console.log(Object.assign({},[1,2,3,4],'sss'));// { '0': 's', '1': 's', '2': 's', '3': 4 },字符串會被拆分成單個字符作為對象,后面的屬性值會覆蓋前面的console.log("\n----------分割線----------\n");// Object.create(proto)  靜態方法以proto作為原型,創建一個新對象。
const obj4 = Object.create([]);//以[]作為原型,創建一個新對象,數組對象
console.log(obj4);//Array {}console.log("\n----------分割線----------\n");// Object.defineProperties(obj, props) 靜態方法直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性,并返回這個對象。
// obj:在其上定義或修改屬性的對象; props: 一個對象,其中每個鍵表示要定義或修改的屬性的名稱,每個值是描述該屬性的對象(是否只讀,是否可枚舉遍歷,)
console.log(Object.defineProperties({name:'Tom'
},
{//屬性描述對象name:{value:'Jerry',writable:true //可讀寫}
}));//{name:'Jerry'}console.log("\n----------分割線----------\n");// Object.defineProperty(obj, prop, descriptor) 靜態方法會直接在obj上定義一個新屬性prop,或修改其現有屬性prop,并返回此對象。
// obj:待修改的對象 prop:obj對象待修改的屬性名 descriptor:屬性描述對象
console.log(Object.defineProperty({name:'Tom'},'name',{value:'Jerry'}));//{name:'Jerry'}console.log("\n----------分割線----------\n");// Object.entries(obj) 返回一個obj自身可枚舉(可遍歷)屬性的鍵值對數組(元組),
// 其排列與使用 for...in 循環遍歷該對象時返回的順序一致(區別在于 for...in 循環還會枚舉其原型鏈中的屬性)。
console.log(Object.entries({name:'Tom',age:18}));//[["name","Tom"],["age",18]]console.log("\n----------分割線----------\n");// Object.fromEntries(iterable) 將鍵值對列表(iterable)轉換為一個對象。
// iterable:一個包含對象列表的可迭代對象,例如 Array 或者 Map。
// 每個對象都要有兩個屬性,0:表示屬性鍵的字符串或者 Symbol。1:屬性值。通常,該對象被實現為二元數組,第一個元素是屬性鍵,第二個元素是屬性值。console.log(Object.fromEntries([['name','Tom'],['age',18]]));//{name:'Tom',age:18}console.log("\n----------分割線----------\n");// Object.getOwnPropertyDescriptor(obj, prop) 返回obj上一個自有屬性prop對應的屬性描述對象,如果obj上沒有prop屬性返回undefined。
// obj:待查詢的對象 prop:string或者symbol 待查詢的屬性名console.log(Object.getOwnPropertyDescriptor({name:'Tom'},'name'));
//{value:'Tom',writable:true,enumerable:true,configurable:true}console.log("\n----------分割線----------\n");// Object.getOwnPropertyDescriptors(obj) 返回obj的所有自有屬性屬性描述對象。obj:待查詢的對象,類似于Object.getOwnPropertyDescriptorconsole.log(Object.getOwnPropertyDescriptors({name:'Tom',age:18}));//{name:{...},age:{...}}console.log("\n----------分割線----------\n");// Object.getOwnPropertyNames(obj) 返回obj對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol屬性)組成的數組。console.log(Object.getOwnPropertyNames({name:'Tom',age:18}));//['name','age']console.log("\n----------分割線----------\n");// Object.getOwnPropertySymbols(obj) 返回obj對象自身的所有 Symbol 屬性的數組。console.log(Object.getOwnPropertySymbols({[Symbol('name')]:1,[Symbol('age')]:2, name:'Tom',age:18}));//[Symbol(name),Symbol(age)]console.log("\n----------分割線----------\n");// Object.getPrototypeOf(obj) 返回obj對象的原型對象。即內部 [[Prototype]] 屬性的值console.log(Object.getPrototypeOf({}));//Object
console.log(Object.getPrototypeOf([]));//Arrayconsole.log("\n----------分割線----------\n");// Object.groupBy(item, callback) 返回一個對象,對象內根據callback的返回值,將item進行分類。2024新增
// item:待分類的可迭代對象  callback:回調函數,返回值作為分類的依據// const items = [
//   { name: "蘆筍", type: "蔬菜", quantity: 5 },
//   { name: "香蕉", type: "水果", quantity: 0 },
//   { name: "山羊", type: "肉", quantity: 23 },
//   { name: "櫻桃", type: "水果", quantity: 5 },
//   { name: "魚", type: "肉", quantity: 22 },
// ];
// const result = Object.groupBy(items, ({type}) => type);//此方法目前只在瀏覽器支持
// console.log(result);//{蔬菜:{...},水果:{...},肉:{...}}// Object.hasOwn(obj, prop) 返回布爾值,檢查obj對象自身是否具有指定的屬性prop。Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。console.log(Object.hasOwn({name:'Tom'},'name'));//trueconsole.log("\n----------分割線----------\n");// Object.is(value1, value2) 返回布爾值,判斷兩個值是否為同一個值。
// Object.is() 與 == 運算符并不等價, 也不等價于 === 運算符,相比于 == Object.is()轉換類型比較,相比于 === Object.is()不會忽略 +0 和 -0,也不會把 NaN 等于 NaN。
console.log(Object.is(1,1));//true
console.log(Object.is(NaN,NaN));//true , == 和 === 返回false
console.log(Object.is(0,-0));//false , == 和 === 返回trueconsole.log("\n----------分割線----------\n");// Object.preventExtensions(obj) 靜態方法可以防止新屬性被添加到obj中(即防止該對象被擴展)。它還可以防止對象的原型被重新指定。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
// Object.isExtensible(obj) 返回布爾值,判斷對象是否可擴展(是否可以添加新的屬性)。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
const extensibleObj = Object.preventExtensions({name:'Tom'});console.log(Object.isExtensible(extensibleObj));//false,不可擴展
console.log(Object.isExtensible({name:'Tom'}));//true
console.log(Object.isExtensible(1));//falseconsole.log("\n----------分割線----------\n");// Object.freeze(obj) 凍結obj對象并將其返回,
// 凍結指的是不能向這個對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,
// 即這個對象本身以及屬性都不能在修改(新增、刪除、添加、修改),但是,當屬性是引用類型時可以修改引用類型內的屬性和值(淺凍結,只影響一層)const obj5 = {//注意區分常量和凍結,常量表示的是obj5不能被復制,內部任然可以修改,(淺)凍結是內部的(一層)屬性不能被修改name:'Tom',age:18,info:{//此處內部不受淺凍結影響,若要深凍結則需要遍歷引用類型屬性凍結address:'beijing'}
}console.log(Object.freeze(obj5) === obj5);//{name:'Tom',age:18},返回凍結后的對象,和原對象一致// Object.isFrozen(obj) 返回布爾值,判斷對象是否被凍結。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
const freezeObj = Object.freeze({name:'Tom'});
console.log(Object.isFrozen(freezeObj));//true
console.log(Object.isFrozen({name:'Tom'}));//false
console.log(Object.isFrozen(1));//falseconsole.log("\n----------分割線----------\n");// Object.seal(obj) 返回傳遞的對象,使obj密封。
// Object.isSealed(obj) 返回布爾值,判斷對象是否被密封(不能添加,刪除,修改)。
// 在ES5中傳入的值不是對象會直接報錯,在ES6中傳入的值不是對象會返回false
const sealObj = Object.seal({name:'Tom'});
console.log(Object.isSealed(sealObj));//true
console.log(Object.isSealed({name:'Tom'}));//falseconsole.log("\n----------分割線----------\n");// Object.keys(obj) 返回一個包含所有自有可枚舉(可遍歷)屬性名稱的數組。obj:待查詢的對象,傳入基本類型返回空數組[]console.log(Object.keys({name:'Tom',age:18}));//['name','age']console.log("\n----------分割線----------\n");// Object.values(obj) 返回一個包含所有自有可枚舉(可遍歷)屬性值的數組。obj:待查詢的對象,傳入基本類型返回空數組[]console.log(Object.values({name:'Tom',age:18}));//['Tom',18]console.log("\n----------分割線----------\n");// Object.setPrototypeOf(obj, prototype),設置對象obj的原型為prototype,并返回該對象。
// 通常,作為正確的方式,應該使用 Object.setPrototypeOf() 方法來設置對象的原型。因為 Object.prototype.__proto__ 訪問器已被棄用。
// 如果傳入基本類型,則直接返回該基本類型,不進行任何其他操作
// 更改對象的 [[Prototype]] 在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作,要顧及性能應避免修改原型屬性const ob = {"0":0,"1":1}
Object.setPrototypeOf(ob,Array.prototype);
console.log(ob);//Array { '0': 0, '1': 1 }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43788.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Websocket 替代方案:如何使用 Firestore 監聽實時事件

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 ?在現代 Web 開發中,實時更新功能對于許多應用程序(如聊天應用、協作工具和在線游戲)都是必不可少的。雖然 WebSocket 是一種常用的實時通信技術,但 Google 的 Firestore 也提供了一種強大的替代方案,使得實時監聽變得…

Golang中defer和return順序

在Golang中,defer 和 return 的執行順序是一個重要的特性,它們的執行順序如下: return語句不是一條單獨的語句,實際上,它是由賦值和返回兩部分組成的。賦值步驟會先執行,這一步會計算return語句中的表達式…

Linux安裝Docker以及Docker Componse

一、安裝前準備工作 1.1 查看服務器系統版本以及內核版本 cat /etc/redhat-release 1.2 查看服務器內核版本 uname -r這里我們使用的是CentOS 7.4 系統,內核版本為3.10 1.3 安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm21.4 設置…

賽氪網受邀出席浙江省應用數學研究會,共啟數學教育與競賽新篇章

2024年7月5日,浙江省應用數學研究會在風景如畫的嘉興市成功舉辦了2024年學術研討會暨第七屆第六次理事會工作會議的首日活動。作為技術支持單位,賽氪網受邀參與此次盛會,彰顯了其在數學教育及競賽領域的深厚實力與積極貢獻。 開幕式由嘉興大學…

linux watchdog 子系統

目錄 一、watchdog 子系統二、關鍵數據結構2.1 watchdog_device2.2 watchdog_ops2.3 watchdog_info 三、重要流程3.1 watchdog 初始化3.2 watchdog 設備注冊3.3 watchdog 設備文件操作函數3.4 watchdog 喂狗用戶空間 watchdog(busybox)內核空間喂狗疑問 …

生成隨機密碼

生成8位無重復的密碼(可以包含數字、大小寫字母) import random import string character string.digits string.ascii_letters password .join(random.sample(character, 8)) print(f"生成的隨機密碼為:{password}")

rushAWD使用說明

rushAWD使用說明 檢查單 先開個坑,慢慢填 檢查單 af 配置項用途值conf.yaml總配置項靶機名:靶機IP

如何快速實現一個無縫輪播效果

🧑?💻 寫在開頭 點贊 收藏 學會🤣🤣🤣 需求簡介 輪播圖是我們前端開發中的一個常見需求,在項目開發中,我們可以使用element、ant等UI庫實現。某些場景,為了一個簡單的功能安裝一…

IDEA新建項目并撰寫Java代碼的方法

本文介紹在IntelliJ IDEA軟件中,新建項目或打開已有項目,并撰寫Java代碼的具體方法;Groovy等語言的代碼也可以基于這種方法來撰寫。 在之前的文章IntelliJ IDEA社區版在Windows電腦中的下載、安裝方法(https://blog.csdn.net/zheb…

35.搜索插入位置

題目描述 給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示例 2:…

在任何崗位都可以把自己當成一個項目經理

這幾天跟一個剛入職場的姐妹交流的時候,她問了我一個問題,如果讓你總結三年從助理升到經理的關鍵點,你覺得是什么?我思考了那么幾秒鐘,大概就是——在任何崗位都把自己當項目經理。 今天給大家介紹我的項目管理工具——…

解析Spring Boot中的數據遷移工具

解析Spring Boot中的數據遷移工具 大家好,我是微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 1. 數據遷移工具的重要性和選擇 在開發和維護現代化應用程序時,數據遷移是一個關鍵的任務。Spring Bo…

頭歌資源庫(21)走方格

一、 問題描述 二、算法思想 首先,確定方格中間下方人所在的位置,即(row, col) (n//2, m//2)。初始化路徑和為0。從初始位置開始,按照給定的5個方向進行移動:上(U),下(D),左(L),右(R)&#x…

關于騰訊的那些事(6月新聞紀要)

祝賀!深圳市科技進步一等獎 這份文件是關于騰訊云數據庫TDSQL獲得深圳市科技進步一等獎的詳細報道。以下是詳細總結分析: 獲獎榮譽: 騰訊云數據庫TDSQL榮獲2022年深圳市科技進步一等獎,成為唯一入選的數據庫產品。該獎項由深圳市…

菜雞的原地踏步史05(???)

每日一念 改掉自己想到哪寫哪的壞習慣 子串 和為K的子數組 class Solution {/**有點像找出和為0的子數組,只不過這里和變成了k不太對,嘗試使用雙指針滑動窗口,完全過不去樣例正確做法hashmap存放 sum -- count對nums中的數字進行遍歷sum累…

C#與物聯網:打造智能家居解決方案

引言 隨著物聯網(IoT)的快速發展,智能家居成為了現代生活的一個重要組成部分。智能家居系統通過連接各種智能設備,如智能燈光、恒溫器、安防攝像頭等,實現家居環境的自動化和智能化控制。C#作為一種強大的編程語言&am…

Linux C++ 045-設計模式之工廠模式

Linux C 045-設計模式之工廠模式 本節關鍵字:Linux、C、設計模式、簡單工廠模式、工廠方法模式、抽象工廠模式 相關庫函數: 簡單工廠模式 基本簡介 從設計模式的類型上來說,簡單工廠模式是屬于創建型模式,又叫做靜態工廠方法&…

10、Python之寫出更加Pythonic的代碼:unpacking拆包機制

引言 有些小伙伴有其他編程語言的學習、使用的經驗,然后遷移到Python。一般會比完全的新手小白,更快速地把Python用起來。這是他們的優勢,但也是他們的劣勢。 之所以這么說,是因為從其他編程語言帶過來的,除了相通的編…

MOJO語言中的字典和哈希表:數據結構的靈活性與效率

MOJO是一種編程語言,它以其獨特的語法和對現代編程范式的支持而聞名。在MOJO中,字典(也稱為哈希表或散列表)是一種非常重要的數據結構,它允許開發者以鍵值對的形式存儲和檢索數據。本文將深入探討MOJO語言中的字典和哈…

第十八節 LLaVA如何按需構建LORA訓練(視覺、語言、映射多個組合訓練)

文章目錄 前言一、基于llava源碼構建新的參數1、添加lora_vit參數2、訓練命令腳本設置二、修改源碼,構建lora訓練1、修改源碼-lora訓練2、LLM模型lora加載3、VIT模型加載4、權重凍結操作5、結果顯示三、實驗結果前言 如果看了我前面文章,想必你基本對整個代碼有了更深認識。…