美文网首页
ECMAScript 6

ECMAScript 6

作者: 昊啊昊儿哟 | 来源:发表于2018-08-17 20:18 被阅读11次

严格模式

  • use strict
// 变量:
//  1)声明
//  2)赋值
// a = "123";
// console.log(a);

// 进入严格模式的标识
'use strict';
var a = '123';
console.log(a);

声明一个变量(let)

  • let 申明的变量不存在变量提升
  • let 申明的变量不允许重复声明
  • let 申明的变量存在块级作用域
    • 可以用来解决闭包问题
var a = "123";
console.log(a); // 123

let b = "abc";
console.log(b); // abc

//let不存在变量提升:
// console.log(a); // undefined
// var a = 123;
// console.log(a); // 123
// 等同于
var a;
console.log(a);
a = 123;
console.log(a);
console.log(a);
let a = 123;
console.log(a);

// let 不允许重复声明
var a = 123;
var a = 456;
console.log(a);
let a = 123;
let a = 456;
console.log(a);

//let 存在块级作用域
//块级作用域:来自于后台
 //特点:凡是大括号包裹的部分都是一个单独的作用域,我们把这个作用域叫做块级作用域, 块级作用域之间不会相互影响

申明一个常量 (const)

  • contst申明的常量:一旦设置无法修改
    • 可以改变对象中的属性
  • contst申明的常量:一旦设置不可重复声明
// const a = 123;
// a = 456;
// console.log(a);
// 值类型(简单类型)
//  简单类型的常量一旦设置无法修改
// 引用类型(复杂类型)
//  一旦赋值只要不是改变引用还是可以修改的
const obj = {
    name: "张三"   
}
// 修改引用类型的引用地址
// obj = {};// 如果修改引用地址会报错
obj.name = "李四";// 修改的是地址中对应对象的属性:

console.log(obj);

字符串的一些扩展方法的使用

  • includes() :返回布尔值,表示是否找到了参数字符串
  • startsWith() :返回布尔值,表示是否找到了参数字符串
  • endsWith() :返回布尔值,表示参数字符串是否在源字符串的尾部
  • repeat():返回一个新字符串,表示将原字符串重复n次
var s = “hello world”;
s.startsWith(‘hello’) //true
s.startsWith(‘world’,6) //true   ,表示从第6个开始后面的字符是 world
s.endWith(‘hello’,5) //true ,表示前5个字符是hello
‘x’.repeat(2)  // “xx”
‘hello’.repeat(2)  // “hellohello”
‘ivan’.repeat(0)  // “”

模板字符串

  • 使用“`”来定义模板字符串
  • 在模板字符串中可以保持变量的结构
  • 在模板字符串中可以直接使用js代码格式:${ code }
// 模板字符串:
//  1.0 拼接字符:输出变量
// var a = `<ul><li> ${obj.name} </li><li> ${obj.age} </li></ul>`;
// console.log(a);
//  2.0 识别换行
var a = `<ul>
    <li>${obj.name}</li> 
    <li>${obj.age}</li>
</ul>`;
console.log(a);

解构赋值

  • 字符串的解构赋值
  • 字符的解构是按照顺序解构的
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
对象解构
  • 对象的解构是按照属性名来解构的
var obj = {
  name: '张三',
  age: 18
}
var {name, age} = obj;
name // 张三
age  // 18
  • 无顺序问题
数组的解构
  • 有顺序问题
  • 被赋值的变量和数组中的元素个数可以不相等
var arr = ['a','b','c']
var [x,y,z] = arr;
x // 'a'
y // 'b'
z // 'c'
解构赋值的其它特点
  • 可以指定默认值
  • 解构出来的元素不一定要与前面的对象一一对应
  • 可以给解构出来的元素设置别名

箭头函数的推演

写法1: arr.sort(function(x,y){return x - y ;});
写法2:arr.sort((x,y) => {return x - y ;});
写法3:arr.sort((x,y) => x - y);
箭头函数的其它写法
如果参数只有一个,可以将()省略    // arr.map(c=>c+1);
如果没有参数,则一定能要写上()     // ()=> console.log(‘a’)
如果多于一个参数,每个参数之间用逗号分隔   (x, y) => { ... }
如果方法体只有一句代码,可以省略{} 和分号,如果有返回可以省略return
如果方法体多于一句代码,则不能省略{} ,每句代码使用 分号分隔
const fs = require('fs');
// 匿名函数 
// fs.readFile('./01严格模式.js', function(err, data){
//     console.log(data);
// });

// 箭头函数 
fs.readFile('./01严格模式.js', (err, data) => {
    console.log(data.toString());
});
箭头函数的一些特点

a.箭头函数没有自己的this,函数体内部写的this,指向的是外层代码块的this
b.箭头函数内部的this是定义时所在的对象,而不是使用时所在的对象并且不会改变
c.箭头箭头函数不能用作构造函数
d.箭头函数内部不存在arguments,箭头函数体中使用的arguments其实指向的是外层函数的arguments

// 箭头函数
var fn = function () {
    // 将所有的传入的实参打印出来
    console.log('-----fn-------');
    console.log(arguments);
    console.log('-----fn-------');
    return  () => {
        console.log('-----fn1-------');
        console.log(arguments);
        console.log('-----fn1-------');
    }
}
var fn1 = fn(1,2,3,4,5,6,7,8,9,0);
fn1(1,2,3,4,5);

对象中属性的简写

var name = '李冰冰';
var age = 20;
//ES6之前
var obj = {
    name: name,
    age: age
}
//ES6之后
var obj = {
    name,
    age
}
console.log(obj.name, obj.age);

es5中对象:{add:add,substrict:substrict}
es6中对象: {add,substrict} 注意这种写法的属性名称和值变量是同一个名称才可以简写,否则要想es5那样的写法,例如: {addFun:add}

对象中的方法的简写

// + 9.0 对象中方法的简写
// ES6之前
// var obj = {
//     name,
//     age,
//     sayHi: function(){
//         console.log(`大家好,我叫${this.name}, 今年${this.age}岁了`);
//     }
// }
// ES6之后
var obj = {
    name,
    age,
    sayHi(){
        console.log(`大家好,我叫${this.name}, 今年${this.age}岁了`);
    }
}
obj.sayHi();

es5中对象: {add:function(){},substrict:function(){}}
es6中对象: {add(){},substrict(){}}

promise

  • 来由:ES6之前是没有promise的,这个玩意是由前端社区提出,在ES6中成为一个标准
  • 作用:它是用来简化回调函数的多层嵌套
  • 使用:
//下面这段代码被称为回调地狱
// 需求:依次将三个文件中的内容读取出来并且输出: 0 ~ 1 ~ 2
var fs = require('fs');
// 读取0文件
fs.readFile('./file/0.txt', function (err0, data0) {
    if (err0) {
        return console.log(err0.message);
    }
    console.log(data0.toString());
    // 读取1文件
    fs.readFile('./file/1.txt', function (err1, data1) {
        if (err1) {
            return console.log(err1.message);
        }
        console.log(data1.toString());
        // 读取2文件
        fs.readFile('./file/2.txt', function (err2, data2) {                                                              
            if (err2) {
                return console.log(err2.message);
            }
            console.log(data2.toString());
        });
    });
});
// 代码:回调地狱

使用promise解决回调地狱

// 需求:依次将三个文件中的内容读取出来并且输出: 0 ~ 1 ~ 2
// 可以使用promise来解决
var fs = require('fs');
// 读取0文件
var p0 = new Promise(function(resolve, reject){
    fs.readFile('./file/0.txt', function(err, data){
        if (err) {
            reject(err);
        } else {
            resolve(data.toString());
        }
    });
});
// 读取1文件
var p1 = new Promise(function(resolve, reject){
    fs.readFile('./file/1.txt', function(err, data){
        if (err) {
            reject(err);
        } else {
            resolve(data.toString());
        }
    });
});
// 读取2文件
var p2 = new Promise(function(resolve, reject){
    fs.readFile('./file/2.txt', function(err, data){
        if (err) {
            reject(err);
        } else {
            resolve(data.toString());
        }
    });
});
// 读完0以后再读取1,再读取2
p0
    .then(data0 => {
        console.log(data0);
        return p1;
    })
    .then(data1 => {
        console.log(data1);
        return p2;
    })
    .then(data2 => {
        console.log(data2);
    })

封装promise对象解决回调地狱

// 将创建promise的代码进行封装
var fs = require('fs');
function getPromise(path) {
    return new Promise((resolve,reject) => {
        fs.readFile(path, function(err, data){
            if(err) {
                reject(err);
            } else {
                resolve(data.toString());
            }
        });
    });
}
// 先读取0文件
getPromise('./file/0.txt')
    .then( data0 => {
        console.log(data0);
        // 再读取1文件
        return getPromise('./file/3.txt');
    })
    .then( data1 => {
        console.log(data1);
        // 再读取2
        return getPromise('./file/2.txt');
    })
    .then( data2 => {
        console.log(data2);
    })
    .catch( err => {
        console.log(err.message);
        console.log('err');
    })

相关文章

网友评论

      本文标题:ECMAScript 6

      本文链接:https://www.haomeiwen.com/subject/eafzbftx.html