摘要:一可以用作對象的復(fù)制可以用作對象的合并注意目標(biāo)對象自身也會改變。對象四返回一個(gè)數(shù)組,包括對象自身的不含繼承的所有可枚舉屬性不含屬性的鍵名。該方法返回被凍結(jié)的對象。方法判斷一個(gè)對象是否被凍結(jié)。
JavaScript對Object對象的一些常用操作總結(jié)。
一、Object.assign()1.可以用作對象的復(fù)制
var obj = { a: 1 }; var copy = Object.assign({}, obj); console.log(copy); // { a: 1 }
2.可以用作對象的合并
var o1 = { a: 1 }; var o2 = { b: 2 }; var o3 = { c: 3 }; var obj = Object.assign(o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 } console.log(o1); // { a: 1, b: 2, c: 3 } 注意目標(biāo)對象自身也會改變。
3.目標(biāo)對象o1自身也發(fā)生了改變,假如不想讓o1改變,可以把三個(gè)對象合并到一個(gè)空的對象中,操作如下:
var obj = Object.assign({},o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 } console.log(o1); // { a: 1 }
注意:以下幾個(gè)地方
1.繼承屬性和不可枚舉屬性是不能拷貝的
var obj = Object.create({foo: 1}, { // foo 是個(gè)繼承屬性 bar: { value: 2 // bar 是個(gè)不可枚舉屬性。 }, baz: { value: 3, enumerable: true // baz 是個(gè)自身可枚舉屬性 } }); var copy = Object.assign({}, obj); console.log(copy); // { baz: 3 }
2.原始類型會被包裝為 object
var v1 = "abc"; var v2 = true; var v3 = 10; var v4 = Symbol("foo") var obj = Object.assign({}, v1, null, v2, undefined, v3, v4); // 原始類型會被包裝,null 和 undefined 會被忽略 // 注意,只有字符串的包裝對象才可能有自身可枚舉屬性 console.log(obj); // { "0": "a", "1": "b", "2": "c" }二、Object.create()
Object.create()的不止是有一個(gè)參數(shù),其實(shí)還有第二個(gè)參數(shù)!
Object.create(proto, [ propertiesObject ])第二個(gè)參數(shù)是可選的,主要用于指定我們創(chuàng)建的對象的一些屬性,(例如:是否可讀、是否可寫,是否可以枚舉等等)可以通過下面案例來了解第二個(gè)參數(shù)!
var o; o = Object.create(Object.prototype, { // foo會成為所創(chuàng)建對象的數(shù)據(jù)屬性 foo: { writable:true, configurable:true, value: "hello" }, // bar會成為所創(chuàng)建對象的訪問器屬性 bar: { configurable: false, get: function() { return 10 }, set: function(value) { console.log("Setting `o.bar` to", value) } }}) // 創(chuàng)建一個(gè)以另一個(gè)空對象為原型,且擁有一個(gè)屬性p的對象 o = Object.create({}, { p: { value: 42 } }) // 省略了的屬性特性默認(rèn)為false,所以屬性p是不可寫,不可枚舉,不可配置的 o.p = 24 o.p //42 o.q = 12 for (var prop in o) { console.log(prop) } //"q" delete o.p //false //創(chuàng)建一個(gè)可寫的,可枚舉的,可配置的屬性p o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });三、Object.is()
用來判斷兩個(gè)值是否是同一個(gè)值。
下面是一些例子,面試中可能會提及
Object.is("haorooms", "haorooms"); // true Object.is(window, window); // true Object.is("foo", "bar"); // false Object.is([], []); // false var test = { a: 1 }; Object.is(test, test); // true Object.is(null, null); // true // 特例 Object.is(0, -0); // false Object.is(-0, -0); // true Object.is(NaN, 0/0); // true Object.keys(obj)
返回一個(gè)由一個(gè)給定對象的自身可枚舉屬性組成的數(shù)組,數(shù)組中屬性名的排列順序和使用 for...in 循環(huán)遍歷該對象時(shí)返回的順序一致 (兩者的主要區(qū)別是 一個(gè) for-in 循環(huán)還會枚舉其原型鏈上的屬性)。
let arr = ["a", "b", "c"]; console.log(Object.keys(arr)); // ["0", "1", "2"] /* Object 對象 */ let obj = { foo: "bar", baz: 42 }, keys = Object.keys(obj); console.log(keys); // ["foo","baz"]四、Object.keys()
Object.keys返回一個(gè)數(shù)組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含 Symbol 屬性)的鍵名。
// simple array var arr = ["a", "b", "c"]; console.log(Object.keys(arr)); // console: ["0", "1", "2"] // array like object var obj = { 0: "a", 1: "b", 2: "c" }; console.log(Object.keys(obj)); // console: ["0", "1", "2"] // array like object with random key ordering var anObj = { 100: "a", 2: "b", 7: "c" }; console.log(Object.keys(anObj)); // console: ["2", "7", "100"] // getFoo is a property which isn"t enumerable var myObj = Object.create({}, { getFoo: { value: function () { return this.foo; } } }); myObj.foo = 1; console.log(Object.keys(myObj)); // console: ["foo"]
方法返回一個(gè)給定對象自己的所有可枚舉屬性值的數(shù)組,值的順序與使用for...in循環(huán)的順序相同 ( 區(qū)別在于 for-in 循環(huán)枚舉原型鏈中的屬性 )。 Object.values會過濾屬性名為 Symbol 值的屬性。
var an_obj = { 100: "a", 2: "b", 7: "c" }; console.log(Object.values(an_obj)); // ["b", "c", "a"] var obj = { 0: "a", 1: "b", 2: "c" }; console.log(Object.values(obj)); // ["a", "b", "c"]五、Object.entries()
返回一個(gè)給定對象自身可枚舉屬性的鍵值對數(shù)組,其排列與使用 for...in 循環(huán)遍歷該對象時(shí)返回的順序一致(區(qū)別在于 for-in 循環(huán)也枚舉原型鏈中的屬性)。
const obj = { foo: "bar", baz: 42 }; console.log(Object.entries(obj)); // [ ["foo", "bar"], ["baz", 42] ] const simuArray = { 0: "a", 1: "b", 2: "c" }; console.log(Object.entries(simuArray)); // [ ["0", "a"], ["1", "b"], ["2", "c"] ]六、常用其他操作
1.刪除對象中的某個(gè)值,前面案例中也謝了可以直接用delete
var obj = {b:123}; delete o.p // 或delete obj[b];
2.遍歷對象
2.1for-in遍歷
var obj = {a: "ss", b: "bb", c: "cc"}; for (var i in obj){ console.log(i+":"+obj[i]); }
2.2forEach遍歷,先通過Object.keys()返回一個(gè)數(shù)組
Object.keys(obj).forEach((value, index)=>{ console.log(value, index,obj[value]); }); //等同于 Object.keys(obj).forEach(function (value, index,c) { console.log(value, index,obj[value]); });
2.3jQuery的$.each()方法:它接受兩個(gè)參數(shù),分別指代屬性名和屬性值
$.each(obj,function(key,value){ console.log(key+": "+value)其它一些不常用的對象操作屬性:
1.Object.freeze() 方法可以凍結(jié)一個(gè)對象,凍結(jié)指的是不能向這個(gè)對象添加新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性、可配置性、可寫性。也就是說,這個(gè)對象永遠(yuǎn)是不可變的。該方法返回被凍結(jié)的對象。
2.Object.isFrozen() 方法判斷一個(gè)對象是否被凍結(jié)(frozen)。
3.Object.isExtensible() 方法判斷一個(gè)對象是否是可擴(kuò)展的(是否可以在它上面添加新的屬性)。
4.Object.isSealed() 方法判斷一個(gè)對象是否是密封的(sealed)。
5.Object.seal() 方法可以讓一個(gè)對象密封,并返回被密封后的對象。密封對象是指那些不能添加新的屬性,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫性,但可能可以修改已有屬性的值的對象。
6.Object.getOwnPropertyNames(obj)返回一個(gè)數(shù)組,包含對象自身的所有屬性(不含 Symbol 屬性,但是包括不可枚舉屬性)的鍵名。
7.Object.getOwnPropertySymbols(obj)返回一個(gè)數(shù)組,包含對象自身的所有 Symbol 屬性的鍵名。
8.Reflect.ownKeys(obj)返回一個(gè)數(shù)組,包含對象自身的所有鍵名,不管鍵名是 Symbol 或字符串,也不管是否可枚舉。
9.hasOwnProperty()判斷對象自身屬性中是否具有指定的屬性。
JavaScript字符串操作方法大全,包含ES6方法
JavaScript常用數(shù)組操作方法,包含ES6方法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98993.html
摘要:數(shù)組索引只是具有整數(shù)名稱的枚舉屬性,并且與通用對象屬性相同。利用的解構(gòu)賦值解構(gòu)賦值尾遞歸優(yōu)化遞歸非常耗內(nèi)存,因?yàn)樾枰瑫r(shí)保存成千上百個(gè)調(diào)用幀,很容易發(fā)生棧溢出。而尾遞歸的實(shí)現(xiàn),往往需要改寫遞歸函數(shù),確保最后一步只調(diào)用自身。 一.前言 因?yàn)樵诠ぷ鳟?dāng)中,經(jīng)常使用到j(luò)s的數(shù)組,而其中對數(shù)組方法的使用也是很頻繁的,所以總是會有弄混或者概念不夠清晰的狀況,所以,寫下這篇文章整理一番,本文有對幾乎...
摘要:構(gòu)造函數(shù)模式這種方法創(chuàng)建自定義的構(gòu)造函數(shù),從而自定義對象類型的屬性和方法。借用構(gòu)造函數(shù)在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù),通過和方法來實(shí)現(xiàn)。 JavaScript中沒有類的概念,它不是嚴(yán)格意義上的面向?qū)ο笳Z言,而是基于對象(Object-based)的編程語言。下面是讀《JavaScript高級程序設(shè)計(jì)(第三版)》的學(xué)習(xí)筆記,總結(jié)一些常用的創(chuàng)建對象和繼承的方法。 一、創(chuàng)建對象 1...
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:函數(shù)聲明應(yīng)該在作用域的頂層。數(shù)組和對象字面量用數(shù)組和對象字面量來代替數(shù)組和對象構(gòu)造器。數(shù)組構(gòu)造器很容易讓人在它的參數(shù)上犯錯(cuò)。推薦對象構(gòu)造器不會有類似的問題,但是為了可讀性和統(tǒng)一性,我們應(yīng)該使用對象字面量。 javascript 代碼規(guī)范 代碼規(guī)范我們應(yīng)該遵循古老的原則:能做并不意味著應(yīng)該做。 全局命名空間污染 總是將代碼包裹在一個(gè)立即的函數(shù)表達(dá)式里面,形成一個(gè)獨(dú)立的模塊。 不推薦 va...
摘要:上面的代碼,運(yùn)行以后,我們可以看到因?yàn)榈脑褪侵赶虻膶?shí)例上的,所以可以訪問他的屬性值,那如果我不想讓訪問的構(gòu)造函數(shù)里聲明的屬性值,那怎么辦呢只需要將指向的原型而不是實(shí)例就行了。 走在前端的大道上 本篇將自己讀過的相關(guān) javascript原型和原型鏈 文章中,對自己有啟發(fā)的章節(jié)片段總結(jié)在這(會對原文進(jìn)行刪改),會不斷豐富提煉總結(jié)更新。 文章——深入理解javascript之原型 一般的...
閱讀 1790·2021-11-24 10:21
閱讀 1202·2021-09-22 15:25
閱讀 3165·2019-08-30 15:55
閱讀 704·2019-08-30 15:54
閱讀 3456·2019-08-30 14:20
閱讀 1653·2019-08-30 14:06
閱讀 635·2019-08-30 13:11
閱讀 3135·2019-08-29 16:43