首頁  >  文章  >  web前端  >  es2017是es6還是es8

es2017是es6還是es8

青灯夜游
青灯夜游原創
2022-10-27 17:37:332042瀏覽

es2017是es8。 es全名為“ECMAScript”,是根據ECMA-262標準實現的通用腳本語言,而由2017年6月正式發布的版本,其正式名為ECMAScript2017(ES2017),因其是ECMAScript的第8個版本,因此可簡稱為es8。

es2017是es6還是es8

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

“es”簡介

es全名為“ECMAScript”,是根據ECMA-262 標準實現的通用腳本語言,ECMA -262 標準主要規定了這門語言的語法、型別、語句、關鍵字、保留字、運算子、物件等幾個部分。每次看到 ES 後面跟著數字,是 ECMAScript 的不同版本。

es8/ ES2017

es8全名為ECMAScript8(ECMAScript的第8個版本),是於2017年6月正式發表的JavaScript語言的標準,正式名為ECMAScript 2017(ES2017)。

與ES6 相比,ES8 是JavaScript 的一個小版本,但它仍然引入了非常有用的功能:

  • 字串填充(padStart 和padEnd)

  • Object.values

  • Object.entries

  • Object.getOwnPropertyDescriptors()

  • 函數參數清單和呼叫中的尾隨逗號

  • Async Functions (異步函數)

  • 共享記憶體和Atomics

字串填充(padStart 和padEnd)

字串填充的目的是向字符字串添加字元,使字串達到指定的長度。

ES2017引入了兩個 String 方法:padStart()padEnd()

JavaScript 程式碼:
padStart(targetLength [, padString])
padEnd(targetLength [, padString])

簡單的使用:

es2017是es6還是es8

Object.values()

這個方法傳回一個包含所有物件自身屬性值的陣列。

使用:

JavaScript 程式碼:
const person = { name: 'Fred', age: 87 }
Object.values(person) // ['Fred', 87]

Object.values() 也適用於陣列:

##JavaScript 程式碼:
const people = ['Fred', 'Tony']
Object.values(people) // ['Fred', 'Tony']

Object.entries()

#這個方法傳回一個包含所有物件本身屬性的數組,作為

[key,value] 對的陣列。

使用:

JavaScript 程式碼:
const person = { name: 'Fred', age: 87 }
Object.entries(person) // [['name', 'Fred'], ['age', 87]]

Object.entries() 也適用於陣列:

JavaScript 程式碼:
const people = ['Fred', 'Tony']
Object.entries(people) // [['0', 'Fred'], ['1', 'Tony']]

Object.getOwnPropertyDescriptors()

#此方法傳回物件的所有自有(非繼承的)屬性描述子。

JavaScript 中的任何物件都有一組屬性,每個屬性都有一個描述符。

描述子是屬性(property) 的一組特性(attributes),它由以下的子集組成:

  • value:屬性的值
  • writabletrue 表示改屬性可以被修改
  • get:屬性的getter 函數,在讀取屬性時呼叫
  • set:屬性的setter 函數,在屬性設定值時呼叫
  • configurable:如果為false ,則不能刪除屬性,也不能更改任何屬性,但值除外
  • enumerable:如果屬性是可枚舉的,則為true

Object.getOwnPropertyDescriptors(obj) 接受一個對象,並傳回一個帶有描述符集的物件。

這個方法有什麼用?

ES2015 為我們帶來了

Object.assign() 方法,它從一個或多個物件複製所有可列舉的屬性,並傳回一個新物件。

但是有問題,它無法正確複製具有非預設特性(attribute) 的屬性 (property)(getter,setter,不可寫屬性,等)。

如果一個物件只有一個 setter ,則無法使用

Object.assign() 正確地複製到一個新物件。

例如:

JavaScript 程式碼:
const person1 = {
    set name(newName) {
        console.log(newName)
    }
}
以下程式碼將無法運作:

JavaScript 程式碼:
const person2 = {}
Object.assign(person2, person1)
但下面的程式碼就會奏效:

JavaScript 程式碼:
const person3 = {}
Object.defineProperties(person3,
  Object.getOwnPropertyDescriptors(person1))
您可以透過簡單的控制台測試,將會看到:

JavaScript 程式碼:
person1.name = 'x'
"x"
 
person2.name = 'x'
 
person3.name = 'x'
"x"

person2 丢失了 setter ,因为它没有复制过来。

使用 Object.create() 对浅拷贝对象也有同样的限制。

函数参数列表和调用中的尾随逗号

此功能允许在函数声明和函数调用中使用尾随逗号:

JavaScript 代码:
const doSomething = (var1, var2,) => {
  //...
}
doSomething('test2', 'test2',)

这一变化将鼓励开发人员停止丑陋的“行以逗号开头”的习惯。

Async Functions (异步函数)

ES2017 引入了 Async Functions (异步函数) 的概念,这是 ECMAScript 版本中引入的最重要的变化。

Async Functions (异步函数) 是 promises 和 generators(生成器) 的组合,以简化 promises 调用,提过代码的可读性,但是不打破 promises 链式调用的限制。

为什么有用

这是对 promises 更高层次的抽象。

当 Promise 在 ES2015 中引入时,它们的目的是解决异步代码的问题,并且他们做到了。但在 ES2015 和 ES2017 相间隔的两年时间里,很明显, Promise 并不是最终的解决方案。

引入 Promise 是为了解决著名的 回调地狱 问题,但它们引入了自己的复杂性和语法复杂性。它们是良好的原语,可以向开发人员公开更好的语法:那就是Async Functions (异步函数)。

一个简单的例子

使用异步函数的代码可以写成:

JavaScript 代码:
function doSomethingAsync() {
    return new Promise((resolve) => {
        setTimeout(() => resolve('I did something'), 3000)
    })
}
async function doSomething() {
    console.log(await doSomethingAsync())
}
console.log('Before')
doSomething()
console.log('After')

上面的代码将在浏览器控制台中打印以下内容:

JavaScript 代码:
Before
After
I did something //after 3s

链式调用多个异步函数

异步函数可以非常容易地链式调用,并且语法比简单的 Promise 更具可读性:

JavaScript 代码:
function promiseToDoSomething() {
    return new Promise((resolve)=>{
        setTimeout(() => resolve('I did something'), 10000)
    })
}
async function watchOverSomeoneDoingSomething() {
    const something = await promiseToDoSomething()
    return something + ' and I watched'
}
async function watchOverSomeoneWatchingSomeoneDoingSomething() {
    const something = await watchOverSomeoneDoingSomething()
    return something + ' and I watched as well'
}
watchOverSomeoneWatchingSomeoneDoingSomething().then((res) => {
    console.log(res)
})

共享内存 和 Atomics

WebWorkers 用于在浏览器中创建多线程程序。

他们通过事件提供消息传递协议。 从ES2017开始,您可以使用 SharedArrayBuffer 在 Web worker 及其创建者之间创建共享内存数组。

由于我们不知道向共享内存部分写入要花费多少时间来传播,因此 Atomics 是一种在读取值时执行该操作的方法,并且完成了任何类型的写入操作。

【相关推荐:javascript视频教程编程视频

以上是es2017是es6還是es8的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn