JavaScript总结【2】
Object(对象)基础
通过使用带有可选 属性列表 的花括号 {…}
来创建对象。一个属性就是一个键值对(“key: value”),其中键(key
)是一个字符串(也叫做属性名),值(value
)可以是任何值。
对象属性
属性命名
- 属性名可以是任何字符串或者 symbol,其他类型自动转换为字符串
- **属性名简写:**部分情况下省略
:...
- **属性存在测试:**使用
in
操作符
属性调用
- **点符号:**点符号要求
key
是有效的变量标识符。这意味着:不包含空格,不以数字开头,也不包含特殊字符(允许使用$
和_
) - 方括号:方括号中的字符串必须放在引号中,方括号中变量
key
可以是程序运行时计算得到的,也可以是根据用户的输入得到的,点符号不行
计算属性
当创建一个对象时,我们可以在对象字面量中使用方括号。这叫做 计算属性,如let bag = { [fruit + 'Computers']: 5}
对象引用和复制
引用及比较
地址,两对象===
必须在地址相同为统一对象时成立
克隆与合并
-
Object.assign
Object.assign(dest, [src1, src2, src3...])
将dest
对象与src
合并,改变了dest
对象并且返回值也为合并的结果!- 注意,只拷贝了一层,即多层引用无法复制,进行克隆时可传入空对象。
- 存在多个同名属性时后面的会覆盖前面的
-
深拷贝:递归实现
- 递归
- 使用现有库
// 造轮子
function deepClone (sourceObj, targetObj) {
let cloneObj = targetObj || {
}
if(!sourceObj || typeof sourceObj !== "object" || sourceObj.length === undefined){
return sourceObj
}
if(sourceObj instanceof Array){
cloneObj = sourceObj.concat()
} else {
for(let i in sourceObj){
if (typeof sourceObj[i] === 'object') {
cloneObj[i] = deepClone(sourceObj[i], {
})
} else {
cloneObj[i] = sourceObj[i]
}
}
}
return cloneObj
}
// lodash函数库
// npm install lodash
import lodash from 'lodash'
let targetOj = lodash.cloneDeep(sourceObj)
JavaScript垃圾回收机制
可达性分析
”可达“值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。
基本步骤
垃圾回收的基本算法被称为 “mark-and-sweep”。定期执行以下**“垃圾回收”步骤:**
- 垃圾收集器找到所有的根,并“标记”(记住)它们。
- 然后它遍历并“标记”来自它们的所有引用。
- 然后它遍历标记的对象并标记它们的引用。所有被遍历到的对象都会被记住,以免将来再次遍历到同一个对象
- ……如此操作,直到所有可达的(从根部)引用都被访问到。
- 没有被标记的对象都会被删除
javascriptInfo 垃圾回收机制
优化算法
- 分代收集:辈分越高,检查频次越低
- 增量收集:CMS垃圾回收机制,三色标记原理,分部分处理
- 闲时收集:如其名
对象方法中的this
- 谁调用指向谁
- 箭头函数上下文
对象的构造函数和操作符new
构造函数
**构造函数:**技术所就是常规的函数,但我们预定:
- 命名以大写字母开头
- 它们只能由
new
操作符来执行
new操作符
-
new
执行时的步骤:- 一个新的空对象被创建并分配给
this
- 函数体执行。通常它会修改
this
,为其添加新的属性 - 返回
this
的值
- 一个新的空对象被创建并分配给
// 过程类似于:
function User(name) {