美文网首页
🍭ES6学习之路

🍭ES6学习之路

作者: 索隆萨克 | 来源:发表于2019-03-31 21:26 被阅读0次

0. ECMAScript 6 简介

  • ECMAScript 6.0?
    ES6是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
    在ES6之前,js只有全局作用域和函数作用域,ES6中let关键字为其引入了块级作用域。
  • ECMAScript 和 JavaScript 的关系?
    ECMAScript 和 JavaScript 的关系:前者是后者的语法规格,后者是前者的一种实现.
    我把JavaScript近似等同于ECMAScript(ES), 而ES6 = ES5 + 新特性,所以ES6和ES5都相当于JavaScript。

1. 块级作用域的引入

{
var a = 5;
let  b = 6;
}
console.log(a);     //5
console.log(b);     //b is undefined

let声明的变量只能在其所在的代码块内才能访问,var声明的变量由于是全局变量,因此可以在代码块外访问

2. 暂时性死区

var声明的变量可以在声明之前使用,相当于默认为其声明其值为undefined了;

但是,let声明的变量一旦用let声明,那么在声明之前,此变量都是不可用的,术语称为“暂时性死区”。

console.log(a);                     //undefined
var a=8;
console.log("----------");
console.log(b);                     //控制台报错
let b=9;

所以我们要养成变量先声明再使用的好习惯。

3. const命令

const用来定义常量,相当于java中的final关键字。

并且const声明常量之后就必须立即初始化!

4. 解构赋值

let [a,b,c] = [1,2,3];
let{x1,x2} = {x2:5,x1:6};
const [a,b,c,d,e]= "hello";
let {data} = await http.post(url,params);
function  add([i,j]) {}---add([5,6]);

可以理解为“模式匹配”

5.模板字符串

// 普通字符串
`In JavaScript '\n' is a line-feed.`

// 多行字符串
`In JavaScript this is
 not legal.`

console.log(`string text line 1
string text line 2`);

// 字符串中嵌入变量
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

${主体},其中主体可以是表达式、运算、对象属性还可以是函数,若是字符串将直接输出该字符串。

6. 含参函数的调用

function say(something){
    console.log("she say"+" '"+something+"'" );
}
say`hello`;                             //she say 'hello'

7.数值拓展

ES6也为数值类对象例如Number、Math添加了新的方法以及属性(常量)

    // 检查是不是有限的 (-2^53,2^53)
    console.log(Number.isFinite(1)) // true
    console.log(Number.isFinite(NaN)) // false
    console.log(Number.isFinite(1/0)) // false
   
     // 检查是不是NaN
    console.log(Number.isNaN(NaN)) // true
    console.log(Number.isNaN(0)) // false
   // 检查是不是整数
    console.log(Number.isInteger(1)) //true
    // 这要注意
    console.log(Number.isInteger(1.0)) //true
    
    console.log(Number.isInteger(1.1)) //false
    console.log(Number.isInteger('1')) //false
   // 最大和最小安全数值
    console.log(Number.MAX_SAFE_INTEGER)
    console.log(Number.MIN_SAFE_INTEGER)
    
    console.log(Number.isSafeIntger(1)) //true
  // 取整
    console.log(Math.trunc(1.1)) //1
    console.log(Math.trunc(1.9)) //1
    //判断一个数到底是正数、负数、还是零
    console.log(Math.sign(-2)) //-1
    console.log(Math.sign(0)) // 0
    console.log(Math.sign(2)) // 1
    console.log(Math.sign('2')) // 1
    console.log(Math.sign('aa')) // NaN

8. 函数function

function show(name="jack",sex="boy"){
    console.log(name+" is a "+sex+"!");
}
show();                                  //jack is a boy!
show('judy');                            //judy is a boy!
show('judy','girl');                     //judy is a girl!

为函数的参数添加默认值,执行函数时如果不传该参数,那么就用默认值代替。
箭头函数:

var f = v => v;
//等同于
var f = function(v) {
  return v;
};

var f = () => 5;
// 等同于
var f = function () { return 5 };

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
  return num1 + num2;
};

注意:如果return的是一个对象{id:id,age:age},那么箭头右边要用括号包起来().

9. 数组的扩展

扩展运算符为三个点(...),将一个数组转化为参数序列,通常与函数一起使用,show(...['judy','girl'])。

数组合并:[...arr1,...arr2,...arr3]

字符串转字符数组:[..."hello"]--------------["h","e","l","l","o"]

将实现Iterator接口的对象转化为真正的数组:[...nodelist],这里的nodelist是一个类似于数组的nodelist对象
Generator 函数:该函数执行后返回一个遍历器对象,拓展运算符也可将其转化为数组。

let a =function*(){
    yield 3;
    yield 4;
    yield 5;
    return 6;
};
console.log([...a()]); 

只有执行a().next(),函数内部的语句才会执行一次,每调用一次next()函数执行一次内部函数.
next()函数有一个可选参数,用来表示上一次yield表达式值。
e.g:

function* foo(x) {
  var y = 2 * (yield (x + 1));
  var z = yield (y / 3);
  return (x + y + z);
}

var b = foo(5);
b.next()                   // { value:6, done:false }
b.next(12)                 // { value:8, done:false }
b.next(13)                 // { value:42, done:true }

解析:
第一次next(),x=5,那么yield(x+1)=6---{value:6,done:false}
第二次next(12),令yield(x+1)=12,那么y=24,输出yield(y/3)=8---{value:8,done:false}
第三次next(13),令yield(y/3)=13,前面yield(x+1)=12,那么最终z=13,y=24,x=5,return (x+y+z)=42---{value:42,done:true}

10. 数组的方法

Array.from(对象,对新数组各项的改动规则)
这里的对象只适合①类数组对象②实现Iterator接口的对象;后面的规则可选
e.g:
Array.from([1, 2, 3], (x) => x * x) //这里将数组每项按一定规则改变生成新数组[1,4,9]

Array.of(数据1,数据2,数据3)
将一组数据转化为数组
e.g:
Array.of(1,2,3,4,5) //[1,2,3,4,5]
find(规则)、findIndex(规则)

这里的规则是一个回调函数,找到了就返回这个数组项/索引,找不到返回undefined/-1
e.g:
[9,8,7,6,5,4,3].find(n=>n<5) //返回4

还可以添加第二个参数,如下

function f(v){
    return v > this.age;
}
let  c =function(v){
    return v > this.age;
}
let person = {name: 'John', age: 20};
let a  =[10, 12, 26, 15].find(c, person);            //c、f都可以  
console.log(a);

for...of遍历数组的键、值、以及各项键值对信息

for (let index of ['a', 'b'].keys()) {
    console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
    console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
    console.log(index, elem);
}
// 0 "a"
// 1 "b"

11. 对象的拓展

对象里面可以直接写入变量和函数

//before:
var person = {
    name:'eco',
    age:18,
    say:function(something){
        console.log("hello "+something);
    }
};
person.say('world');

//now:
var firstname='jack';
var man = {
    firstname,
    say(something){
        console.log(this.firstname);
        console.log("hello "+something);
    }
};
man.say('world');

Object.is(值1,值2)用于比较两个值是否相等,返回布尔值

Object.assign(targetobject,sourceobject1,sourceobject2)

Object.assign([],old,new); // 返回一个合并后的对象

用于对象的合并,将源对象合并到目标对象,若有相同属性源对象属性覆盖目标对象属性
如果源对象是其他数据类型,只有字符串会以字符数组形式拷到目标对象,其他类型不会有效果。

const v1 = 'abc';
const v2 = true;
const v3 = 10;

const obj = Object.assign({}, v1, v2, v3);
console.log(obj);           // { "0": "a", "1": "b", "2": "c" }

12. Set和Map数据结构

  • Set:成员不重复的类数组结构

Set属性:size---返回成员总数

Set操作方法:add(value)---返回Set、delete(value)---返回布尔、has(value)---返回布尔、clear()---无返回值

Set遍历方法:keys()---返回键(索引)的遍历器、values()---返回值的遍历器、
WeakSet:类似于Set,只是它的成员只能是对象,没有size,不能遍历

  • Map:广义上的键值对集合,键的范围不局限于字符串,对象也可以当作键
    Map操作方法:set(key,value)---设置成员、get(key)---读取指定键的值,若无返回undefined
const set = new Set([1, 2, 3, 4, 4]);
//[...set]---[1,2,3,4]

const map = new Map([
    ['name', '张三'],
    ['title', 'Author']
]);

13.类

// Before
// define a class
function Cat(name,color){
            return {
                name:name,
                color:color
            }
        }

var cat1 = Cat('big','yellow');
var cat2 = Cat('small','black');

console.log(cat1.name +' '+cat1.color);
console.log(cat2.name+' '+cat2.color);

ES6之前的类继承

// 利用空对象做中介

function Animal(){}

Animal.prototype.species = 'Animal';

function Cat(name,color){
    this.name = name;
    this.color = color;
}

// 封装继承函数
function extend(Child,Parent){
    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    // 备用性质
    Child.uber = Parent.prototype;
    // 等于在子对象上打开一条通道,可以直接调用父对象的方法,这一行放在这里,只是为了实现继承的完整性
}

extend(Cat,Animal);

var cat = new Cat('big','red');

console.log(cat.species);
console.log(Cat.prototype.constructor == Cat);
console.log(Animal.prototype.constructor == Animal);



ES6中的类

// Now
class Point {
   constructor(x, y) {
       this.x = x;
       this.y = y;
   }

   toString() {
       return '(' + this.x + ', ' + this.y + ')';
   }
}
var a = new Point(1,2);
console.log(a.x);                      //1
console.log(a.toString());             //(1,2)

继承:extends关键字

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y);                                // 调用父类的constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}

继承了父类的所有属性,也可以添加或者修改属性

14.模块化

//lib.js
var counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};
// main.js
var mod = require('./lib');

console.log(mod.counter);  // 3
mod.incCounter();
console.log(mod.counter);  // 3

15.Promise---异步

先来看ajax的异步:

$(function(){
    $('#send').click(function(){
         $.ajax({
             type: "GET",
             url: "test.json",
             data: {username:$("#username").val(), content:$("#content").val()},
             dataType: "json",
             success: function(data){
                         $('#resText').empty();   //清空resText里面的所有内容
                         var html = ''; 
                         $.each(data, function(commentIndex, comment){
                               html += '<div class="comment"><h6>' + comment['username']
                                         + ':</h6><p class="para"' + comment['content']
                                         + '</p></div>';
                         });
                         $('#resText').html(html);
                      }
         });
    });
});

上面的例子实现了一个类似于表单提交的功能。
Promise的异步:

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');                        //实例化后立即执行
  resolve();                                     //任务(成功)完成
});

promise.then(function() {
  console.log('resolved.');                      //任务结束执行
});

console.log('Hi!');                              //在实例化promise的同时,执行

显示顺序:"Promise"---"Hi"---"resolved"

可以看出,在promise执行的整个过程中(实例化到结束),并没有阻塞其他外部语句的执行,换句话说,其他语句

不用等到输出"resolved"之后再执行。

function loadImageAsync(url) {
  return new Promise(function(resolve, reject) {
    const image = new Image();

    image.onload = function() {
      resolve(image);                        //promise对象状态变为resolved
    };

    image.onerror = function() {
      reject(new Error('Could not load image at ' + url));
    };                                       //promise对象状态变为rejected并抛出错误

    image.src = url;
  });
}

注意:上面状态改变时传入函数的参数(image、new Error),会传到之后then函数,作为then函数的参数的参数!!!

loadImageAsync(url).then(function(success){
  console.log(success);
} ,function(error){
  console.log(error);
});

这里的success接收来自resolved状态的参数image,error接收来自rejected状态的参数new Error。

事实上then后面还可以加上一个catch函数用来捕捉rejected状态产生的错误,这样就可以省略掉then函数里面的第二个参数

promise.then(success()).catch(error()).finally(function(){});

16.async函数

async就表示asynchronous(异步的),async函数会返回一个Promise对象,自然能够调用其方法:
promise.then(success()).catch(error()).finally(function(){});

async function getStockPriceByName(name) {
    const symbol = await getStockSymbol(name);
    const stockPrice = await getStockPrice(symbol);
    return stockPrice;             //stockPrice是一个promise对象
}

getStockPriceByName('goog').then(function (result) {
    console.log(result);
});

可以看出,它和一般函数没多大区别,只是多了一个async标识。
注意:上面所说到的返回一个对象,这个对象本身没什么特别,只是他可以作为promise对象,在调用then方法的时候作为参数传
到函数里面。而且因为这个对象会被当做promisi对象,return关键字可以替换成await。
Async/await学习-luckyzv

17.Vue 与 ES6

  • Vue是什么?

Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架。

  • Vue + ES6?
    模块化开发

相关文章

  • 2018-07-24

    日常打卡,今日学习呀学习....怎么说呢,ES6乃至JS,学习之路漫长呀呀呀. 字符串的扩展includes('s...

  • 🍭ES6学习之路

    0. ECMAScript 6 简介 ECMAScript 6.0?ES6是 JavaScript 语言的下一代标...

  • 看iOS的 Node.js 进阶之路 之 ECMAScript(

    看iOS的 Node.js 进阶之路 之 ECMAScript(ES6) 篇 @author Jou Email ...

  • es6学习

    学习es6

  • 【一起来烧脑】入门ES6体系

    为什么要学习ES6掌握ES3、ES5、ES6的联系和区别 快速入门ES6 学会快速构建ES6的编译环境 学习ES6...

  • Qt5学习地址

    Qt 学习之路 2(1):序(Qt 学习之路 2(1):序) Qt 学习之路 2(2):Qt 简介(Qt 学习之路...

  • ES6

    ES6 主要学习来自 学习资源另外如果用webstorm的同学记得把javascript设置可支持es6,具体的话...

  • ES6,记录的20多问题,你都会吗?

    一、问:ES6是什么,为什么要学习它,不学习ES6会怎么样? 答: ES6是新一代的JS语言标准,对分JS语言核...

  • ES6重要吗?为什么要学习ES6?

    ES6 的全称 ECMAScript 1. ES6 使用频率比较高的特性 2. 学习 ES6 的步骤 3. 对比 ...

  • [总结]ES6 Array

    学习es6时做得小笔记

网友评论

      本文标题:🍭ES6学习之路

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