摘要:的一些知識點總結參數要檢測的屬性字符串名稱或者返回值用來判斷一個對象是否含有指定的屬性的所有繼承了的對象都會繼承到方法。返回值返回值規則與相同。
Object的一些知識點總結 1.hasOwnProperty
obj.hasOwnProperty(prop)參數
prop: 要檢測的屬性字符串名稱或者Symbol
返回值用來判斷一個對象是否含有指定的屬性的Boolean
所有繼承了Object的對象,都會繼承到hasOwnProperty()方法。這個方法用來檢測一個對象是否含有特定的自身屬性。和in運算符不同,該方法會忽略那些從原型鏈上繼承到的屬性
Object.prototype.a = "aaa"; var obj = { b: "bbb" } console.log(obj.hasOwnProperty(a)); // false for(var item in obj) { console.log(item); // b a。此結果也找到了從原型鏈上繼承過來的屬性 }
如果hasOwnProperty作為屬性名
var foo = { hasOwnProperty: function() { return false }, bar: "bar" } foo.hasOwnProperty("bar"); // false // 如果這種情況下,想調用原型鏈上的方法 ({}).hasOwnProperty.call(foo, "bar"); // 即foo對象調用了{}對象的方法。 // 等同于 Object.prototype.hasOwnProperty.call(foo, "bar")擴展:遍歷一個對象的所有屬性
for ... in 只會循環可枚舉的屬性,所以不應該基于這個循環不可枚舉的屬性。
2.getOwnPropertyNamesObject.getOwnPropertyNames(obj)參數
obj 一個對象,其自身的可枚舉和不可枚舉屬性的名稱被返回。
返回值在給定對象上找到的自身屬性對應的字符串數組。
Object.getOwnPropertyNames()返回一個數組,數組中包含obj中可枚舉和不可枚舉的屬性。3.Object.keys()
Object.keys(obj)參數
要返回其枚舉自身屬性的對象
返回值一個表示給定對象的所有可枚舉屬性的字符串數組
描述Object.keys()返回一個所有元素為字符串的數組,其元素來自于從給定的object上面可直接枚舉的屬性。這些屬性的順序與手動遍歷該屬性(for...in...)時一致。
var obj = {a:"a",b:"b",c:"c"}; console.log(Object.keys(obj));// ["a", "b", "c"]4.Object.values()
Object.keys()返回key值,Object.values()返回value值,規則與Object.keys()相同。
5.Object.assign()Object.assign()用于將所有可枚舉的值從一個對象復制到目標對象。它將返回目標對象。
Object.assign(target, ...sources);描述
如果目標對象中的屬性與源對象中具有相同的屬性。則目標對象中的屬性將被覆蓋。String類型和Symbol類型的屬性都會被拷貝。
在出現錯誤的情況下,例如,如果屬性不可寫,會引發TypeError,如果在引發錯誤之前添加了任何屬性,則可以更改target對象。
const a = {a: "a", b: "b"}; var b = Object.assign({}, a); console.log(b); //{a: "a", b: "b"}
深拷貝,Object.assign()只能拷貝對象第一層的屬性。如果源對象的屬性值是一個指向對象的引用,它也只拷貝那個引用值。
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}}
合并對象
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 }, 注意目標對象自身也會改變。
合并具有相同屬性的對象,屬性被后續參數中具有相同屬性的其他對象覆蓋。
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 類型的屬性
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 是個繼承屬性。 bar: { value: 2 // bar 是個不可枚舉屬性。 }, baz: { value: 3, enumerable: true // baz 是個自身可枚舉屬性。 } }); var copy = Object.assign({}, obj); console.log(copy); // { baz: 3 }
原始類型會被包裝為對象
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" }
異常會打斷后續拷貝任務
var target = Object.defineProperty({}, "foo", { value: 1, writable: false }); // target 的 foo 屬性是個只讀屬性。 Object.assign(target, {bar: 2}, {foo2: 3, foo: 3, foo3: 3}, {baz: 4}); // TypeError: "foo" is read-only // 注意這個異常是在拷貝第二個源對象的第二個屬性時發生的。 console.log(target.bar); // 2,說明第一個源對象拷貝成功了。 console.log(target.foo2); // 3,說明第二個源對象的第一個屬性也拷貝成功了。 console.log(target.foo); // 1,只讀屬性不能被覆蓋,所以第二個源對象的第二個屬性拷貝失敗了。 console.log(target.foo3); // undefined,異常之后 assign 方法就退出了,第三個屬性是不會被拷貝到的。 console.log(target.baz); // undefined,第三個源對象更是不會被拷貝到的。
拷貝訪問器
var obj = { foo: 1, get bar() { return 2; } }; var copy = Object.assign({}, obj); // { foo: 1, bar: 2 } // copy.bar的值來自obj.bar的getter函數的返回值 console.log(copy); // 下面這個函數會拷貝所有自有屬性的屬性描述符 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 默認也會拷貝可枚舉的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 } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108943.html
摘要:可用于判斷多種數據類型基本數據類型和內置對象,然而對于一些自定義構造函數生成的對象就不能進行判斷了。判斷是不是所有數據類型中,只有不等于它本身判斷數組的方法除了上文提到的三種方法可判斷外,還有一個構造函數自帶的方法可判斷。 數據類型的分類 要想判斷數據類型,首先要知道數據類型的分類。數據類型分為基本數據類型和引用數據類型。 基本數據類型 基本數據類型有 五 種,ES6中新加了第 六 種...
摘要:等同于構造函數與的用法很相似,幾乎一模一樣。實例對象的方法接受一個字符串作為參數,返回一個布爾值,表示該實例對象自身是否具有該屬性。等同于方法生成的對象,繼承了它的原型對象的構造函數。 分類 Object() 函數 Object 本身是一個函數,用來將任意值轉為對象。 如果參數為空(或者為 undefined 和 null),Object() 返回一個空對象。 var obj = Ob...
摘要:最常見的判斷方法它的官方解釋操作符返回一個字符串,表示未經計算的操作數的類型。另外,是判斷對象是否屬于某一類型,而不是獲取的對象的類型。多個窗口意味著多個全局環境,不同的全局環境擁有不同的全局對象,從而擁有不同的內置類型構造函數。 js中的數據類型 js中只有六種原始數據類型和一個Object: Boolean Null Undefined Number String Symbol ...
摘要:在函數運行時指定的值。指定的值并不一定是該函數執行時真正的值,如果這個函數處于非嚴格模式下,則指定為何的值會自動指向全局函數瀏覽器中就是對象。同時值為原始值數字字符串布爾值的會指向該原始值的自動包裝對象。 1、 文件位置 lodashdistlodash.js 2、 ;(function() { }.call(this)) 這個函數的call方法的含義:誰調用它,this就...
摘要:在定義時的方法中的第三個參數,實際上是文件中元素的內部呈現。但是除了元素的各種屬性意外,還有幾個特殊的屬性和方法在定義時,其中一個接口中的第一個參數,是內部訪問的直接媒介接口對象。數組中的元素也是繼承與,并且額外提供了和屬性。 krpano中有好多object,krpano Plugin Interface, krpano Plugin Object, krpano Base Obje...
閱讀 3448·2023-04-26 00:39
閱讀 4038·2021-09-22 10:02
閱讀 2532·2021-08-09 13:46
閱讀 1098·2019-08-29 18:40
閱讀 1444·2019-08-29 18:33
閱讀 773·2019-08-29 17:14
閱讀 1513·2019-08-29 12:40
閱讀 2970·2019-08-28 18:07