复习常用ES6 -let const 数组 对象

基本信息(我只列举我用到过的ES6语法)

let const
首先最常见的就是我们的声明变量方式。以前我们都是用var声明的,会出现一些作用域问题。现在let和const有什么优势呢?
let: 声明一个可以改变的变量,其变量不可在声明第二次,并且只在它所在的代码块有效,且并不会发生变量提升。
const: 声明一个不可改变的常量,必须初始化变量值

注意:var 声明的变量是顶层变量(浏览器是window对象,node是global对象 )。let,const,class命令声明的全局变量,不属于顶层对象。

解构
ES6允许按照一定模式,从数组和对象中提取值,对我们来说,省了取值的过程代码。下面来看几个简单的列子

lelt a = 1;
let b = 2;
let [a,b] = [1,2];  // 可以从数组按照对应位置,对变量赋值;
let [a,b] = [1]; // 解构不成功,b变量等于undefined;
let [a,[b]] = [1,[2,3]] // 不完全解构,只取匹配一部分等号右边的数组 b=2;

我们有没有发现解构的都是可以遍历的(就具备Iterator接口)。所以解构规则只能用对某种具有Iterator接口数据结构。
还有常用的

// ...扩展运算符
let a = [1,2,3];
let b = [...a] // b = [1,2,3];
let c = {a: 123}
let d = {...c} // d={a:123}

字符串扩展
最让人称赞的应该都是它的模板字符串吧,以前拼接字符写 + ,现在只需要"${ 变量}"。大括号里面还能放入任意的JavaScript表达式进行运算。

函数扩展
以前定义函数参数是不能有默认值的,一般会在内部写判断类似下面这种

function(a) {
   a = a || '默认值';
   // 或者
   if(typeof a === 'undefined') {
      a = '默认值'
   }
}

而现在我们可以直接在函数参数哪里赋值

function(a = '默认值') {}
  • 函数的name属性返回的是函数的函数名称。
  • 允许使用箭头函数(=>)重点

箭头函数可以帮助我们简化回调函数
箭头函数的this对象,就是定义时锁在的对象,不是使用时所哎哎的对象
定义对象或内部需要 this的时候不建议用箭头函数

  • 尾调用优化
    什么是尾调用?简而言之就在函数的最后一步调用了另外一个函数。
// 尾调用
function f(x) {
    return g(x)
}
// 不满足尾调用
function f(x) {
    let y = g(x);
    return y; // 虽然和上边语义一样,但是有赋值过程,故不属于
}

看着尾调用,大家是不是突然想起了递归,递归不就是在函数内部调用自身吗。那么尾调用自身,就成为尾递归。我们来典型的看一下阶乘函数

function factorial(n) {
  if(n === 1) return 1;
  return n * factorial(n-1)
}
factorial(5) // 120 复杂度O(n) n个调用记录

function factorial(n, total) {
 if (n === 1) return total;
 return factorial(n - 1, n * total);
}
factorial(5, 1)  //120 此时复杂度为O(1) 因为此时只有一个调用记录

函数柯里化就是将多参数的函数转为单参数的函数。这个就不在这里讨论了

数组的扩展
这个前面解构提到了(...),在这里数组用扩展运算符将会转为用逗号分隔的参数序列,替代了apply方法

function f(x, y, z) {
  // ...
}
// ES5
var args = [0, 1, 2];
f.apply(null, args);
// ES6
let args = [0, 1, 2];
f(...args);
console.log(...[1,2,3]) // 1 2 3
console.log([...[],1]) // 扩展运算符后是空数组,不产生任何效果

(...)主要用于函数调用,传递的是数组参数,会转化为参数序列
还有比如数组的合并,复制(注意都是浅拷贝)

const arr1 = [1,2,3]
const  arr2 = [4,,5,6]
const arr3 = [...arr1] // 复制数组
const [...arr4] = arr1 // 复制数组
const arr5 = arr1.push(...arr2) // 合并数组
const arr6 = [...arr1,arr2] // 合并数组

Arrat.from()方法用于将类对象转为真的数组。
Array.of()用于将一组值,转换为数组。
// 去除数组的重复成员
[...new Set(array)]

对象扩展
好吧,其实很少用,除了循环key,value,常用的就是对象的合并Object.assign(obj1,obj2)

你可能感兴趣的:(复习常用ES6 -let const 数组 对象)