es2017은 es8입니다. es의 정식 명칭은 "ECMAScript"이며, ECMA-262 표준에 따라 구현된 범용 스크립트 언어입니다. 2017년 6월에 정식 출시된 버전은 ECMAScript의 8번째 버전이기 때문에 정식 명칭은 ECMAScript2017입니다. es8이라고 할 수 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, 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.
Object.getOwnPropertyDescriptors()The 문자열 패딩의 목적은 문자열에 문자를 추가
하여 문자열이 지정된 길이에 도달하도록 하는 것입니다.ES2017에는 padStart()
및 padEnd()
라는 두 가지 String
메서드가 도입되었습니다.
padStart(targetLength [, padString]) padEnd(targetLength [, padString])
String
方法:padStart()
和 padEnd()
。
const person = { name: 'Fred', age: 87 } Object.values(person) // ['Fred', 87]
简单的使用:
Object.values()
这个方法返回一个包含所有对象自身属性值的数组。
使用:
const people = ['Fred', 'Tony'] Object.values(people) // ['Fred', 'Tony']
Object.values()
也适用于数组:
const person = { name: 'Fred', age: 87 } Object.entries(person) // [['name', 'Fred'], ['age', 87]]
Object.entries()
这个方法返回一个包含所有对象自身属性的数组,作为 [key,value]
对的数组。
使用:
const people = ['Fred', 'Tony'] Object.entries(people) // [['0', 'Fred'], ['1', 'Tony']]
Object.entries()
也适用于数组:
const person1 = { set name(newName) { console.log(newName) } }
Object.getOwnPropertyDescriptors()
此方法返回对象的所有自有(非继承的)属性描述符。
JavaScript 中的任何对象都有一组属性,每个属性都有一个描述符。
描述符是属性(property) 的一组特性(attributes),它由以下的子集组成:
true
表示改属性可以被修改false
,则不能删除属性,也不能更改任何属性,但值除外true
Object.getOwnPropertyDescriptors(obj)
接受一个对象,并返回一个带有描述符集的对象。
这个方法有什么用?
ES2015 给我们带来了 Object.assign()
方法,它从一个或多个对象复制所有可枚举的属性,并返回一个新对象。
但是存在问题,它无法正确复制具有非默认特性(attribute) 的属性 (property)(getter,setter,不可写属性,等)。
如果一个对象只有一个 setter ,则无法使用 Object.assign()
사용하기 쉬움:
Object.values()
이 메서드는 객체의 모든 속성 값을 포함하는 배열을 반환합니다.
JavaScript 코드:
const person2 = {} Object.assign(person2, person1)
Object.values()
배열에서도 작동:const person3 = {} Object.defineProperties(person3, Object.getOwnPropertyDescriptors(person1))🎜🎜🎜Object.entries()🎜🎜🎜🎜이 메서드 객체의 모든 속성을 포함하는 배열을
[key, value]
쌍의 배열로 반환합니다. 🎜🎜용도:🎜🎜JavaScript 코드:🎜person1.name = 'x' "x" person2.name = 'x' person3.name = 'x' "x"🎜
Object.entries()
배열에서도 작동:🎜🎜JavaScript 코드:🎜const doSomething = (var1, var2,) => { //... } doSomething('test2', 'test2',)🎜🎜🎜Object.getOwnPropertyDescriptors()🎜🎜🎜🎜이 메서드 객체 자체의 (상속되지 않은) 속성 설명자를 모두 반환합니다. 🎜🎜JavaScript의 모든 개체에는 속성 집합이 있으며 각 속성에는 설명자가 있습니다. 🎜🎜설명자는 다음 하위 집합으로 구성된 속성의 속성 집합입니다. 🎜
true
는 다음을 나타냅니다. 속성을 수정할 수 있습니다. 🎜🎜🎜get🎜: 속성을 읽을 때 호출되는 속성의 getter 함수 🎜🎜🎜set🎜: 속성의 값을 설정할 때 호출되는 속성의 setter 함수 🎜🎜 🎜configurable🎜: false
인 경우 속성을 삭제할 수 없으며 🎜🎜🎜enumerable🎜 값을 제외하고 어떤 속성도 변경할 수 없습니다.: true
🎜🎜🎜Object.getOwnPropertyDescriptors(obj) 객체를 승인하고 설명자 세트와 함께 객체를 반환합니다. 🎜🎜🎜이 방법의 용도는 무엇입니까? 🎜🎜🎜ES2015에서는 하나 이상의 객체에서 열거 가능한 모든 속성을 복사하고 새 객체를 반환하는 Object.sign()
메서드를 도입했습니다. 🎜🎜하지만 기본이 아닌 속성(getter, setter, 쓰기 불가능한 속성 등)이 있는 속성을 올바르게 복사할 수 없다는 문제가 있습니다. 🎜🎜객체에 setter가 하나만 있는 경우 Object.sign()
을 사용하여 새 객체에 올바르게 복사할 수 없습니다. 🎜🎜예:🎜🎜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🎜그러나 다음 코드는 작동합니다.🎜🎜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) })🎜간단한 방법으로 이 작업을 수행할 수 있습니다. 콘솔 테스트를 수행하면 다음이 표시됩니다. 🎜🎜JavaScript 코드: 🎜
person1.name = 'x' "x" person2.name = 'x' person3.name = 'x' "x"
person2
丢失了 setter ,因为它没有复制过来。
使用 Object.create()
对浅拷贝对象也有同样的限制。
函数参数列表和调用中的尾随逗号
此功能允许在函数声明和函数调用中使用尾随逗号:
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 (异步函数)。
一个简单的例子
使用异步函数的代码可以写成:
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')
上面的代码将在浏览器控制台中打印以下内容:
Before After I did something //after 3s
链式调用多个异步函数
异步函数可以非常容易地链式调用,并且语法比简单的 Promise 更具可读性:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!