JS高级程序设计(4-5章)-笔记

写在前面

本文记录的是我不熟悉或者我认为值得注意的地方,并非书上知识点的归纳数组


第4章 变量、做用域和内存问题

对象是按引用传递的(我理解的是传值其实传的是一个指针,该指针指向内存中的某个对象)。举例以下:安全

const a = {name: 'aaa'}
const b = a // 这时候a和b其实指向的是同一个对象
console.log(b.name)  // aaa
b.name = 'bbb'
console.log(b.name)  // bbb
console.log(a.name)  // bbb 在改变b时a也被改变了

对于简单的对象(属性的值都为基本数据类型),赋值时采用const b = {...a}或者const b = Object.assign({}, a)能够使得b中的对象是一个新对象函数

Lodash提供了cloneDeep()函数用于深拷贝优化

对象按引用传递是由于这样比较节约内存(毕竟多个对象其实只存了一份嘛),弊端就是容易引发不被但愿的变化。this


JS具备自动垃圾回收机制,开发人员不用关心内存使用问题,其原理是找出再也不继续使用的变量,释放其占用的内存指针

最经常使用的回收方式是标记清除,另外一个不太常见的是引用计数code

引用计数中,没法处理循环引用(对象a中包含指向b的指针,对象b中也包含指向a的指针),举例以下对象

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
}

能够经过在函数结尾断开引用来解决循环引用的问题,以下排序

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
    // 别的啥啥操做
    
    // 设为null便可
    a.obj = null
    b.obj = null
}

优化内存占用:无用的数据将其值设为null内存


第5章 引用类型

引用类型的值(对象)是引用类型的一个实例

新对象是new操做符后面跟一个构造函数来建立的


数组的sort()方法默认是按从小到大排序,会根据每一项的toString()方法获得的字符串进行排序。因为是比较的是字符串,在大多数状况下,排序结果不是咱们指望的(好比'10'<'5'),咱们须要本身去写一个排序函数传给sort()

数组的concat()能够接受多个参数,以下

const a = [1, 2]
const b = a.concat(3, [4, 5])
console.log(b) // [1, 2, 3, 4, 5]

数组的splice()用于在数组中插入一个或者多个值,以下

const a = [1, 4, 5]
a.splice(1, 0, 2, 3) // 接收的参数依次为 index,要删除的元素个数,要插入的元素们
console.log(a) // [1, 2, 3, 4, 5]

因此数组的splice()也可用于替换数组中的某些项,以下

const a = [1, 2, 3, 4, 5]
a.splice(1, 2, 22, 33)
console.log(a) // [1, 22, 33, 4, 5]

因为函数也是对象,因此函数名实际上是一个指向函数对象的指针

定义一个函数能够用函数声明 function funcName() {}或者函数表达式 const func = function() {}, 建议用函数表达式定义函数,好处是定义以后不可被修改,也不会存在函数声明提高

函数内部有两个特殊对象,argumentsthisarguments是一个类数组对象,包含着全部传入函数中的参数,this指向的是函数执行的环境对象


字符串的toLocaleLowerCase()是针对地区做了特殊处理的(不一样地区对于某些值的转换规则会有些不同),相对于toLowerCase()来讲更安全


完。

相关文章
相关标签/搜索