ES6基础

JS基础

JS基本数据类型

  1. Number
  2. String
  3. Boolen
  4. Null
  5. Undefined
  6. Object--引用数据类型
  7. Symbol

数据集合

  1. Array
  2. Object
  3. Map
  4. Set

Symbol (属性私有化)

创建Symbol的时候初始化的一个参数主要是描述, 为的是在控制台显示或者转换为字符串的时候容易区分.即使不同的Symbol有相同的描述,也不相同

var Person = (function(){
    var n = Symbol('n'); // n为局部变量,外面访问不到
    function P(name) {
        this.name = name;
        this[n] = 10;
    }
    return P
})();

var p1 = new Person('zhangsan');
console.log(p1)
=>P {name: "zhangsan", Symbol(n): 10}
console.log(p[Symbol('n')])
=> undefined  因为symbol不等,即使是一样的

var let const

条件 var let const
声明预解析(上下文找到定义,不包括赋值) 支持 不支持 不支持
块作用域{} 不支持 支持 支持
重复声明 允许 不允许(暂存死区) 不允许(暂存死区)
其他 全局 局部 一旦声明不允许修改,所以必须初始化
<!-- 暂时性死区 -->
let a = 10;
function fn() {
    a = 2; // 暂时性死区
    let a = 3;
}
fn();
===>
"a is not defind"

const 定义的对象等因为是引用类型, 所以可以使用变异方法, 因为地址不会变,如果想要冻结对象可以使用Object.freeze(obj)冻结, 但是对象中嵌套对象无法冻结, 需要递归

解构赋值

按照一定的模式,从数组或者对象中提取值

let {a, , c} = [1,2,3]
let {d, e, f} = 'jack'
=> 
a === 1
c === 3
d === "j"
e === "a"
f === "c"

let {a: wo, b: ni} = {a: 123, b: 122}
=>
wo === 123
ni === 122
解构赋值并重新命名

多重解构
let {foo:[a,b]} = {foo:[12,22], lo:qw}
=>
a === 12 b===22

扩展运算符

let arr = ['a', 'b', 'c'];
let obj = {a:10, b:11} 
 ...arr => 'a', 'b', 'c';
 ...obj=> a:10, b: 11;

属性名表达式

let x = "hello"
let y = "world",
let z = "nihao"
let m = "世界"
let obj = {
    [x]: 10,
    z: 999
}
obj[y] = 20
obj['m'] = 200
==>
console.log(obj);
{
    hello: 10,
    world: 20,
    z: 999,
    m: 200
}

迭代

  1. 迭代协议

规定了迭代与实现的协议

MDN|迭代协议

  1. 迭代器

具体的迭代实现逻辑

  1. 迭代对象

可被迭代对象(实现了迭代器的对象) - [Symbol.iterator]方法

  1. 迭代语句

for...in 以原始插入顺序迭代对象迭代对象的可枚举属性
for...of 根据迭代对象的迭代器具体实现迭代对象数据(实现了迭代器的迭代对象)

Iterator 遍历器的的作用

为各种数据结构提供一个统一的,简便的访问接口
使得数据结构成员能够按照某种次序排列
es6 新增 for...of 循环, 接口主要提供给for...of消费

/**
 * Iterator 遍历过程
 * 1. 创建一个指针对象, 指向当前数据结构的起始位置,也就是说,遍历器对象本质上就是一个指针对象
 * 第一次调用指针对象的next()方法,可以将指针指向数据结构的第一个成员,
 * 第二次调用指针对象的next()方法,可以将指针指向数据结构的第二个成员,
 * 不断调用next()方法,知道他指向数据结构的结束位置
 * 
 * 每一次调用next()方法, 都会返回数据结构的当前成员信息,具体来说就是返回一个包含value和done两个属性的对象.其中value是当前成员的值,done是一个布尔值,表示遍历是否结束
 *  
 * 2. 凡是具有[Symbol.iterator]属性的数据结构,都具有Iteratot接口
 *  
 * 3.凡是具有Iterator接口的数据结构都具有以下属性
 *  - 解构赋值
 *  - 扩展运算符
 * */
 
(<!-- 自己实现一个迭代协议(手写一个iterator接口) -->)
let obj = {
    left :100,
    top: 100
};

obj[Symbol.iterator] = function() {
    let keys = Object.keys(obj)
    let len = keys.length
    var n = 0
    return {
        next: function() {
            if (n < len) {
                return {
                    value: keys[n++],
                    done: false
                }
            } else {
                return {
                    done: true
                }
            }
        }
    }
}

for(attr of obj) {
    console.log(attr)
}


函数拓展

  1. 参数默认值
function fn1 (x=0,y=1) {
    给形参设置默认值,不传参的话默认 
}
  1. rest剩余参数
function fn(a, ...data) {
    // 剩余参数要写在最后
}

箭头函数

(参数列表)=>{函数体}
let fn = x => x + 1; // 只有一个参数 ,函数体只有一个语句的话 可以简写
  1. 普通函数的this指向是在函数执行期间绑定的(确定的)
  2. 箭头函数的this是在函数声明的时候绑定的,箭头函数的this指向创建该函数的作用域对象,并且永远不会变

注意点

  1. 箭头函数不能作为构造函数
  2. 没有arguments, 可用rest
  3. 不能作为生成器函数
  4. 不能使用call apply bind 改变内部this指向

内置对象

  1. String
  2. Number
  3. Array
  4. Object
  5. Set
  6. WeakSet
  7. Map
  • map 中 使用NaN做键 NaN === NaN为true , 后添加覆盖前添加
  • 使用{} 做键, {} === {} 为false, 因为对象地址是不同的
  • key的顺序按照添加顺序排序
  1. WeakMap

class

ES5
const M = function(a,b) { // 构造函数
    this.a = a;
    this.b = b;
    return this;
}

M.prototype.print = {
    constructor: this,
    print:function(){
        console.log(this.a+''+this.b);
    }
}

const Mv = new M(12,11).print();

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

推荐阅读更多精彩内容

  • ECMAScript 6学习网站:http://es6.ruanyifeng.com/ 1.let和var的比较 ...
    贾里阅读 326评论 0 0
  • this的应用及指向问题 this是Javascript语言的一个关键字。它代表函数运行时,自动生成的一个内部对象...
    azure_1122阅读 230评论 0 0
  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 1,005评论 0 7
  • 最近在学习React,示例代码都由ES6所书写,所以对于ES6,不得不好好研究一下新的语法。这篇文章就对自己现在经...
    2Youngg阅读 379评论 0 1
  • ES6 箭头函数、函数扩展 ES5: function add(a,b){return a+b;}console....
    紫由袅阅读 356评论 0 1