ES6常用语法

ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。

let 声明的变量只在 let 命令所在的代码块内有效。

const 声明一个只读的常量,一旦声明,常量的值就不能改变。

let 命令

1.不存在变量提升

let 不存在变量提升,var 会变量提升:

console.log(a); //ReferenceError: a is not defined

let a = 1;

console.log(b); //undefined

var b = 2;

 

2.不能重复声明

同一作用域下不能重复定义同一名称;

let 只能声明一次 var 可以声明多次:

let a = 1;

let a = 2;

var b = 3;

var b = 4;

// Identifier 'a' has already been declared

// 4

let在for 循环计数器使用:

for (var i = 0; i < 10; i++) { 

  setTimeout(function(){ 

    console.log(i);

  }) 

// 输出十个 10 

for (let j = 0; j < 10; j++) { 

  setTimeout(function(){ 

    console.log(j);

  }) 

// 输出 0123456789

 

 

3. 有严格的作用域

let 是在代码块内有效,var是函数作用域在全局范围内有效:

{

let a = 0;

var b = 1;

}

a // ReferenceError: a is not defined

b // 1

 

const 命令

const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。

基本类型,不能修改;

const a = 100;

a = 1000;//erroe

对于引用类型,指定内存地址,可以增加属性值

const obj = {};

obj.id = 1;

console.log(obj);//{id:1}

const arr = [];

arr.push(1);

console.log(arr)//arr[0] = 1;

ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量之前使用它会报错。

 

 

箭头函数

  1. 简化函数的定义

         //函数表达式--先定义后调用;函数声明-提前解析可以提前调用

var f1 = function(v){

return v;

};

Let f1 = v => v;//变量名 = 参数 =>函数体

      2.没有参数

var f2 = function(){

return 1234;

};

Let f2 = () =>1234;

       3.多个参数

var f3 = function(v1,v2){

  return v1+v2;

};

Let f3 = (v1,v2) =>v1+v2;

 

 数据结构SetMap

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:

Const s  = new Set();//类似于数组,成员唯一;

S.add(1).add(2).add(3)//链式

Var arr = [1,2,4,1,1];

Const  s1  = new Set(arr);//{1,2,4}直接去重

 

// Array 转 Set 

var mySet = new Set(["value1", "value2", "value3"]);

// 用...操作符,将 Set 转 Array 

var myArray = [...mySet];

String // String 转 Set 

var mySet = new Set('hello');  // Set(4) {"h", "e", "l", "o"} 

// 注:Set 中 toString 方法是不能将 Set 转换成 String

Set 对象作用

数组去重

var mySet = new Set([1, 2, 3, 4, 4]);

[...mySet]; // [1, 2, 3, 4]

并集

var a = new Set([1, 2, 3]);

var b = new Set([4, 3, 2]);

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

交集

var a = new Set([1, 2, 3]);

var b = new Set([4, 3, 2]);

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

差集

var a = new Set([1, 2, 3]);

var b = new Set([4, 3, 2]);

var difference = new Set([...a].filter(x => !b.has(x))); // {1}

 

Map 对象

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

Maps 和 Objects 的区别

一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。

const m = new Map();

m.set(‘name’,’amy’).set(‘age’,18);

for...of

var myMap = new Map();

myMap.set(0, "zero");

myMap.set(1, "one");

// 将会显示两个 log。 一个是 "0 = zero" 另一个是 "1 = one" 

for (var [key, value] of myMap) {  

console.log(key + " = " + value);

for (var [key, value] of myMap.entries()) { 

console.log(key + " = " + value);

/* 这个 entries 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。 */

 // 将会显示两个log。 一个是 "0" 另一个是 "1" 

for (var key of myMap.keys()) {  

console.log(key); } 

/* 这个 keys 方法返回一个新的 Iterator 对象, 它按插入顺序包含了 Map 对象中每个元素的键。 */ 

// 将会显示两个log。 一个是 "zero" 另一个是 "one" 

for (var value of myMap.values()) {  

console.log(value);} 

/* 这个 values 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的值。 */

forEach()

var myMap = new Map();

myMap.set(0, "zero");

myMap.set(1, "one");

// 将会显示两个 logs。 一个是 "0 = zero" 另一个是 "1 = one" 

myMap.forEach(function(value, key) { 

console.log(key + " = " + value);

}, myMap)

 

Map 对象的操作

Map 与 Array的转换

var kvArray = [["key1", "value1"], ["key2", "value2"]];
 
 
// Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
var myMap = new Map(kvArray);
 
 
// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
var outArray = Array.from(myMap);

Map 的克隆

var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
var myMap2 = new Map(myMap1);
console.log(original === clone); // 打印 false。 Map 对象构造函数生成实例,迭代出新的对象。

Map 的合并

var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three
var merged = new Map([...first, ...second]);

 

  

数组中循环遍历方法有一个map()和上述Map新数据结构不相同;

和forEach()区别

forEach是没有返回值

posted @ 2019-03-04 00:25  小码农+1  阅读(208)  评论(0编辑  收藏  举报