集合
Set可以去除数组重复元素
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys
方法和values
方法的行为完全一致
let set = new Set(['red','green','blue']);
for (let item of set.keys()){
console.log(item);
}
// red
// green
// blue
let set = new Set(['red','green','blue']);
for (let item of set.values()){
console.log(item);
}
// red
// green
// blue
Map 键值对的集合,其中的key值类型可以是任意类型,包括对象,数组
map的key值跟内存地址绑定,比如:
const map = new Map();
const k1 = ['a'];
const k2 = ['a'];
map
.set(k1, 111)
.set(k2, 222);
map.get(k1) // 111
map.get(k2) // 222
如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0
和-0
就是一个键,布尔值true
和字符串true
则是两个不同的键
let map = new Map();
map.set(-0, 123);
map.get(+0) // 123
map.set(true, 1);
map.set('true', 2);
map.get(true) // 1
map.set(undefined, 3);
map.set(null, 4);
map.get(undefined) // 3
字符串
静态字符串使用单引号,动态字符串使用反银行(注意字符串的连接)
// good
const a = 'foobar';
const b = `foo${a}bar`;
module
export
命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系,采用下面的格式进行(注意大括号括起来)
// 写法一
export var m = 1;
// 写法二
var m = 1;
export {m};
// 写法三
var n = 1;
export {n as m};
import
命令输入的变量都是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口。
import {a} from './xxx.js'
a = {}; // Syntax Error : 'a' is read-only;
import
命令具有提升效果,会提升到整个模块的头部,首先执行。
foo();
import { foo } from 'my_module';
import
是静态执行(编译时执行,区别于require),所以不能使用表达式和变量(运行时执行),这些只有在运行时才能得到结果的语法结构。
// 报错
import { 'f' + 'oo' } from 'my_module';
// 报错
let module = 'my_module';
import { foo } from module;
// 报错
if (x === 1) {
import { foo } from 'module1';
} else {
import { foo } from 'module2';
}
使用export default 命令的时候引出接口和引入接口不需要大括号,因为一个模块只能有一个默认输出,命令也只能使用一次
// export-default.js
export default function foo() {
console.log('foo');
}
// 或者写成
function foo() {
console.log('foo');
}
export default foo;
因为
export default
命令其实只是输出一个叫做
default
的变量,所以它后面不能跟变量声明语句。
// 正确
export var a = 1;
// 正确
var a = 1;
export default a;
// 错误
export default var a = 1;