ECMAScript 2015新特性

一:let与块级作用域

1、在ES2015之前只有两中作用域

  • 全局作用域
  • 函数作用域

2、在ES2015中新增了一个

  • 块级作用域
    块级作用域:定义在{}中,if 和 for中的{}都属于块级作用域
// 例1:
if (true) {
  var a = 123
}
console.log(a) // 123

if (true) {
   let a = 123
}
console.log(a) // a is not defined

// 例2:
for (var i = 0; i < 3; i++) {
    for (var i = 0; i < 3; i++) {
        console.log(i)
  }
}
// 输出:012

for (let i = 0; i < 3; i++) {
    for (let i = 0; i < 3; i++) {
    console.log(i)
  }
}
// 输出:012 012 012

以上都是定义块级作用域的方法,使用let关键字来定义块级作用域,因为在ES2015之前没有块级作用域的说法,所以使用var在{}定义的变量并不属于块级作用域

二:const

const是一个常量/衡量,一旦声明不可修改
注意:const声明的常量只是不能重新去指向新的内存地址,并不是不能修改常量中的属性成员

const a = '123'
a = '456'
// Assignment to constant variable

// 注意:
const obj = {'name': 'jack'}
console.log(obj.name) // jack
obj.name = 'tom'
console.log(obj.name) // tom

最佳实践:不用var,主用const,配合let
这样定义的的话能搞提高代码的质量

三:数组的解构

从数组或对象中获取指定元素的快捷方式

const arr = [100, 200, 300]

// 传统的做法
const foo = arr[0]
const bar = arr[1]
const baz = arr[2]
console.log(foo) // 100

// 解构的做法
const [foo, bar, baz] = arr
console.log(foo) // 100

// 如果只想定义一个值,长度必须跟数组长度一致
const [, , baz] = arr
console.log(baz) // 300

// 如果只想取从当前位置开始之后的所有成员
const [foo, ...rest] = arr
console.log(rest) // [200, 300]
// 注意:这种用法只能在解构成员的最后一个位置上使用

// 如果解构位置的长度小于解构的数组,会默认从第一个位置提取
const [foo] = arr
console.log(foo) // 100

// 如果解构位置的的长度大于解构的数组,则返回undefined
const [foo, bar, baz, more] = arr
console.log(more) // undefined

// 设置默认值
const [foo, bar, baz, more = "default value"] = arr
console.log(more) // default value
四:对象的解构

基本上和数组的解构方式差不多

const obj = { name: 'jack', age: '23' }

// 例1:
const { name } = obj
console.log(name) // jack

注意:如果变量名和对象中的属性名冲突的话会报错
const name = 'tom'
const { name } = obj
console.log(name) // Identifier 'name' has already been declared

所以我们可以更改属性名来成功输出
const name = 'tom'
const { name: nameObj } = obj
console.log(nameObj) // jack

我们还可以设置默认属性
const { sex = '男' } = obj
console.log(sex) // 男
五:模版字符串
// 传统的做法
const str = 'hello es2015, this is a string'
console.log(str) // hello es2015, this is a string

// 新的写法
const str = `hello es2015, this is a string`
console.log(str) // hello es2015, this is a string

// 好处:
// 传统的做法需要在字符串中换行的话必须加上\n进行换行
// 而新的做法直接换行就行了
const str = `hello es2015,
this is a string`
console.log(str)
// hello es2015, 
// this is a string

// 如果需要在字符串中加入单引号或新双引号
const str = `hello es2015, this is a \'string\'`
console.log(str) // hello es2015, this is a 'string'

// 支持插值表达式的形式
const name = 'es2015'
const str = `hello ${name}, this is a string`
console.log(str) // hello es2015, this is a string

// 还可以支持js的表达式
const str = `hello es2015, this is a string, ${ 1 + 2}, ${ Math.random() }`
console.log(str) // hello es2015, this is a string, 3, 随机值
六:带标签的模版字符串
const str = console.log`hello world` // ['hello', 'world']

// 还可以加变量或者表达式例:
const name = `jack`
const age = `23`

result`hello ${name}, this is a ${age}`
function result(string, name, age) {
    console.log(string, name, age) // ['hello', ', this is a', ''] jack 23
}
// 这种方式其实是以变量或者表达式的方式进行分割
七:字符串的扩展方法
  • includes: 字符串当中是否包含某些字段,返回true or false
  • startsWith: 是否以某个字段开头,返回true or false
  • endsWith: 是否以某个字段结尾,返回true or false
// 例:
const str = `hello world`
console.log(str.includes(`o`)) // true
console.log(str.startsWith(`h`)) // true
console.log(str.endsWith(`d`)) // true
八:参数默认值
// 在函数参数没有传值的情况下,默认undefined

// 传统的做法:
function foo (parmas) {
  parmas = parmas === undefined ? '123' : parmas
  console.log(parmas) // 123
}
foo()

// 新的做法:
function foo (parmas = 123) {
  console.log(parmas) // 123
}
foo()

注意:如果有多个参数的话,设置参数默认值一定要放到参数列表的最后
例:
// 错误写法
function foo (parmas = 123, parmas2) {
  console.log(parmas) // 123
}
foo()

// 正确写法
function foo (parmas2, parmas = 123) {
  console.log(parmas) // 123
}
foo()
九:剩余参数
// 在参数数量不确定的情况下
// 传统做法通过arguments获取到参数
// 例:
function foo () {
    console.log(arguments) // {'0': 1, '1': 2, '2': 3}
}
foo(1,2,3)

// 新的做法:
function foo (...args) {
    console.log(args) // [1, 2, 3]
}
foo(1,2,3)

// 注意:...args只能出现在参数的最后位置
function foo (first, ...args) {
    console.log(args) // [2, 3]
}
foo(1,2,3)
十:展开数组

使用...的方式展开数组

const arr = ['bar', 'bat', 'jack']
console.log(...arr) // bar bat jack
// 把数组中的每一项传递给console.log 打印出来
十一:箭头函数
// 比如筛选出一个数组中的奇数
const arr = [1, 2, ,3, 4, 5]
console.log(arr.filter(i => i % 2)) // [1, 3, 5]

// 上面箭头函数使用普通函数筛选
console.log(arr.filter(function(i) {
    return i % 2
})) // [1, 3, 5]

// 箭头函数中的this指向
const obj = {
    name: 'jack',
  sayHi: function () {
    console.log(this.name) // jack
  }
}
obj.sayHi()
// 因为sayHi这个方法是obj去调用的,所以this指向obj这个对象

const obj = {
    name: 'jack',
  sayHi: () => {
    console.log(this.name) // undefined
  }
}
obj.sayHi()
// 因为箭头函数中没有this的概念,所以箭头函数中的this指向window
十二:Proxy代理对象
const person = {
    name: 'jack',
  age: 23
}
const personProxy = new Proxy(person, { // person目标对象
    get(target, property) { // target目标对象,property属性名
    console(target, property) // { name: 'jack', age: 23 } name
  },
  // get方法读取目标
  set(target, property, value) {
    console.log(target, property, value) // target目标对象,property属性名, value要写入的值
  }
  // set方法写入目标
})
console.log(personProxy.name)
十三:生成器

生成器函数会自动帮我们返回一个生成器对象,调用这个对象的next()方法这个生成器函数就开始执行,在执行的过程中一旦遇到yield关键词,执行就会被暂停下来。而且yield的值将会作为next的结果返回,如果再调用next方法,这个函数将会从暂停的位置继续执行,直到全部结束

function * foo() { // 定义生成器函数
  console.log(1)
  yield 100 // 遇到yield暂停执行, 直到执行下一次next方法
  console.log(2)
  yield 101
  console.log(3)
  yield 102
}
const generator = foo() // console.log(foo()) 返回[Generator] {}
console.log(generator.next()) // 1 { value: 100, done: false }
console.log(generator.next()) // 2 { value: 101, done: false }
console.log(generator.next())   // 3 { value: 102, done: false }

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