一、let与const命令

不存在变量提升

1.For循环里面的变量不会泄露

2.块级作用域,并且允许在里面声明函数运行,es5是不行的,只能在最顶层声明函数,不能再判断语句等块里面申明函数

3.Let相当于var,但也有不同点,const声明的变量不可以在改变,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了,二者声明的变量都不可以再次声明赋值

4.对于let和const来说,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错

5.Es6有六种声明变量的方法:let、const、import、class等

6.从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

var a = 1;window.a // 1
let b = 1;window.b // undefined

 

二、变量的解构赋值

7.变量声明可以用解构赋值,注意左边和右边都采用数组的形式来声明,不然会报错,也可以指定默认值,也适用于对象(左边声明的变量可以多,但是右边赋值不能多余左边变量数,不然会报错)

let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4
// 报错
let [foo] = 1;
foo// 报错
也可以指定默认值,该处y的默认值为b
let [x, y = 'b'] = ['a']; // x='a', y='b'
let { foo, bar } = { foo: "aaa", bar: "bbb" };
9.解构赋值允许,等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。
({} = [true, false]);
({} = 'abc');
({} = []);
 
10.字符串也可以解构赋值
const  [a, b, c, d, e] = 'hello';
a // "h"b // "e"c // "l"d // "l"e // "o"
11.函数的参数也可以使用解构赋值。也可以使用默认值
function add([x, y]){
  return x + y;}
add([1, 2]); // 3
function move({x = 0, y = 0} = {}) {
  return [x, y];}
move({x: 3, y: 8}); // [3, 8]move({x: 3}); // [3, 0]move({}); // [0, 0]move(); // [0, 0]
12.圆括号问题,解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。ES6的规则是,只要有可能导致解构的歧义,就不得使用圆括号。
以下三种解构赋值不得使用圆括号:
(1)变量声明语句中,不能带有圆括号。
(2)函数参数中,模式不能带有圆括号。
(3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。
!!!可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
13.解构赋值的用途:
 (1)交换变量的值
   let x = 1;let y = 2;
   [x, y] = [y, x];
(2)从函数返回多个值(数组或者对象都可以返回)
(3)函数参数的定义
(4)提取JSON数据
let jsonData={
    id:43,
    name:'xiaoli',
    data:[1,2]
};
let {id,name,data:num}=jsonData;
console.log(id,name,num)//43 'xiaoli' [ 1, 2 ] 
 (5)函数参数的默认值
    jQuery.ajax = function (url, {
  async  = true,
  beforeSend = function () {},
  cache  = true,
  complete = function () {},
  crossDomain = false,
  global = true,
  // ... more config}) {
  // ... do stuff};
  (6)遍历Map结构,任何部署了Iterator接口的对象,都可以用for...of循环遍历
var map = new Map();
map.set('first','hello');
map.set('second','world');
for(let[key,value] of map){
    console.log(key+'-is-'+value)
}//first-is-hello
  second-is-world
(7)输入模块的指定方法
 
三、字符串的扩展:
14.字符串的扩展
15.ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历。
for (let codePoint of 'foo') {
  console.log(codePoint)}
// "f"// "o"// "o"
16.repeat方法返回一个新字符串,表示将原字符串重复n次。参数如果是小数,会被取整。
'x'.repeat(3) // "xxx"'hello'.repeat(2) // "hellohello"
17模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。
$('#list').html(`<ul>
  <li>first</li>
  <li>second</li></ul>
`.trim());
var x = 1;var y = 2;
 
`${x} + ${y} = ${x + y}`
// "1 + 2 = 3"
`${x} + ${y * 2} = ${x + y * 2}`

 

四、数组的扩展

18.Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。伪类数组包括(有长度的对象、arguments、以及那些document.getElementByXXXX获得的数组等)
19.Array.of方法用于将一组值,转换为数组。
Array.of(3, 11, 8) // [3,11,8]
 
五、函数的扩展
  1.函数的参数指定默认值,通常情况下,定义了默认值的参数,应该是函数的尾参数
function log(x, y = 'World') {
  console.log(x, y);}
2.ES6 引入 rest  参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了
function add(...values) {
  let sum = 0;
 
  for (var val of values) {
    sum  += val;
  }
 
  return sum;}
add(2, 5, 3) // 10

3.ES6允许使用“箭头”(=>)定义函数。如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。(尤其值得注意。函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,this对象的指向是可变的,但是在箭头函数中,它是固定的。)

var f = v => v;
相当于
var f = function(v) {
  return v;};
//代码块部分多余一条
var sum = (num1, num2) => { return num1 + num2; }

4.Object.assign方法用于对象的合并,实行的是浅拷贝,而不是深拷贝,也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用,对于这种嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加。

 用途:(1)为对象添加属性

(2)为对象添加方法

(3)克隆对象,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码

      (4)合并多个对象

(5)为属性指定默认值

5.ES6 一共有5种方法可以遍历对象的属性:

For...in;Object.keys(obj);Object.getOwnPropertyNames(obj)
 Object.getOwnPropertySymbols(obj);Reflect.ownKeys(obj);

六、Promise

七、是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。