• es6重点笔记:数值,函数和数组


    本篇全是重点,捡常用的怼,数值的扩展比较少,所以和函数放一起:

    一,数值

    1,Number.EPSILON:用来检测浮点数的计算,如果误差小于这个,就无误

    2,Math.trunc():取整,去除小数部分,如果是-0.123,去除之后会留下-0,这个要注意

    其他感觉用的都不多,就这两个。

    二,函数:

    1,es6引入了rest参数:...变量名,它跟arguments的区别,它是真正的数组

    2,箭头函数:

    函数体内的this对象就是定义时所在的对象,不是使用时所在的对象;

    不可以当做构造函数,即不可以使用new

    不可以使用arguments对象,在函数体内不存在,如果要用,可以用rest参数

    不可以使用yield命令,不能用作Generator函数。

    3,尾调用

    指某个函数的最后一步调用另一个函数,注意,这里是只return一个函数,而不是什么表达式之类的

    function f(x) {
        return g(x);
    }  

    尾调用优化:

    函数在调用的时候会形成一个“调用帧”,在内存中形成一个“调用记录”,保存调用位置和内部变量,如果此时在函数A中再调一个函数B,那么在A的调用帧的上方就会形成一个B的调用帧,只有当B函数执行结束返回到A的时候,B的调用帧才会消失,也就是说当B在执行的时候,只要B函数的下方还有程序要执行,A的调用帧就一直占用着,因为要等B执行完成后继续执行,同样,如果此时B里面还有一个函数C,那么执行函数C的时候,B的调用帧也要被占着,A的也是,那这样内存就会有很大的损耗,形成了一个“调用栈”。

    如果函数B是函数A的最后一步调用呢,那么执行函数B的时候,A的调用帧就会自动消失,因为B就是它的最后一步,函数A不需要再记录它的调用位置和内部变量了,所以只留下了B函数的调用帧,同样,如果C函数也是B函数的最后一步,那么调用C函数的时候,B函数的调用帧也会消失,原因同上,所以这极大地减少了内存的占用。

    综上:“尾调用优化”本质就是只保留内层函数的调用帧,每次执行函数的时候调用帧只有一个,大大节省内存。

    比如递归的时候,非常消耗内存,因为需要同时保存着N多个调用帧,所以很容易发生“栈溢出”的错误。但如果改成“尾递归”,调用帧只有一个,所以不会发生“栈溢出”的问题。

    function factorial(n) {
       if (n===1) return 1;
       return n * fatorial(n-1); 
    }
    
    // n如果过大就容易栈溢出,现在改成尾递归
    
    function factorial(n, total) {
       if (n===1) return total;
       return factorial(n-1, n*total);
    }
    
    // 调用帧永远只有一个,极大减少内存占用
    

     三,数组

    1,扩展运算符:三个点(...),就是rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。

    2,Array.from():用于将两类对象转换成数组,类数组对象(比如NodeList和arguments)和可遍历对象(Iterator Object),它还可以接受第二个参数,作用类似于map,对数组的每一项进行操作,然后将结果返回到数组。

    3,Array.of():用于将一组值转换成数组,括号里面传的参数组成的数组,哪怕只有一个数,也是一个元素的数组,在es5里面,Array方法如果只传一个数字,默认就是数组的长度,但是Array.of()不一样,传一个数字就表示一个数字的数组。

    4,find():找出第一个符合条件的数组成员,参数是回调函数,这里非常容易写成元素,要注意写条件,没有则返回undefined,用法如下:

    [1, 4, -5, 10].find((n) => n<0)
    
    // -5
    
    [1, 5, 10, 15].find(function(value, index, arr) {
         return value > 9
    })
    
    // 10
    

      

    5,findIndex():找出第一个符合条件的数组成员的位置,参数也是回调函数,没有则返回-1,用法同上

    (所以如果要使用数组查找某个元素是否存在,还是用es7的includes()比较好,但是要注意使用babel的transform-runtime这个plugin)

    6,数组实例的entries(),keys(),values():

    返回的都是一个Iterator Object,也就是说可以用iterator object.next().value来依次访问,

    entries是对键值对的遍历,keys是对键的遍历,values是对值的遍历,

    注意,不要和Object的三个同名方法搞混了,那个是es7的!

    7,数组实例的includes(),(这里我写错地方了,这个是es7的)

    数组是否包含某个元素,有就返回true,没有就false,可以传NaN来检测NaN。es5的indexOf无法检测NaN

    8,数组的空位

    es5对数组的空位处理:

      forEach,filter,every,some都会跳过空位,

      map会跳过空位,但是会保留这个值,

      join和toString会将空位设为undefined,而undefined和null会被处理成字符串

    es6则是明确将空位转为undefined,所以尽量不要留空位

     

  • 相关阅读:
    Uva(10129)+Uva(10054)
    Uva 10004(二分图的判定)
    flume系列之—flume ng使用demo
    目前可选的开源日志收集项目
    flume系列之一flume简介
    Objective-C之null NaN undefined
    Objective-C之category
    Objective-C协议与非正式协议
    Objective-C学习笔记_命令行参数获取
    Objective-C学习笔记_Xcode模拟命令行填入参数执行
  • 原文地址:https://www.cnblogs.com/yanchenyu/p/7884284.html
Copyright © 2020-2023  润新知