分享ES6中比较常用又强大的新特性

前言

es6有很多新东西,但是感觉常用的并不是很多,这里学习记录了一些我自己认为非常常用又强大的新特性。

scoping

实用的块级作用域,let x = xxx 可以声明一个块级作用域的局部变量,简单举个例子下面1号函数可以达到正常的效果,而二号则不能,因为变量i是全局的,以往我们可以通过自执行函数解决 不过现在吗就是用let了。

///1111
let callbacks = []
for (let i = 0; i <= 2; i++) {
    callbacks[i] = function () { return i * 2 }
}

//2222
var callbacks = [];
for (var i = 0; i <= 2; i++) {
   callbacks[i] = function() { return i * 2; }
}

除了块级变量还是有块级函数,放个代码。同理,不用再写iife函数去消除作用域问题了。

{
    function foo () { return 1 }
    foo() === 1
    {
        function foo () { return 2 }
        foo() === 2
    }
    foo() === 1
}

//  only in ES5 with the help of block-scope emulating
//  function scopes and function expressions
(function () {
    var foo = function () { return 1; }
    foo() === 1;
    (function () {
        var foo = function () { return 2; }
        foo() === 2;
    })();
    foo() === 1;
})();

Arrow Functions

箭头函数简单说就是切换闭包中的this指向,把this指向它的父级作用域,看代码。妈妈也不用担心我用that _this 来替换this指针了。

///采用箭头函数
this.nums.forEach((v) => {
    if (v % 5 === 0)
        this.fives.push(v)
})

////传统解决指针问题方法
//  variant 1
var self = this;
this.nums.forEach(function (v) {
    if (v % 5 === 0)
        self.fives.push(v);
});

//  variant 2
this.nums.forEach(function (v) {
    if (v % 5 === 0)
        this.fives.push(v);
}, this);

//  variant 3 (since ECMAScript 5.1 only)
this.nums.forEach(function (v) {
    if (v % 5 === 0)
        this.fives.push(v);
}.bind(this));

Extended Parameter Handling

函数 rest 操作符:
扩展参数操作,写在参数尾部,表示多余的参数,和新增的spread运算符一样都是三个点(...),用法如下,后续介绍spread操作符。

///给参数设定默认参数
function f (x, y = 7, z = 42) {
    return x + y + z
}
>>>  f(1) === 50

/// var a = Array.prototype.slice.call(arguments, 2);

function f (x, y, ...a) {
    return (x + y) * a.length
}
>>>  f(1, 2, "hello", true, 7) === 9  (a = [ "hello", true, 7])

Template Literals

是不是看到那一堆的+ ‘’ +‘’ 要吐了,es6拯救你~

var customer = { name: "Foo" }
var card = { amount: 7, product: "Bar", unitprice: 42 }
var message = `Hello ${customer.name},
want to buy ${card.amount} ${card.product} for
a total of ${card.amount * card.unitprice} bucks?`

get`http://example.com/foo?bar=${bar + baz}&quux=${quux}`

Modules

很常用的方法,react,vue等主流框架经常能看到,可以将js代码模块化,通过export 暴露给其他脚本使用该块代码。

vue-router

以vue-router为例,通过接口暴露了一个router对象

//  lib/math.js
export function sum (x, y) { return x + y }
export var pi = 3.141593

//  someApp.js
import * as math from "lib/math"
console.log("2π = " + math.sum(math.pi, math.pi))

//  otherApp.js
import { sum, pi } from "lib/math"
console.log("2π = " + sum(pi, pi))

Classes

在传统变成语言中定义对象都是基于类,而js生成实例对象则不同。ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

class Shape {
    constructor (id, x, y) {
        this.id = id
        this.move(x, y)
    }
    move (x, y) {
        this.x = x
        this.y = y
    }
    
  ///传统实例对象
    
    var Shape = function (id, x, y) {
    this.id = id;
    this.move(x, y);
    };
    Shape.prototype.move = function (x, y) {
        this.x = x;
        this.y = y;
    };
}

Promises

ajax神器 这里就不赘述了。大部分项目里基本都在用了。 解决回调地狱的解决方法。es7还有 async 和await 函数 ,需要转换支持。

function msgAfterTimeout (msg, who, timeout) {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve(`${msg} Hello ${who}!`), timeout)
    })
}
msgAfterTimeout("", "Foo", 100).then((msg) =>
    msgAfterTimeout(msg, "Bar", 200)
).then((msg) => {
    console.log(`done after 300ms:${msg}`)
})
promise

采用promise.all 处理多个异步函数回调

New Built-In Methods

es6也对原有的数据类型和原生方法进行了扩展,这里只记录关于数组的扩展,个人感觉比较常用,而且很有用。一些扩展方法可能并不怎么用得到,扩展类型symbol 我现在还想不到什么场景要用。。可能它并不是用来写逻辑的。。而是研究型类型。。。不废话了 开始正文。

  • spread / ...运算符
  • Array.of() //将一组值转为数组
  • Array.from() //用于将类数组(可遍历)对象转为数组
  • Array.copyWithin(target, start,end) //复制一段数据到某个target
  • Array.find(fn) // 遍历数组寻找条件成员
  • Array.findIndex(fn) //同上 返回成员位置
  • Array.fill(t,s,e) //填充数组
  • Array.includes() //检测数组是否包含某个值
/////实例
//数组去重
var arr = [1,2,3,4,1,2,3]
var res = Array.from(new Set(arr))
>>>>>  [1,2,3,4]
//查找条件成员

arr.find(function(it) {
return it > 3
})
>>>>  4


///spread用法
arr.push(...[1,2,3])

>>> [1,2,3,4,1,2,3,1,2,3]

总结

掌握一些最新的东西。可以让你事半功倍,知识的深度不容易挖掘但是知识的广度是非常重要的,以前数组去重,以前还能出面试题,现在估计人人都会了。多么的轻松。
如果觉得本文对你有所帮助,就star一下吧~大传送之术! 我的博客Github

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

推荐阅读更多精彩内容

  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,050评论 8 25
  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,506评论 0 8
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 3,349评论 0 1
  • 《ECMAScript6 入门》阮一峰 读书笔记 let和constlet声明的变量仅在块级作用域内有效,var声...
    亲爱的孟良阅读 709评论 1 2
  • 梦是个奇怪的东西,在梦里,品五味杂陈,在梦里,看醉生梦死。 他,中午在午睡,做了个很长很长的梦。他在梦里...
    夜的悲鸣曲阅读 184评论 0 0