续上一次记录
1. 函数的闭包
- 经典情况
- 在函数内部也有一个函数
- 内函数仲用到了外函数的局部变量
- 外函数把内函数返回输出来了
- 优点:让局部变量不随原函数销毁而销毁,子函数会保存父作用域产生的变量,让数据一直活在内存中,根据实际运用来定
- 缺点:因为一直存在内存中,导致浪费内存,并且容易造成内存泄露,最好使用完后赋值null
- 案例:
function print(count) {
if (count) {
for(var n = 0; n < count; n++) {
setTimeout((function() {
var i = n + 1;
return function() {
console.log(i)
}
})(), (n + 1) * 1000)
}
}
}
2.自执行函数
- 一般配合闭包使用,为了得到闭包中的内容,也可以参考上述案例
3. new 关键字
1. this 指向当前函数的调用者
2. 构造函数首字母要大写
3. 将this指向使用了new关键字的变量,new会从内部新产生一个对象出来,而this指向这个变量
var newObj = new hello();
console.log(newObj);
new 就指向了newObj而不会指向window
可通过new 生成内部对象的方式来快速生成多个对象,将这种生成对象的方式叫做对象模板
4. 深浅拷贝
- 在使用引用数据类型时会触发深浅拷贝的问题
- 由于数据都是存储在内存当中的,如果对对象进行拷贝,js机制会默认直接将内存地址也拷贝到新的赋值变量身上,导致了浅拷贝的出现
笔者常用的深拷贝方法是
JSON.parse(JSON.stringify(obj))这样是最快的
- 这个方法有个弊端,就是这个api不能处理为空的情况,但是有些时候你不能知道你要处理的数据是否为空,不能说每个地方都加个if,影响代码质量
- 后期就用了loadsh插件里面的deep()方法
5. 回调函数
- 函数也可以作为另一个函数的参数,通过传参的形式,将函数的运用变得更加灵活
6. 精度计算
- 0.1+0.2 会触发精度丢失的问题(加减乘除)都会,通过num => str的方式进行计算,得出小数点的位数后再化郑相加,再计算回小数(这是兼容性最好的方案)
- 精度计算单纯靠乘除倍数转化的话也会出现精度问题,因此最好去掉小数点补零计算(不信的话拿给你们的测试,不用多久就啪啪打脸了)
字符串API
str.split(x)以x作为分隔符对字符串进行分割,转化为数组str.length输出字符串的字数str.indexOf(x)判断str内是否含有x,并返回所在位置,如果没有检索项x,则返回-1str.replace('x','a')匹配字符串中第一个匹配项x,并将该项替换成astr.replaceAll('x','a')匹配全部x,替换成a