读《JavaScript百炼成仙》感悟 记二

139 阅读2分钟

续上一次记录

1. 函数的闭包

  • 经典情况
    1. 在函数内部也有一个函数
    2. 内函数仲用到了外函数的局部变量
    3. 外函数把内函数返回输出来了
  • 优点:让局部变量不随原函数销毁而销毁,子函数会保存父作用域产生的变量,让数据一直活在内存中,根据实际运用来定
  • 缺点:因为一直存在内存中,导致浪费内存,并且容易造成内存泄露,最好使用完后赋值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. 深浅拷贝

  1. 在使用引用数据类型时会触发深浅拷贝的问题
  2. 由于数据都是存储在内存当中的,如果对对象进行拷贝,js机制会默认直接将内存地址也拷贝到新的赋值变量身上,导致了浅拷贝的出现

笔者常用的深拷贝方法是JSON.parse(JSON.stringify(obj))这样是最快的

  1. 这个方法有个弊端,就是这个api不能处理为空的情况,但是有些时候你不能知道你要处理的数据是否为空,不能说每个地方都加个if,影响代码质量
  2. 后期就用了loadsh插件里面的deep()方法

5. 回调函数

- 函数也可以作为另一个函数的参数,通过传参的形式,将函数的运用变得更加灵活

6. 精度计算

  • 0.1+0.2 会触发精度丢失的问题(加减乘除)都会,通过num => str的方式进行计算,得出小数点的位数后再化郑相加,再计算回小数(这是兼容性最好的方案)
  • 精度计算单纯靠乘除倍数转化的话也会出现精度问题,因此最好去掉小数点补零计算(不信的话拿给你们的测试,不用多久就啪啪打脸了)

字符串API

  • str.split(x) 以x作为分隔符对字符串进行分割,转化为数组
  • str.length 输出字符串的字数
  • str.indexOf(x) 判断str内是否含有x,并返回所在位置,如果没有检索项x,则返回-1
  • str.replace('x','a') 匹配字符串中第一个匹配项x,并将该项替换成a
  • str.replaceAll('x','a') 匹配全部x,替换成a