ES6 特性总结(一)

一、变量

1. let/const 关键字

在 ES6 之前,我们声明变量都用的关键字 var ,甚至可以直接通过为变量赋值来声明全局变量 a = 1(等价于window.a = 1) 。在 ES6 中新增了 let const 关键字用于变量声明,相比较 var 关键字,他们有如下特点:

  • let 关键字不存在变量提升的特性;不允许重复声明;仅在代码块中有效。
  • const 关键字用于常量声明,不允许修改,因此在声明时就必须赋值。
  • 注意const 声明的对象其属性可以修改的,声明的数组其数组元素也可以修改
// let
console.log(a);             // undefined
let a = 10;
let a = 20;                 // 报错:Uncaught SyntaxError: Identifier 'a' has already been declared

// const
const num = 1;
num = 2;                    // 报错:Uncaught TypeError: Assignment to constant variable.
const obj = {name: 'mu', age: 18};
obj.age = 19;               // {name: 'mu', age: 19}
const arr = [1, 2, 3, 4];
arr[0] = 5;                 // [5, 2, 3, 4]

面试常见题

for(var i = 0; i < 3; i++) {
    setTimeout(function () {
        console.log(i);             // 输出 3 3 3
    }, 10)
}

for(let i = 0; i < 3; i++) {
    setTimeout(function () {
        console.log(i);             // 输出 0 1 2 
    }, 10)
}

原因: let 仅在代码块有效,因此在获取动态更替的值时可以解决作用域问题。

2. 解构赋值

ES6 允许按照一定的格式从数组和对象(字符串将切割为数组)中获取特定的值。原理上基于模式匹配,即等号左右两边的格式保持一致时,将进行一一对应赋值。有以下几种解构赋值:

  • 数组的解构赋值
let [a, b, c] = [1, 2, 3];
let [a, [b, c], d] = [1, [2, 3], 4];
  • 对象的解构赋值
let {name, age} = {name: 'mu', age: 18};
let {name: n1, age: a1} = {name: 'mu', age: 18};    // n1 = 'mu', a1 = 18
  • 字符串的解构赋值
let {length} = 'abcd';              // length = 4;
let [s1, s2, s3, s4] = 'abcd';      // s1 = 'a', s2 = 'b', s3 = 'c', s4 = 'd'

此外,解构赋值允许设置默认值,此时等号左右格式可以不一致。

let [x, y = 2] = [1];               // x = 1, y = 2

二、函数

ES6 在函数声明和函数传参上都做了更新,使得函数更加简洁,使用更加方便。

1. 箭头函数

ES5 中函数声明需要采用 function () {} 的形式,在 ES6 中函数声明可以省去 function 关键字,引入 “=>” 符号,常应用于回调函数的声明中。例如:可以用如下方式声明一个简单的 add 函数,传入数组的 map 方法中。

let arr = [0, 1, 2, 3];
let newArr = arr.map( (el) => {return el + 1} );        // [1, 2, 3, 4]
  • 当传入参数仅有一个是,“=>” 左侧的括号可以省略

  • 当函数主体只有一个返回语句,“=>” 右侧的花括号可以省略。(注意:当返回的值是对象时,需要在对象外添加括号 () => ({age: 18})

箭头函数相比较普通函数有如下两点不同:

  • 内部的 this 继承上一个作用域内的 this ,因此箭头函数不能作为构造函数;

  • 函数内部没有 arguments 这个默认参数

var name = 'window';
var obj = {
    name: 'obj',
    print: () => {
        console.log(this.name)              
    }
}
obj.print();            // 'window'
2. 参数

ES6 支持默认参数,rest 参数(...变量名),在函数在参数传递上更加方便,使得函数的功能更加灵活。

  • 默认参数。当设置了参数默认值,那么在函数初始化到初始化结束期间,参数会有一个单独的作用域
function add(x, y = 0) {
    return x + y;
}
add(2, 3)           // 5
add(2)              // 2
  • rest 参数
function add(...args) {
    return args.reduce((a, b) => a+b);
}
add(1, 2, 3, 4)         // 10

作用域问题:

var n = 'window';
function fn(n, m = n) {
    console.log(m)
}
fn('function')          // 'function' 
/*
分析:调用fn时,生成一个参数作用域
{
    n = 'function';
    m = n;
}
因此输出m = 'funciton'
*/

var n = 'window';
function fn(m = n) {
    var n = 'function';
    console.log(m);
}
fn()                    // 'window'

三、数据结构

1. Set 和 Map

ES6 中新增了两种数据结构 SetMap ,两者的实例都通过 new 关键字声明。这里简单介绍他们的功能和常用的属性和函数:

  • Set :集合,与数组的功能类似,不同的是内部不存在重复的元素,因此常用于数组去重。
    • size 属性:等同于数组的 length 属性,获取数据集合的长度。
    • add(val) 方法:向集合中添加元素
    • delete(val) 方法: 删除集合中某一个值
    • has(val) 方法:等同于数组的 includes() 方法,判断集合中是否包含某个值
    • clear() 方法:清空集合。
  • Map :哈希表,映射关系键值对,“键”可为任意类型(包括函数、对象和基本类型)。相比普通的 Object 在涉及频繁增删键值对的场景下会有些性能优势。
    • size 属性: 同上。
    • get(key) 方法:获取哈希表中该键所对应的值。
    • set(key, val) 方法:用于存储新的键值对到哈希表中。
    • keys()values() 方法:分别用于获取该哈希表中所有的键、所有的值。

如何判断某一实例是否为 MapSet

使用 typeof 对实例进行判断得到的是 object ,同 Array 一样,如果要判断该实例是否为 SetMap ,可以使用以下两种方法:

  • 调用原型上的 toString 方法

  • 使用原型链判断实例的 constructor 属性

let m = new Map();
let s = new Set();

console.log(Object.prototype.toString.call(m))      // '[object Map]'
console.log(Object.prototype.toString.call(s))      // '[object Set]'

console.log(m.constructor === Map)                          // true
console.log(s.constructor === Set)                          // true

如何遍历拿到 MapSet 中的所有元素:

这两种数据类型都是有序的,可以通过 for...of 来进行迭代,其原理在于生成一个遍历器(指针对象),指针默认指向当前对象的内存地址。每次迭代,指针后移(当前元素的字节长度),返回数据并判断是否结束(判断指针是否等于对象结束的位置,起始位置+单元字节*元素长度)

for (let val of set) {}
for (let item of map) {}                // 每次返回形式为 [key, value]的数组
for (let key of map.keys()) {}
for (let key of map.values()) {}

面试常见题

// 实现数组的去重
let arr = [1, 2, 3, 3, 9, 8, 9, 2];
arr = Array.from(new Set(...[arr]))         //  [1, 2, 3, 9, 8]
2. Symbol

在 ES5 中数据类型包括:StringNumberBooleanArrayUndefinedNullObject,而在 ES6 中新增了 Symbol 数据类型(使用 typeof 输出为 “symbol” )。Symbol 的最大特点是独一无二,任意两个 Symbol 都是不相等的。需要注意的事它并不需要 new 关键字进行声明,直接使用 Symbol() 进行创建即可,可以传入一个字符串作为其描述。

let sym1 = Symbol();
let sym2 = Symbol('mu');

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

推荐阅读更多精彩内容

  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,768评论 0 1
  • 第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...
    BeADre_wang阅读 815评论 0 0
  • 以下内容是我在学习和研究ES6时,对ES6的特性、重点和注意事项的提取、精练和总结,可以做为ES6特性的字典;在本...
    科研者阅读 3,109评论 2 9
  • 一、let 和 constlet:变量声明, const:只读常量声明(声明的时候赋值)。 let 与 var 的...
    dadage456阅读 757评论 0 0
  • 前面的话   我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段。在ES6中添加了可以简化这种任务的新...
    CodeMT阅读 511评论 0 0