ES6基础

变量

1. 变量和常量

let r = 2;
r = 4;
console.log(r)  // 4

// 常量不可修改
const pi = 3.1415926
pi = 10   //  Identifier 'pi' has already been declared
console.log(pi)

2. 不能重复定义

var foo = 1;
var foo = 2;
console.log(foo) // 2

// let不能重复定义
let bar = 1;
let bar = 2;   // Identifier 'bar' has already been declared
console.log(bar)

3. 块级作用域

if(true){
    var test = 1;
}
console.log(test) // 1

if(true){
    let test2 = 1;
}
console.log(test2) // test2 is not defined

let arr = [1, 2, 3, 4]
for(var i = 0, iLength = arr.length; i < iLength; i++){
    // do nothing
}
console.log(i) // 4

for(let j = 0, jLength = arr.length; j < jLength; j++){
    // do nothing
}
console.log(j) //  j is not defined

4. 不存在变量提升

console.log(foo) //  foo is not defined

console.log(foo) // undefined
var foo = 1;

console.log(bar) //  bar is not defined
let bar = 1;

箭头函数

参数 => 表达式/语句
继承外层作用域
不能用作构造函数
没有prototype属性

1. 参数 => 表达式/语句

let value = 2;
let double = x => 2 * x;
let treble = x => {
    return 3 * x;
}

console.log('double:', double(value)) // 4
console.log('treble:', treble(value)); // 6

2. 继承外层作用域,没有独立作用域

var obj = {
    commonFn : function(){
        console.log(this);
    },
    arrowFn: () => {
        console.log(this);
    }
}
obj.commonFn(); // {commonFn: ƒ, arrowFn: ƒ}
// this 指向obj

obj.arrowFn(); // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
// this 指向了obj所在的作用域,window

3. 不能用作构造函数

let Animal =  function(){}
let animal = new Animal();
console.log(animal) //  //Animal {}

let Fruit =  () => {} // Fruit is not a constructor
let fruit = new Fruit();

4. 没有prototype

let commonFn = function(){}
let arrowFn = () => {};
console.log(commonFn.prototype)  // {constructor: ƒ}
console.log(arrowFn.prototype) //  undefined

模板字符串

反引号标识 ``
支持多行字符串
支持变量和表达式

1. 基本用法

let str = `
<div>
    <h1 class="title">123</h1>
</div>
`;
document.querySelector('body').innerHTML = str;

2. 嵌套变量的用法

let name = 'viiv'
let str = `
<div>
    <h1 class="title">welcome ${name}</h1>
</div>
`;
document.querySelector('body').innerHTML = str;

3. 嵌套函数的用法

let getName = (x) => {
    return 'viiv ' + x
}
let str = `
<div>
    <h1 class="title">welcome ${getName('seek')}</h1>
</div>
`;
document.querySelector('body').innerHTML = str;

4. 循环嵌套

let names = ['viiv', 'seek', '小花']
let str = `
    <ul>
    ${
        names.map(name => `<li>Hi, I am ${name}</li>`).join('')
    }
    </ul>
`
document.querySelector('body').innerHTML = str;

Promise

Promise对象
关键词:resolve, reject, then

1. Promise 结构

new Promise((resolve, reject)=>{
    // 异步函数
    $.ajax({
        url: 'http://viivmall.viivlgr.cn/user/get_user_info.do',
        type: 'POST',
        success(res){
            resolve(res);
        },
        err(err){
            reject(err);
        }
    })
}).then((res) => {
    console.log('success:', res);
}, (err) => {
    console.log('err:', err);
});

2. 链式调用

var promiseFn1 = new Promise((resolve, reject)=>{
    // 异步函数
    $.ajax({
        url: 'http://viivmall.viivlgr.cn/user/get_user_info.do',
        type: 'post',
        success(res){
            resolve(res);
        },
        err(err){
            reject(err);
        }
    })
});

var promiseFn2 = new Promise((resolve, reject)=>{
    // 异步函数
    $.ajax({
        url: 'http://viivmall.viivlgr.cn/cart/get_cart_product_count.do',
        type: 'GET',
        success(res){
            resolve(res);
        },
        err(err){
            reject(err);
        }
    })
})
promiseFn1.then((res) => {
    console.log('promiseFn1 success', res)
    return promiseFn2;
}, (err) => {
    console.log('promiseFn1 fail', err)
    return promiseFn2;
}).then((res)=>{
    console.log('promiseFn2 success', res)
}, (err) => {
    console.log('promiseFn2 fail', err)
})

面向对象-类

关键词:class
语法糖,对应function
构造函数: constructor

// class constructor
class Animal{
    constructor(name) {
        this.name = name;
    }
    getName(){
        return this.name;
    }
}
// 实例化
let animal = new Animal("animal test");
console.log(animal.getName()) // animal test

类的继承

extends: 类的继承
super: 调用父类的构造函数

class Animal{
    constructor() {
        this.name = 'animal';
    }
    getName(){
        return this.name;
    }
}

class Cat extends Animal{
    constructor(){
        super(); // 与Animal共享this指针
        this.name = 'cat';
    }
}

let animal = new Animal()
let cat = new Cat();
console.log(animal.getName()) // animal
console.log(cat.getName()) // cat

对象

对象里属性的简写
对象里方法的简写
属性名可以为表达式

// 之前的写法
var name = 'viiv',
    age = 18;
var obj = {
    name: name,
    age: age,
    getName: function(){
        return this.name;
    },
    getAge: function(){
        return this.age;
    }
}

// ES6写法
let name = 'viiv',
age = 18;
let obj = {
    // 变量名可以直接用作对象的属性名称
    name,
    age,
    // 对象里的方法可以简写
    getName(){
        return this.name;
    },
    // 表达式作为属性名或方法名
    ['get' + 'Age'](){
        return this.age;
    }
}
obj // {name: "viiv", age: 18, getName: ƒ, getAge: ƒ}

其他扩展

// 所有属性名
Object.keys(obj) // ["name", "age", "getName", "getAge"]

// extend  对象整合 (重叠覆盖)    浅拷贝
Object.assign({a: 1}, {b: 2}, obj) // {a: 1, b: 2, name: "viiv", age: 18, getName: ƒ, …}

ES6模块化

解决一个复杂问题时,自顶向下逐层吧系统划分成若干模块的过程
CommonJs, AMD, CMD
关键词:export, import

module.js

let str = 'str';
let obj = {
    name: 'viiv'
};
let fn = () => {
    console.log('module test')
};

export{
    str, 
    obj,
    fn
}
export default {a: 1}

index.js

import foo from './module.js'
console.log('string', string)
console.log('name', obj.name)
console.log('fn', fn)
console.log('foo',foo)

index.html

<script type="module" src="./index.js"></script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 1,001评论 0 7
  • this的应用及指向问题 this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象...
    azure_1122阅读 230评论 0 0
  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,773评论 0 1
  • 瑜伽是一种神秘的运动,它能通过提升意识和锻炼肢体,帮助人类充分挖掘、发挥自身的潜能。通过瑜伽的练习,改善人们...
    一只独自游水的鱼阅读 316评论 7 1
  • 《大明王朝1566》第一集里,描述的景象是明朝嘉靖年间,宫廷内开支无度,上下贪墨,民不聊生,最后导致国库亏空,经济...
    门前另一颗梨树阅读 14,861评论 0 3