重要一点:
第一个重要公式
第二个重要
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
内存
- 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
查看属性
变量作为对象属性名
如何用变量做属性名
之前都是用常量做属性名
let p1 = ‘name’
let obj = { p1 : ‘frank’} 这样写,属性名为 ‘p1’
let obj = { [p1] : ‘frank’ } 这样写,属性名为 ‘name’
对比
不加 [ ] 的属性名会自动变成字符串
加了 [ ] 则会当做变量求值
值如果不是字符串,则会自动变成字符串
非常重要
obj.name 等价于 obj[‘name’]
obj.name 不等价于 obj[name]
查看自身和共有属性
判断是否包含某个属性
判断是自己的属性而非共有属性或默认属性
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”
typeof 123; // number
typeof 'jartto'; // string
typeof !!’0’; // boolean
typeof new Function(); // function
typeof name; // undefined
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。
[] instanceof Array; //true
({}) instanceof Object;//true
new Date() instanceof Date;//true
创建新对象,并指定其原型
Object.create
对象如何深拷贝
直接用=进行对象赋值是引用,可能会出现很多意外的问题
使用Object.assign进行对象合并