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

一,数值

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,所以尽量不要留空位

 

es6重点笔记:数值,函数和数组的更多相关文章

  1. ES6学习笔记(六)数组的扩展

    1.扩展运算符 1.1含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // ...

  2. es6重点笔记:Symbol,Set,Map,Proxy,Reflect

    一,Symbol 原始数据类型,不是对象,它是JavaScript第七种数据类型,表示独一无二的值.Symbol是通过Symbol函数生成的: let s = Symbol(); typeof s / ...

  3. es6重点笔记:let,const

    一,let 先看代码: var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i) }; } a ...

  4. es6学习笔记-async函数

    1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...

  5. ES6学习笔记(函数)

    1.函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') { console.log(x, y); } log(' ...

  6. ES6 学习笔记之三 函数参数默认值

    定义函数时为参数指定默认值的能力,是现代动态编程语言的标配.在ES6出现之前,JavaScript是没有这种能力的,框架为了实现参数默认值,用了很多技巧. ES6 的默认参数值功能,与其他语言的语法类 ...

  7. ES6系列_8之函数和数组

    1.对象的函数解构 ES6为我们提供了这样的解构赋值使在前后端分离时,后端返回来JSON格式的数据,前端可以直接把这个JSON格式数据当作参数,传递到函数内部进行处理.比如: let json = { ...

  8. ES6重点--笔记(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  9. ES6入门教程---数值扩展和数组扩展

    1.数值扩展 var num = 0b11; console.log(num);3 var num = 0o11;console.log(num);9 var num = 1.234; console ...

随机推荐

  1. 浅析Python解释器的设计

    从现代编译器的角度看,解释器和编译器的边界已经相当的模糊.我们后面的讨论说到的编译器就是Python的解释器,没有特别说明的指的是CPython的实现. 内存管理(Memory Management) ...

  2. jBPM学习之部署流程定义

    也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...

  3. 骗子网站,X毛都没有,骗我九十九

    前言 这几天在A市和B市奔波着,眼瞅着自己就要毕业了,必须得出来找份工作了. 和小伙伴在A市兜兜转转了几天,要不就是不合适没下文,要不就是给了offer,工资是在太低.心很累,然后就下B市了,看看B市 ...

  4. 【转】NO.3、python+appium+ios,遍历真机元素,得到webview

    pyhton+appium+iOS,遍历真机webview.是遍历真机的webview,遍历模拟器的webview请另寻方法. 1.mac上安装ios_webkit_debug_proxy 命令:br ...

  5. Android异常分析(转)

    关于异常 异常? 异常就是一种程序中没有预料到的问题,既然是没有预料到的,就可能不在原有逻辑处理范围内,脱离了代码控制,软件可能会出现各种奇怪的现象.比如:android系统常见异常现象有应用无响应. ...

  6. 牛客网linux试题-错误整理-20171013

    创建对象时,对象的内存和指向对象的指针分别分配在:堆区,栈区 堆内存用来存放由new创建的对象和数组,在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在 ...

  7. HTML基础知识(表格、表单)

    6.表格 l  概念:表格一定具有行和列 注:使用<thead><tbody><tfoot>,使浏览器能独立于表格表头和表格页脚的表格主体滚动.当包含多个页面的表格 ...

  8. Erlang内存吃紧之解决思路

    首先使用erlang:memory()确定是哪个部分内存吃紧,根据输出的内容,比对内存占用大小,有针对性地进行分析.在erlang系统里内存的单位为word,通过erlang:system_info( ...

  9. visual core 运行 .net core bug处理

    launch: program 'launch: launch.json must be configured. Change 'program' to the path to the executa ...

  10. 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路

    这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...