ES8(ES2017)特性

版权声明:本文为博主原创,转载加个原文章链接。 https://blog.csdn.net/xiaolongbaobushibao/article/details/78685029

前言

  • 内容主要来自网络,主要来自 MDN
  • ES(JavaScript)是一门大家都要努力学习语言,也是一门努力不让开发者精通的语言。

  • ES678 大部分功能能通过Polyfill或者Babel来解决。
    也就是说ES5能实现这些功能

/**
 * ie78 没有 trim方法
 * @returns {string}
 */
if(!String.prototype.trim){
    String.prototype.trim = function(){
        return this.replace(/(^\s*)|(\s*$)/g, "");
}

还有一些 语法糖 ,语法糖就是指那些没有给语言添加新功能,而只是对人类来说更“甜蜜”的语法。
比如 class ES5的继承

function Base(opt){
}

function SubClass(opt){
    Base.call(this,opt);
}
SubClass.prototype = new Page;//继承属性
SubClass.prototype.constructor = SubClass;//防止指向父类的constructor
var obj = new SubClass(opt);//实例化对象

ES6继承的写法:

class Base(opt){
}

class SubClass(opt) extends Base {
    super(opt);
}

let obj = new SubClass(opt);

1、什么是ES、ES8(随便讲讲,你们随便听听)

  • ECMAScript:一个由 ECMA International 进行标准化,TC39 委员会进行监督的语言。通常用于指代标准本身。
  • JavaScript:ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范,并且可能被用于任何不同程度的任意版本的 ECMAScript 的实现。
  • ECMAScript5 (ES5) :ECMAScript 的第五版修订,于 2009 年完成标准化。这个规范在所有现代浏览器中都相当完全的实现了。
  • ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015):ECMAScript 的第六版修订,于 2015 年**完成标准化。这个标准被部分实现于大部分现代浏览器。可以查阅这张兼容性表来查看不同浏览器和工具的实现情况。
  • ECMAScript 2016(ES7):第七版 ECMAScript 修订,只加了Array.prototype.includes、Exponentiation Operator(求冥运算)
  • ECMAScript2017(ES8) :第八版 ECMAScript 修订
  • ECMAScript Proposals:被考虑加入未来版本 ECMAScript标准的特性与语法提案,他们需要经历五个阶段:Strawman(稻草人),Proposal(提议),Draft(草案),Candidate(候选)以及 Finished (完成)。

2、padStart&padEnd(字符串填充)

2.1 存在的意义

  • 以等宽字体显示平整的数据。
  • 在文件名或URL中添加计数或ID:’001.txt’。
  • 对齐控制台输出: ‘Test 001: ’。
  • 打印具有固定位数的十六进制或二进制数字:’0x00FF’

2.2 语法

String.prototype.padStart(targetLength [, padString])
String.prototype.padEnd(targetLength [, padString])
  • 参数
    • targetLength 当前字符串需要填充到的目标长度。如果当前字符串原本就达到了该长度,那么该方法什么都不会做,直接返回原字符串。
    • padString填充字符串。如果在填充过程中发现用不完这一整个填充字符串,则优先用左侧部分,能用多少用多少。该参数为可选参数,默认值为空格 ” “
  • 返回值
    • 在原字符串头部/尾部填充指定的填充字符串直到目标长度所形成的新字符串

2.3 例子

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "100");  // "1001001abc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0");     // "00000abc"
'abc'.padStart(1);          // "abc"

2.4 兼容性

注意:这是一个实验中的功能,未来浏览器可能会改变语法和功能。

浏览器 Chrome Edge Firefox Internet Explorer Opera Safari
支持 57 15 48 No 44 10
浏览器 Android webview Chrome for Android Edge mobile Firefox for Android IE mobile Opera Android iOS Safari
支持 ? 57 Yes 48 No ? 10

2.5 其他:

  • 为什么这两个填充方法不叫做 padLeft 和 padRight ?
    • 对于双向或从右到左的语言, left 和 right 这两个词显然容易混淆。因此,padStart 和 padEnd 的命名遵循了现有的 startsWith 和 endsWith 名称。

3、Object.values(obj)(遍历对象值)

方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。

3.1 存在的意义

  • 以前有Object.keys,可以遍历对象的Key,所以遍历value的话只能这样获取:
var values = [];
Object.keys(obj).forEach(function(key){
    values.push(obj[key])
})

现在只需要

var values = Object.values(obj)

3.2 语法

Object.values(obj)
  • 参数

    • obj 被返回可枚举属性值的对象。(TODO:拓展可枚举属性值)
  • 返回值

    • 一个包含对象自身的所有可枚举属性键值的数组

3.3 例子

var obj = { foo: "bar", baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]

// array like object 长得像有序下标数组的对象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

// array like object with random key ordering 长得像无序下标数组的对象 
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']注意顺序

// getFoo is property which isn't enumerable 可枚举属性值
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = "bar";
console.log(Object.values(my_obj)); // ['bar']

// non-object argument will be coerced to an object 字符串
console.log(Object.values("foo")); // ['f', 'o', 'o'] 实际上string 是 char 的数组['f', 'o', 'o']

3.4 兼容性

Feature Chrome Edge Firefox Internet Explorer Opera Safari
Basic support 54 Yes 47 No Yes 10.1
浏览器 Android webview Chrome for Android Edge mobile Firefox for Android IE mobile Opera Android iOS Safari
支持 54 54 Yes 48 No ? 10

3.5 其他相关:

  • Enumerability and ownership of properties
  • Object.keys()
  • Object.entries()
  • Object.prototype.propertyIsEnumerable()
  • Object.create()
  • Object.getOwnPropertyNames()

4、Object.entries(obj) (遍历对象键值对)

Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。

4.1 存在的意义

  • 由于ES5,ES6,ES7并没有提供遍历对象的键-值对属性的接口,所以可能官方脑袋一热,有了获取对象键集合的方法,也有了获取对象值集合的方法,那就再来一个键值对吧。

4.2 语法

Object.entries(obj)
  • 参数
    • obj 被返回可枚举属性值的对象。(TODO:拓展可枚举属性值)
  • 返回值
    • 给定对象自身可枚举属性的键值对数组。

4.3 例子

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

// array like object
const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

// array like object with random key ordering
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]

// getFoo is property which isn't enumerable
const myObj = Object.create({}, { getFoo: { value() { return this.foo; } } });
myObj.foo = 'bar';
console.log(Object.entries(myObj)); // [ ['foo', 'bar'] ]

// non-object argument will be coerced to an object
console.log(Object.entries('foo')); // [ ['0', 'f'], ['1', 'o'], ['2', 'o'] ]

// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}

// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});
  • new Map() 构造函数接受一个可迭代的entries。借助Object.entries方法你可以很容易的将Object转换为Map:
var obj = { foo: "bar", baz: 42 }; 
var map = new Map(Object.entries(obj));
console.log(map); // Map { foo: "bar", baz: 42 }

4.4 兼容性

浏览器 Chrome Edge Firefox Internet Explorer Opera Safari
支持 54 Yes 47 No Yes 10.1
手机浏览器 Android webview Chrome for Android Edge mobile Firefox for Android IE mobile Opera Android iOS Safari
支持 54 54 Yes 47 No No No

4.5 其他相关

  • 属性的可枚举性和所有权
  • Object.keys()
  • Object.values()
  • Object.prototype.propertyIsEnumerable()
  • Object.create()
  • Object.getOwnPropertyNames()

5、async、await(异步处理)

像同步一样写异步的代码

5.1 存在的意义

js一个重大的特点就是异步,但是人类的思维模式天然是同步的。所以要把异步和同步的流程化统一起来。
直接上例子:
- 回调地狱

getData(data => {
  getMoreData(data2 =>{
    getMoreData(data3 =>{

    })
  })
})
  • JQuery解决方法
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
def1.done(def2.resolve)
def2.done(def3.resolve)
def3.done(function(){})
  • ES6 Promise
new Promise().then().then()...

后面的虽然解决了回调地狱,但是本质上还是回调。
- 对比java/javascript redis操作
- java

Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
jedis.set("key", "Hello world");
String key = jedis.get("key")
System.out.println("redis 存储的字符串为: "+ key)
  • javascript
let client = redis.createClient(RDS_PORT,.RDS_HOST,.RDS_OPTS);
client.select(RDS_DATABASE)
client.hmset("key", "Hello world",function(){
  client.hmget("key",function(data){
    console.log(data)
  })
});

5.2 语法

async function name([param[, param[, ... param]]]) { statements }
[return_value] = await expression; 
  • 参数
  • async:要传递给函数的参数的名称
  • 返回值

5.3 例子

ES7,asyns和await 更配哦

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function add1(x) {
  var a = resolveAfter2Seconds(20);
  var b = resolveAfter2Seconds(30);
  return x + await a + await b;
}
var  ajax = () => {
    return new Promise(resolve =>{
        setTimeout(() => {
            resolve("done");
        }, 2000);
    })
}

async function getData(x) {
  var a = await ajax();
  console.log(a)
}
  • await:如果该值不是一个 Promise,await 会把该值转换为已正常处理的Promise,然后等待其处理结果。
async function myFetch(){ 
    let res = await fetch("http://www.baidu.com/json")
    let result = await res.json()
    return result
}

myFetch().then(data => console.log(JSON.stringify(data)))

5.4 兼容性

浏览器 Chrome Edge Firefox Internet Explorer Opera Safari
支持 55 Yes 52 No 42 10.1
手机浏览器 Android webview Chrome for Android Edge mobile Firefox for Android IE mobile Opera Android iOS Safari
支持 Yes 55 Yes 52 No 42 10.1

5.5 其他相关

  • AsyncFunction object

6、Object.getOwnPropertyDescriptor ()

方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)。

6.1 存在的意义

  • 该方法的提出目的,主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题。。

6.2 语法

Object.getOwnPropertyDescriptor(obj, prop)
  • 参数
    • obj 需要查找的目标对象
    • prop目标对象内属性名称(String类型)
  • 返回值
    • 如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined
    • 一个属性描述符是一个记录,由下面属性当中的某些组成的:
    • value该属性的值(仅针对数据属性描述符有效)
    • writable 当且仅当属性的值可以被改变时为true。(仅针对数据属性描述有效)
    • get 获取该属性的访问器函数(getter)。如果没有访问器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
    • set 获取该属性的设置器函数(setter)。 如果没有设置器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
    • configurable 当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
    • enumerable当且仅当指定对象的属性可以被枚举出时,为 true。

6.3 例子

//拷贝对象
var obj = {
    a:"a",
    get b(){return "b"}
}
var obj1 = Object.assign({},obj)
var obj2 = Object.create(  
    Object.getPrototypeOf(obj),  
    Object.getOwnPropertyDescriptors(obj)  
)
console.log(obj)//{a: "a"}
console.log(JSON.stringify(obj))//{"a":"a","b":"b"}

console.log(obj1)//{a: "a", b: "b"}
console.log(JSON.stringify(obj1))//{"a":"a","b":"b"}

console.log(obj2)//{a: "a"}
console.log(JSON.stringify(obj2))//{"a":"a","b":"b"}
var obj = {
    a:"a",
    get b(){return "b"}
}
JSON.stringify(Object.getOwnPropertyDescriptors(obj))
/*
{
    "a":{
        "value":"a",
        "writable":true,
        "enumerable":true,
        "configurable":true
    },
    "b":{
        "enumerable":true,
        "configurable":true
    }
}
*/

6.4 兼容性

浏览器 Chrome Edge Firefox Internet Explorer Opera Safari
支持 ? ? 50 (50) ? ? ?
手机浏览器 Android webview Chrome for Android Edge mobile Firefox for Android IE mobile Opera Android iOS Safari
支持 ? ? ? 50.0 (50) ? ? ?

6.5 其他相关

7、函数参数列表与调用中的尾部逗号

允许在参数定义和函数调用后面使用逗号。

7.1 存在的意义

  • 重新排列元素项比较简单,如果你要改变最后一个元素项的位置,你不必添加和删除逗号。
  • 帮助版本控制系统跟踪实际发生的变化。

7.2 语法

function foo(
    param1,
    param2,
) {}

foo(param1,param3,)

7.3 例子

  • 同语法

7.4 兼容性

管好自己的双手,不要用这个方式写就好了。

7.5 其他相关:

8、共享内存与原子操作

SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象。对象,但它们可以用来在共享内存上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。

8.1 存在的意义

一个新的低级别Atomics命名空间对象和一个SharedArrayBuffer构造函数,来作为更高级别并发抽象的原始构建块。共享多个service worker和核心线程之间的SharedArrayBuffer对象的数据。在worker之间共享数据,改善worker之间的协调。

8.2 语法

new SharedArrayBuffer(length)

8.3 例子

8.4 兼容性

8.5 其他相关:

传送门

9、Array.prototype.includes

includes() 方法用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false。

9.1 存在的意义

includes() 方法用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false。

9.2 语法

arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
  • 参数
    • searchElement 需要查找的元素值。
    • fromIndex(可选) 从该索引处开始查找 searchElement。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
  • 返回值
    • 一个 Boolean。

9.3 例子

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true
  • 如果fromIndex 大于等于数组长度 ,则返回 false 。该数组不会被搜索。
var arr = ['a', 'b', 'c'];
arr.includes('c', 3);   //false
arr.includes('c', 100); // false
  • 如果 fromIndex 为负值,计算出的索引将作为开始搜索searchElement的位置。如果计算出的索引小于 0,则整个数组都会被搜索
var arr = ['a', 'b', 'c'];

arr.includes('a', -100); // true
arr.includes('b', -100); // true
arr.includes('c', -100); // true
  • includes() 方法有意设计为通用方法。它不要求this值是数组对象,所以它可以被用于其他类型的对象 (比如类数组对象)。下面的例子展示了 在函数的arguments对象上调用的includes() 方法。
(function() {
  console.log([].includes.call(arguments, 'a')); // true
  console.log([].includes.call(arguments, 'd')); // false
})('a','b','c');

9.4 兼容性

9.5 其他相关:

猜你喜欢

转载自blog.csdn.net/xiaolongbaobushibao/article/details/78685029
今日推荐