重要一点:

第一个重要公式

对象.proto === 其构造函数.prototype

第二个重要

Object.prototype 是所有对象的(直接或间接)原型
使用
Object.prototype 指向一个对象,
console.dir(Object.prototype) 可以看到 这个对象 其包含 toString\valueOf\hasOwnProperty等函数
然后 Object.prototype.proto === null

第三个重要

所有函数都是由 Function 构造的
任何函数.proto === Function.prototype
任意函数有 Object / Array / Function

其他

object.prototye 不是 object 的原型,object.proto 才是 object 的原型

new X() 自动做了四件事情
自动创建空对象
自动为空对象关联原型,原型地址指定为 X.prototype
自动将空对象作为 this 关键字运行构造函数
自动 return this

Object.prototype

Object.prototype是所有对象的原型

内存

  • JavaScript具备自动垃圾回收机制
  • JS内存分为堆内存和栈内存
  • 引用类型在栈中保存指针,在堆中保存对象值
  • 栈内存数据遵循先进后出

还没阅读完毕
https://juejin.cn/post/6844904159045500936#heading-5

7种数据类型

number
string
bool
symbol
undefined
null
object

5个falsy值

null undefined NaN 0 ‘’

声明对象

let obj = {‘name’: ‘frank’, ‘age’: 20}
let obj2 = new Object({‘name’: ‘frank’})
tip: 键名不管加不加引号,都是字符串

删属性

delete obj[‘name’]
delete obj.name

查看属性

Object.keys(obj) 返回数组

变量作为对象属性名

如何用变量做属性名
之前都是用常量做属性名
let p1 = ‘name’
let obj = { p1 : ‘frank’} 这样写,属性名为 ‘p1’
let obj = { [p1] : ‘frank’ } 这样写,属性名为 ‘name’
对比
不加 [ ] 的属性名会自动变成字符串
加了 [ ] 则会当做变量求值
值如果不是字符串,则会自动变成字符串

非常重要

obj.name 等价于 obj[‘name’]
obj.name 不等价于 obj[name]

查看自身和共有属性

console.dir(obj)

判断是否包含某个属性

‘name’ in obj

判断是自己的属性而非共有属性或默认属性

obj.hasOwnProperty(‘name’)
技巧:
遍历对象的时候,通过这个判断key是不是自己的,以防止读取到原型链上的

修改\增加属性

let obj = {name: ‘zengyuan’}
obj.name = ‘frank’
obj[‘name’] = ‘’frank’

批量赋值

Object.assign(obj, {age: 18, gender: ‘man’})

无法通过自身修改隐藏和共有属性

不要随便修改原型

改共有属性 obj.proto[‘toString’] = ‘xxx’
改共有属性 Object.prototype[‘toString’] = ‘xxx’
改原型 obj.proto = common改原型
let obj = Object.create(common)
注:所有 proto 代码都是强烈不推荐写的

typeof instanceof

typeof 其实就是判断参数是什么类型的实例,就一个参数,用例:typeof A
返回值:

“number”、”string”、”boolean”、”object”、”function” 和 “undefined”

  1. typeof 123; // number
  2. typeof 'jartto'; // string
  3. typeof !!’0’; // boolean
  4. typeof new Function(); // function
  5. typeof name; // undefined

instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。

  1. [] instanceof Array; //true
  2. ({}) instanceof Object;//true
  3. new Date() instanceof Date;//true

创建新对象,并指定其原型

Object.create

对象如何深拷贝

直接用=进行对象赋值是引用,可能会出现很多意外的问题
使用Object.assign进行对象合并