ES6(二)

简介: es6相关知识

对象的扩展

ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。

const foo = 'bar';
const baz = {
   
   foo};
baz // {foo: "bar"}

// 等同于
const baz = {
   
   foo: foo};

对象的展开运算符

展开对象

const apple = {
   
   
    color: '红色',
    shape: '球形',
    taste: '甜'
};
console.log({
   
   ...apple});            // { color: '红色', shape: '球形', taste: '甜' }
console.log({
   
   ...apple} === apple);    // false
const apple = {
   
   
    color: '红色',
    shape: '球形',
    taste: '甜'
};

const pen = {
   
   
    color: '黑色',
    shape: '圆柱形',
    use: '写字'
};

// 新对象拥有全部属性,相同属性,后者覆盖前者
console.log({
   
   ...apple, ...pen});    // { color: '黑色', shape: '圆柱形', taste: '甜', use: '写字' }
console.log({
   
   ...pen, ...apple});    // { color: '红色', shape: '球形', use: '写字', taste: '甜' }

非对象的展开

console.log({
   
   ...1});            // {}
console.log(new Object(1));        // [Number: 1]
console.log({
   
   ...undefined});    // {}
console.log({
   
   ...null});            // {}
console.log({
   
   ...true});            // {}

Object.is()

Object.is('foo', 'foo')
// true
Object.is({
   
   }, {
   
   })
// false

Object.assign()

const target = {
   
    a: 1 };

const source1 = {
   
    b: 2 };
const source2 = {
   
    c: 3 };

Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}

字符串的扩展

字符串拼接的巨大区别

const person = {
   
   
    name: 'zjr',
    age: 18,
    sex: '男'
};

const info =
    '我的名字是:' + person.name +
    ',性别是:' + person.sex +
    ',今年:' + person.age + '岁';

console.log(info);

// 我的名字是:zjr,性别是:男,今年:18岁
const person = {
   
   
    name: `zjr`,
    age: 18,
    sex: `男`
};

const info = `我的名字是:${person.name},性别是:${person.sex},今年:${
     
     person.age}岁`;

console.log(info);

// 我的名字是:zjr,性别是:male,今年:18岁

includes(), startsWith(), endsWith()

includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。

let s = 'Hello world!';

s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
let s = 'Hello world!';

s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false

repeat()

'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""

padStart(),padEnd()

ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'

'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'

trimStart(),trimEnd()

trimStart()和trimEnd()这两个方法,它们的行为与trim()一致,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。

const s = '  abc  ';

s.trim() // "abc"
s.trimStart() // "abc  "
s.trimEnd() // "  abc"

运算符扩展

指数运算符

2 ** 2 // 4
2 ** 3 // 8

Set

Set 是一系列无序、没有重复值的数据集合。

const s = new Set();
s.add(1);
s.add(2);

// Set 中不能有重复的成员
s.add(1);
console.log(s);        // Set(2) { 1, 2 }

// Set 没有下标去标识每一个值,所以 Set 是无序的,也不能像数组那样通过下标去访问 Set 的成员。

方法

add 方法

const s = new Set();
s.add(0);
// 可以连写
s.add(1).add(2).add(2).add(3);
console.log(s);        // Set(4) { 0, 1, 2, 3 }

has 方法

const s = new Set();
s.add(0);
s.add(1).add(2).add(2).add(3);
console.log(s.has(1));    // true
console.log(s.has(4));    // false

delete 方法

const s = new Set();
s.add(0);
s.add(1).add(2).add(2).add(3);
s.delete(2);
// 使用 delete 删除不存在的成员,什么都不会发生,也不会报错
s.delete(4);
console.log(s);    // Set(3) { 0, 1, 3 }

clear 方法

const s = new Set();
s.add(0);
s.add(1).add(2).add(2).add(3);
s.clear();
console.log(s);    // Set(0) {}

forEach 方法

const s = new Set();
s.add(0);
s.add(1).add(2).add(2).add(3);

s.forEach(function (value, key, set) {
   
   
    // Set 中 value = key,原因:好多数据结构都有 forEach 方法,为了方便统一,所以参数是统一的,但是参数的意义各有不同
    // set 就是 s 本身
    console.log(value, key, set === s);
    console.log(this);
});

/*
0 0 true
Window
1 1 true
Window
2 2 true
Window
3 3 true
Window 
*/

size 属性

const s = new Set();
s.add(0);
s.add(1).add(2).add(2).add(3);

console.log(s.size);    // 4

应用

数组去重

const s = new Set([1, 2, 1]);
console.log(s);            // Set(2) { 1, 2 }
console.log([...s]);    // [ 1, 2 ]

字符串去重

const s = new Set('abbacbd');
console.log(s);                    // Set(4) { 'a', 'b', 'c', 'd' }
console.log([...s].join(''));    // abcd

因此使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// (a 相对于 b 的)差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}

在这里插入图片描述

Map

Map 可以理解为:“映射”。

Map 和 对象 都是键值对的集合。

// 键 ——> 值,key ——> value
// 对象:
const person = {
   
   
    name: 'alex',
    age: 18
};

// Map:
const m = new Map();
m.set('name', 'alex');
m.set('age', 18);
console.log(m);        // Map(2) { 'name' => 'alex', 'age' => 18 }

// Map 和 对象 的区别:
// 对象一般用字符串当作 “键”(当然在书写时字符串键的引号可以去掉).
// Map 中的 “键” 可以是一切类型。
const m = new Map();
m.set(true, 'true');
m.set({
   
   }, 'object');
m.set(new Set([1, 2]), 'set');
m.set(undefined, 'undefined');
console.log(m);
/*
Map(4) {
  true => 'true',
  {} => 'object',
  Set(2) { 1, 2 } => 'set',
  undefined => 'undefined'
}
*/

方法

set 方法
set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。

const m = new Map();

m.set('edition', 6)        // 键是字符串
m.set(262, 'standard')     // 键是数值
m.set(undefined, 'nah')    // 键是 undefined

get 方法
get方法读取key对应的键值,如果找不到key,返回undefined。

const m = new Map();

const hello = function() {
   
   console.log('hello');};
m.set(hello, 'Hello ES6!') // 键是函数

m.get(hello)  // Hello ES6!

has 方法
has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。

const m = new Map();

m.set('edition', 6);
m.set(262, 'standard');
m.set(undefined, 'nah');

m.has('edition')     // true
m.has('years')       // false
m.has(262)           // true
m.has(undefined)     // true

delete 方法
delete方法删除某个键,返回true。如果删除失败,返回false。

const m = new Map();
m.set(undefined, 'nah');
m.has(undefined)     // true

m.delete(undefined)
m.has(undefined)       // false

clear 方法
clear方法清除所有成员,没有返回值。

let map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 2
map.clear()
map.size // 0

forEach 方法

m.forEach(function (value, key, map) {
   
   
    console.log(this);
}, document);

size 属性
size属性返回 Map 结构的成员总数。

const map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 2
目录
相关文章
|
1月前
|
存储 JavaScript 前端开发
什么是Es6,有什么特点
什么是Es6,有什么特点
37 1
|
2月前
|
前端开发
关于es6
关于es6
13 0
|
7月前
|
存储 JavaScript 前端开发
ES6
ES6
48 1
|
前端开发 索引
ES7,ES8
ES7,ES8
66 0
|
前端开发 JavaScript API
ES6-day03
ES6-day03
63 0
|
前端开发 Java 网络架构
ES6(总结)
ES6(总结)
72 0
|
JSON JavaScript 前端开发
ES5和ES6的介绍
《前端基础》
435 0
|
前端开发 JavaScript 网络架构
除了ES6,ES还有那些必须要懂得知识?
Includes 方法用来检测数组中是否包含某个元素,返回布尔类型值。
109 0
除了ES6,ES还有那些必须要懂得知识?
|
JavaScript 前端开发 Java
ES6+
ES6+
165 0
|
JavaScript
浅谈一下ES6的提升
es6的提升 在es6之前,我们定义定义变量的时候,只能使用var关键字来定变量,这样有一个问题,var定义的变量会成为全局变量。