>웹 프론트엔드 >프런트엔드 Q&A >es2017은 es6입니까, es8입니까?

es2017은 es6입니까, es8입니까?

青灯夜游
青灯夜游원래의
2022-10-27 17:37:332128검색

es2017은 es8입니다. es의 정식 명칭은 "ECMAScript"이며, ECMA-262 표준에 따라 구현된 범용 스크립트 언어입니다. 2017년 6월에 정식 출시된 버전은 ECMAScript의 8번째 버전이기 때문에 정식 명칭은 ECMAScript2017입니다. es8이라고 할 수 있습니다.

es2017은 es6입니까, 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()
  • 함수 인수 목록 및 호출의 후행 쉼표
  • 비동기 함수
  • 공유 메모리 및 원자학
문자열 패딩(padStart 및 padEnd)

The 문자열 패딩의 목적은 문자열에 문자를 추가

하여 문자열이 지정된 길이에 도달하도록 하는 것입니다.

ES2017에는 padStart()padEnd()라는 두 가지 String 메서드가 도입되었습니다.

JavaScript 코드:

padStart(targetLength [, padString])
padEnd(targetLength [, padString])
String 方法:padStart()padEnd()

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

简单的使用:

es2017은 es6입니까, es8입니까?

Object.values()

这个方法返回一个包含所有对象自身属性值的数组。

使用:

JavaScript 代码:
const people = ['Fred', 'Tony']
Object.values(people) // ['Fred', 'Tony']

Object.values() 也适用于数组:

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

Object.entries()

这个方法返回一个包含所有对象自身属性的数组,作为 [key,value] 对的数组。

使用:

JavaScript 代码:
const people = ['Fred', 'Tony']
Object.entries(people) // [['0', 'Fred'], ['1', 'Tony']]

Object.entries() 也适用于数组:

JavaScript 代码:
const person1 = {
    set name(newName) {
        console.log(newName)
    }
}

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()사용하기 쉬움:

es2017은 es6입니까, es8입니까?

Object.values()

이 메서드는 객체의 모든 속성 값을 포함하는 배열을 반환합니다.

용도:

JavaScript 코드:

const person2 = {}
Object.assign(person2, person1)
Object.values() 배열에서도 작동:
🎜JavaScript 코드:🎜
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의 모든 개체에는 속성 집합이 있으며 각 속성에는 설명자가 있습니다. 🎜🎜설명자는 다음 하위 집합으로 구성된 속성의 속성 집합입니다. 🎜
    🎜🎜value🎜: 속성의 값 🎜🎜🎜writable🎜: 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() 对浅拷贝对象也有同样的限制。

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

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

    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으로 문의하세요.