ES6基础学习

一、简介

ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。

ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。

二、 特性

1. let

新增加的声明变量的关键字,与var声明变量有以下不同

  • 声明的变量有严格局部作用域
1
2
3
4
5
6
   		{
            var a = 102;
            let b = 2;
        }
        console.log(a);  // 1
        console.log(b);  // ReferenceError: b is not defined
  • var 可以声明多次,let 只能声明一次
1
2
3
4
5
6
     	var m = 1
        var m = 2
        let n = 3
let n = 4
        console.log(m)  // 2
        console.log(n)  // Identifier 'n' has already been declared
  • var 会变量提升,let 不存在变量提升
1
2
3
4
  		console.log(x);  // undefined
        var x = 10;
        console.log(y);   //ReferenceError: y is not defined
        let y = 20;

2. const

  • 一但声明必须初始化,否则会报错
  • 声明之后不允许改变
1
2
   		const a = 1;
        a = 3//Uncaught TypeError: Assignment to constant variable.

3. 解构表达式

  • 数组解构

    可以直接将数组的元素依次赋值给其他变量

1
2
3
4
5
6
7
8
9
10
  let arr = [1,2,3];

//不需要像下面这样挨个赋值
// let a = arr[0];
// let b = arr[1];
// let c = arr[2];

let [a,b,c] = arr;

console.log(a,b,c) //1 2 3
  • 对象解构

    可以直接将对象的属性赋给其他变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const person = {
    name: "jack",
    age: 21,
    language: ['java', 'js', 'css']
    }

    // 不需要像下面这样挨个赋值
    // const name = person.name;
    // const age = person.age;
    //         const language = person.language;


    //对象解构
    //将name的值赋给abc
    const { name:abc, age, language } = person;

    console.log(abc, age, language)

4. 字符串

  • 字符串扩展

    字符串可以使用startsWith()endsWithincludes等函数

    1
    2
    3
    4
    5
    let str = "hello.vue";
    console.log(str.startsWith("hello"));//true
    console.log(str.endsWith(".vue"));//true
    console.log(str.includes("e"));//true
    console.log(str.includes("hello"));//true
  • 模板字符串

    模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    普通字符串:
    let string = `Hello'\n'world`;
    console.log(string);
    // "Hello'
    // 'world"

    多行字符串:
    let string1 = `Hey,
    can you stop angry now?`;
    console.log(string1);
    // Hey,
    // can you stop angry now?

    变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式:
    function fun() {
    return "这是一个函数"
    }

    let info = `我是${abc},今年${age + 10}了, 我想说: ${fun()}`;
    console.log(info);
    //我是jack,今年31了, 我想说: 这是一个函数

5. 函数优化

  • 参数默认值

    在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法;现在可以直接给参数写上默认值,没传就会自动使用默认值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法:
    function add(a, b) {
    // 判断b是否为空,为空就给默认值1
    b = b || 1;
    return a + b;
    }
    // 传一个参数
    console.log(add(10));


    //现在可以这么写:直接给参数写上默认值,没传就会自动使用默认值
    function add2(a, b = 1) {
    return a + b;
    }
    console.log(add2(20));
  • 不定参数

    1
    2
    3
    4
    5
    function fun(...values) {
    console.log(values.length)
    }
    fun(1, 2)      //2
    fun(1, 2, 3, 4)  //4
  • 箭头函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       var print = obj => console.log(obj);
    print("hello");


    //箭头函数+解构
    const person = {
    name: "jack",
    age: 21,
    language: ['java', 'js', 'css']
    }

    var hello2 = ({name}) => console.log("hello," +name);
    hello2(person);

6. 对象优化

  • 对象的新方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
         const person = {
    name: "jack",
    age: 21,
    language: ['java', 'js', 'css']
    }
    //key/values/entries方法
    console.log(Object.keys(person));//["name", "age", "language"]
    console.log(Object.values(person));//["jack", 21, Array(3)]
    console.log(Object.entries(person));//[Array(2), Array(2), Array(2)]

    const target = { a: 1 };
    const source1 = { b: 2 };
    const source2 = { c: 3 };

    //assign将源对象的所有可枚举属性复制到目标对象中。
    Object.assign(target, source1, source2);
    console.log(target); //{a:1,b:2,c:3}
  • 声明对象简写

    1
    2
    3
    4
    5
    6
    7
    8
    const age = 23
    const name = "张三"
    //原本声明对象
    const person1 = { age: age, name: name }

    //简写后(若属性名与常量名相同时才可以使用)
    const person2 = { age, name }
    console.log(person2);
  • 对象函数属性简写

    可以省略对象函数属性的声明,用箭头函数或者函数属性名代替函数声明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let person3 = {
    name: "jack",
    // 以前:
    eat: function (food) {
    console.log(this.name + "在吃" + food);
    },
    //箭头函数this不能使用,对象.属性
    eat2: food => console.log(person3.name + "在吃" + food),
    eat3(food) {
    console.log(this.name + "在吃" + food);
    }
    }
  • 对象扩展运算符

    可以用...object代表某个对象所有的属性进行操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 1、拷贝对象(深拷贝)
    let p1 = { name: "Amy", age: 15 }
    let someone = { ...p1 }
    console.log(someone)  //{name: "Amy", age: 15}

    // 2、合并对象
    let age1 = { age: 15 }
    let name1 = { name: "Amy" }
    let p2 = {name:"zhangsan"}
    p2 = { ...age1, ...name1 } 
    console.log(p2) //{age: 15, name: "Amy"}

7. map 和 reduce函数

  • map函数

    接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回。

    1
    2
    3
          let arr = ['1''20''-5''3'];
    arr = arr.map(item=> item*2);
    console.log(arr); //[2, 40, -10, 6]
  • reduce函数

    为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,

    arr.reduce(callback,[initialValue])

    callback函数可用四个参数

    1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
    
    2、currentValue (数组中当前被处理的元素)
    
    3、index (当前元素在数组中的索引)
    
    4、array (调用 reduce 的数组)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
          let arr =  [2, 40, -10, 6];
    let result = arr.reduce((a,b,index)=>{
    console.log("上一次处理后:"+a);
    console.log("当前正在处理:"+b);
    console.log(index);
    return a + b;
    },100);
    console.log(result)

    //控制台打印结果
    上一次处理后:100
    当前正在处理:2
    0
    上一次处理后:102
    当前正在处理:40
    1
    上一次处理后:142
    当前正在处理:-10
    2
    上一次处理后:132
    当前正在处理:6
    3

8. promise对象

当发送异步请求时,如果我们下一个异步请求需要用到上一个异步请求的结果,这个时候就会发生连续嵌套,非常混乱,而通过promise对象和then函数可以解决这一问题

原始的嵌套处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$.ajax({
url:"mock/user.json",
success:function(data){
console.log("查到数据"+data.id)
$.ajax({
url:`mock/user_corse_${data.id}.json`,
success:function(data){
console.log(data)
},
error:function(error){
console.log("出错。。"+error)
}
});
},
error:function(error){
console.log("出现异常"+error)
}
}
)

通过promise对象和then函数处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let p=new Promise((resolve,reject)=>{
$.ajax({
url:"mock/user.json",
success:function(data){
console.log("查到数据"+data);
resolve(data);
},
error:function(err){
reject(err);
}
})
});
p.then(obj=>{
$.ajax({
url:`mock/user_corse_${obj.id}.json`,
success:function(data){
console.log(data);
}
})
})

9. 模块化

模块导入导出各种类型的变量,如字符串,数值,函数,类。

  • 导出的函数声明与类声明必须要有名称(export default 命令另外考虑)。
  • 不仅能导出声明还能导出引用(例如函数)。
  • export 命令可以出现在模块的任何位置,但必需处于模块顶层。
  • import 命令会提升到整个模块的头部,首先执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*-----export [test.js]-----*/
let myName = "Tom";
let myAge = 20;
let myfn = function(){
return "My name is" + myName + "! I'm '" + myAge + "years old."
}
let myClass = class myClass {
static a = "yeah!";
}
export { myName, myAge, myfn, myClass }

/*-----import [xxx.js]-----*/
import { myName, myAge, myfn, myClass } from "./test.js";
console.log(myfn());// My name is Tom! I'm 20 years old.
console.log(myAge);// 20
console.log(myName);// Tom
console.log(myClass.a );// yeah!
#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×