Open scarcoco opened 4 years ago
Object.assign(target, ...sources)
target
的 setter
和 sources
的 getter
;target
被修改,且返回新的 target
,且两者相同;sources
支持多个;assign
是浅拷贝,只拷贝源对象自身且可枚举的属性;const obj = {
foo: 1,
get bar() {
return 2;
}
};
let copy = Object.assign({}, obj);
console.log(copy); // { foo: 1, bar: 2 }
Object.create(proto[, propertiesObject])
Object.create(null)
和 {}
;Object.create
用于替换原型继承中的 F
函数;null
或者非原始包装对象;Object.defineProperties(obj, props)
Object.defineProperty(obj, prop, descriptor)
configurable
默认 false
enumerable
默认 false
value
默认 undefined
writable
默认 false
get
默认 undefined
set
默认 undefined
{}
定义对象属性时,默认值和上面的这种方式的默认值不同。
Object.entries(obj)
Object.values(obj)
Object.keys(obj)
for in
一致,区别是这些方法只返回自身属性可枚举属性,不返回原型上的属性;new Map(Object.entries(obj))
快速返回 Map
对象;Object.fromEntries(iterable)
Map
、Array
等可迭代对象转为普通对象const entries = new Map([
['foo', 'bar'],
['baz', 42]
]);
Object.fromEntries(entries)
Object.fromEntries([['a', 1], ['b', 2]])
灵活性:普通对象 > Object.preventExtensions
> Object.seal
> Object.freeze
判断值是否相同
Symbol
基本类型相同值都是相同,包括相同的两个 undefined
、null
、布尔值、字符串、+0
、-0
、NaN
等+0
和-0
返回 false
==
和 ===
;Object.is('foo', 'foo'); // true
Object.is(window, window); // true
Object.is('foo', 'bar'); // false
Object.is([], []); // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(null, null); // true
// 特例
Object.is(0, -0); // false
Object.is(0, +0); // true
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true
Object.getPrototypeOf(obj)
// prototype 必须是对象 或 null,否则忽略
Object.setPrototypeOf(obj, prototype)
var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true
var reg = /a/;
Object.getPrototypeOf(reg) === RegExp.prototype; // true
Object.getOwnPropertyDescriptors(obj)
Object.getOwnPropertyDescriptors(obj, property)
obj
不是对象报 TpyeError
,ES2015 则会转为对象Object.getOwnPropertyDescriptor('foo', 0);
返回对象所有的 Symbol
属性和非 Symbol
属性
Object.getOwnPropertySymbols(obj)
Object.getOwnPropertyNames(obj)
protoObj.isPrototypeOf(obj)
instanceof
function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);
var baz = new Baz();
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
判断对象属性是否可枚举
obj.propertyIsEnumerable(prop)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object
instanceof
instanceof
也许之前就片面理解 instanceof
的意思,实际使用也没有更深入使用,导致有些误解了instanceof
,如果从 JavaScript 原型继承来理解,应该不会有问题。
obj instanceof Constructor
判断 Constructor.prototype
是否在 obj
的原型链上,
多个 frame 时,不同 frame 的全局对象是不同的。
Object.prototype.isPrototypeOf
protoObj.isPropotypeOf(obj)
判断 protoObj
是否在对象 obj
的原型链上。
for ... in
和 for ... of
for ... of
适用于遍历数组、字符串、Set
、Map
等拥有迭代器的数据,不能遍历对象;for ... in
适用于遍历对象(需要注意原型链上属性)Set
、WeakSet
、Map
、WeakMap
Set
的方法Set
本身;Set
不存在键值,所以 keys 和 values 返回一样,entries 返回数组每个元素两个值都是相同的;Map
Map
本身;undefined
;Set
和 WeakSet
以及Map
和WeakMap
区别WeakSet
只能存储对象(null
除外),WeakMap
的键值只能是对象(null
除外);WeakSet
内存储的对象不计算引用次数,WeakMap
的键值所指的对象不计算引用次数;Weak*
不可遍历,相关方法:keys
、values
、entries
、forEach
也没有,也不能 ...
运算;Map
与 Object
的区别Object
的键值只能是字符串,Map
的键值可以是任何类型
Set
)或相同的键值(Map
)如果两个值全等(===
),则认为是相同元素和相同键值,NaN
除外。
原型链
示例代码