這篇文章主要介紹了JavaScript中Object的方法示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了秀峰免費(fèi)建站歡迎大家使用!
1、hasOwnProperty
obj.hasOwnProperty(prop)
參數(shù)
prop: 要檢測(cè)的屬性字符串名稱(chēng)或者Symbol
返回值
用來(lái)判斷一個(gè)對(duì)象是否含有指定的屬性的Boolean
所有繼承了Object的對(duì)象,都會(huì)繼承到hasOwnProperty()方法。這個(gè)方法用來(lái)檢測(cè)一個(gè)對(duì)象是否含有特定的自身屬性。和in運(yùn)算符不同,該方法會(huì)忽略那些從原型鏈上繼承到的屬性
Object.prototype.a = 'aaa'; var obj = { b: 'bbb' } console.log(obj.hasOwnProperty(a)); // false for(var item in obj) { console.log(item); // b a。此結(jié)果也找到了從原型鏈上繼承過(guò)來(lái)的屬性 }
如果hasOwnProperty作為屬性名
var foo = { hasOwnProperty: function() { return false }, bar: 'bar' } foo.hasOwnProperty('bar'); // false // 如果這種情況下,想調(diào)用原型鏈上的方法 ({}).hasOwnProperty.call(foo, 'bar'); // 即foo對(duì)象調(diào)用了{(lán)}對(duì)象的方法。 // 等同于 Object.prototype.hasOwnProperty.call(foo, 'bar')
for ... in 只會(huì)循環(huán)可枚舉的屬性,所以不應(yīng)該基于這個(gè)循環(huán)不可枚舉的屬性。
Object.getOwnPropertyNames(obj)
obj 一個(gè)對(duì)象,其自身的可枚舉和不可枚舉屬性的名稱(chēng)被返回。
在給定對(duì)象上找到的自身屬性對(duì)應(yīng)的字符串?dāng)?shù)組。
Object.getOwnPropertyNames()返回一個(gè)數(shù)組,數(shù)組中包含obj中可枚舉和不可枚舉的屬性。
Object.keys(obj)
要返回其枚舉自身屬性的對(duì)象
一個(gè)表示給定對(duì)象的所有可枚舉屬性的字符串?dāng)?shù)組
Object.keys()返回一個(gè)所有元素為字符串的數(shù)組,其元素來(lái)自于從給定的object上面可直接枚舉的屬性。這些屬性的順序與手動(dòng)遍歷該屬性(for...in...)時(shí)一致。
var obj = {a:'a',b:'b',c:'c'}; console.log(Object.keys(obj));// ['a', 'b', 'c']
Object.keys()返回key值,Object.values()返回value值,規(guī)則與Object.keys()相同。
Object.assign()用于將所有可枚舉的值從一個(gè)對(duì)象復(fù)制到目標(biāo)對(duì)象。它將返回目標(biāo)對(duì)象。
Object.assign(target, ...sources);
如果目標(biāo)對(duì)象中的屬性與源對(duì)象中具有相同的屬性。則目標(biāo)對(duì)象中的屬性將被覆蓋。String類(lèi)型和Symbol類(lèi)型的屬性都會(huì)被拷貝。
在出現(xiàn)錯(cuò)誤的情況下,例如,如果屬性不可寫(xiě),會(huì)引發(fā)TypeError,如果在引發(fā)錯(cuò)誤之前添加了任何屬性,則可以更改target對(duì)象。
const a = {a: 'a', b: 'b'}; var b = Object.assign({}, a); console.log(b); //{a: 'a', b: 'b'}
深拷貝,Object.assign()只能拷貝對(duì)象第一層的屬性。如果源對(duì)象的屬性值是一個(gè)指向?qū)ο蟮囊?它也只拷貝那個(gè)引用值。
let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj1.a = 1; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj2.a = 2; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}} obj2.b.c = 3; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}} // Deep Clone obj1 = { a: 0 , b: { c: 0}}; let obj3 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
合并對(duì)象
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)對(duì)象自身也會(huì)改變。
合并具有相同屬性的對(duì)象,屬性被后續(xù)參數(shù)中具有相同屬性的其他對(duì)象覆蓋。
var o1 = { a: 1, b: 1, c: 1 }; var o2 = { b: 2, c: 2 }; var o3 = { c: 3 }; var obj = Object.assign({}, o1, o2, o3); console.log(obj); // { a: 1, b: 2, c: 3 }
拷貝 symbol 類(lèi)型的屬性
var o1 = { a: 1 }; var o2 = { [Symbol('foo')]: 2 }; var obj = Object.assign({}, o1, o2); console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox) Object.getOwnPropertySymbols(obj); // [Symbol(foo)]
繼承屬性和不可枚舉屬性是不能拷貝的
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 }
原始類(lèi)型會(huì)被包裝為對(duì)象
var v1 = "abc"; var v2 = true; var v3 = 10; var v4 = Symbol("foo") var obj = Object.assign({}, v1, null, v2, undefined, v3, v4); // 原始類(lèi)型會(huì)被包裝,null 和 undefined 會(huì)被忽略。 // 注意,只有字符串的包裝對(duì)象才可能有自身可枚舉屬性。 console.log(obj); // { "0": "a", "1": "b", "2": "c" }
異常會(huì)打斷后續(xù)拷貝任務(wù)
var target = Object.defineProperty({}, "foo", { value: 1, writable: false }); // target 的 foo 屬性是個(gè)只讀屬性。 Object.assign(target, {bar: 2}, {foo2: 3, foo: 3, foo3: 3}, {baz: 4}); // TypeError: "foo" is read-only // 注意這個(gè)異常是在拷貝第二個(gè)源對(duì)象的第二個(gè)屬性時(shí)發(fā)生的。 console.log(target.bar); // 2,說(shuō)明第一個(gè)源對(duì)象拷貝成功了。 console.log(target.foo2); // 3,說(shuō)明第二個(gè)源對(duì)象的第一個(gè)屬性也拷貝成功了。 console.log(target.foo); // 1,只讀屬性不能被覆蓋,所以第二個(gè)源對(duì)象的第二個(gè)屬性拷貝失敗了。 console.log(target.foo3); // undefined,異常之后 assign 方法就退出了,第三個(gè)屬性是不會(huì)被拷貝到的。 console.log(target.baz); // undefined,第三個(gè)源對(duì)象更是不會(huì)被拷貝到的。
拷貝訪問(wèn)器
var obj = { foo: 1, get bar() { return 2; } }; var copy = Object.assign({}, obj); // { foo: 1, bar: 2 } // copy.bar的值來(lái)自obj.bar的getter函數(shù)的返回值 console.log(copy); // 下面這個(gè)函數(shù)會(huì)拷貝所有自有屬性的屬性描述符 function completeAssign(target, ...sources) { sources.forEach(source => { let descriptors = Object.keys(source).reduce((descriptors, key) => { descriptors[key] = Object.getOwnPropertyDescriptor(source, key); return descriptors; }, {}); // Object.assign 默認(rèn)也會(huì)拷貝可枚舉的Symbols Object.getOwnPropertySymbols(source).forEach(sym => { let descriptor = Object.getOwnPropertyDescriptor(source, sym); if (descriptor.enumerable) { descriptors[sym] = descriptor; } }); Object.defineProperties(target, descriptors); }); return target; } var copy = completeAssign({}, obj); console.log(copy); // { foo:1, get bar() { return 2 } }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享JavaScript中Object的方法示例內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問(wèn)題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!