scarcoco / projx

5 stars 0 forks source link

JavaScript #25

Open scarcoco opened 4 years ago

scarcoco commented 4 years ago

原型链

示例代码

function Student(name) {
    this.name = name
}
Student.prototype.hello = function() {
    console.log(`hello, ${this.name || ''}`);
}
const a = new Student('zhangsan')
const b = new Student('lisi')
a.__proto__ === Student.prototype
b.__proto__ === Student.prototype

Student.prototype.__proto__ === Object.prototype

Student.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype
scarcoco commented 4 years ago

Object

类方法

assign

Object.assign(target, ...sources)
const obj = {
  foo: 1,
  get bar() {
    return 2;
  }
};

let copy = Object.assign({}, obj); 
console.log(copy); // { foo: 1, bar: 2 } 

create

Object.create(proto[, propertiesObject])

defineProperties 和 defineProperty

Object.defineProperties(obj, props)
Object.defineProperty(obj, prop, descriptor)

{} 定义对象属性时,默认值和上面的这种方式的默认值不同。

Object.entries()、Object.values()、Object.keys()

Object.entries(obj)
Object.values(obj)
Object.keys(obj)

Object.fromEntries

Object.fromEntries(iterable)
const entries = new Map([
  ['foo', 'bar'],
  ['baz', 42]
]);
Object.fromEntries(entries)
Object.fromEntries([['a', 1], ['b', 2]])

Object.seal、Object.freeze、Object.preventExtensions、Object.isSealed、Object.isExtensible、Object.isFrozen

灵活性:普通对象 > Object.preventExtensions > Object.seal > Object.freeze

Object.is

判断值是否相同

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、Object.setPrototypeOf

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、Object.getOwnPropertyDescriptor

Object.getOwnPropertyDescriptors(obj)
Object.getOwnPropertyDescriptors(obj, property)
Object.getOwnPropertyDescriptor('foo', 0);

Object.getOwnPropertySymbols、Object.getOwnPropertyNames

返回对象所有的 Symbol 属性和非 Symbol 属性

Object.getOwnPropertySymbols(obj)
Object.getOwnPropertyNames(obj)

实例方法

对象 isPrototypeOf

protoObj.isPrototypeOf(obj)
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

判断对象属性是否可枚举

obj.propertyIsEnumerable(prop)

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object

scarcoco commented 4 years ago

instanceof

1. 被误解的 instanceof

也许之前就片面理解 instanceof 的意思,实际使用也没有更深入使用,导致有些误解了instanceof,如果从 JavaScript 原型继承来理解,应该不会有问题。

obj instanceof Constructor

判断 Constructor.prototype 是否在 obj 的原型链上,

多个 frame 时,不同 frame 的全局对象是不同的。

2. 区分 Object.prototype.isPrototypeOf

protoObj.isPropotypeOf(obj)

判断 protoObj 是否在对象 obj 的原型链上。

scarcoco commented 4 years ago

for ... infor ... of

scarcoco commented 4 years ago

SetWeakSetMapWeakMap

Set 的方法

Map

SetWeakSet以及MapWeakMap 区别

MapObject 的区别

Object 的键值只能是字符串,Map 的键值可以是任何类型

什么情况下认为是相同元素(Set)或相同的键值(Map

如果两个值全等(=== ),则认为是相同元素和相同键值,NaN 除外。