拥抱ES6 (一)


let和const


  • let,const和var一样,都可用来声明变量。但let,const声明的变量在提升过程中不会像var那样进行初始化赋值undefined。
  • 此外,let,const所声明的变量存在块级作用域和暂时性死区,能减少全局变量的污染。
  • 值得注意的是,let和const定义的变量在使用前必须先声明,否则报错。
  • 而对于const来说,定义常量这种说法更为确切,且值定义后无法改变(引用类型除外–内容可变,但引用不变)

example-01-块级作用域

{
var a=1;
let b=2;
}
console.log(a);//1
console.log(b);//报错 b is not defined
  • 为了更好的理解块级作用域,请看下边这两段代码
var arr = [];

for (var i = 0; i < 3; i++) {
arr[i] = function () {
console.log(i);
};
}
console.log(arr[0]()); // 3
console.log(arr[1]()); // 3
console.log(arr[2]()); // 3

  • 这里不会预期输出0,1,2,是因为用var声明的变量没有块级作用域,i在循环外也有效。
  • 等执行完,仅仅只有全局有一个i,这个i此时已经是3。
  • 把上边var定义的i换成let定义试试看

var arr = [];
for (let i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i);
};
}
console.log(arr[0]()); // 0
console.log(arr[1]()); // 1
console.log(arr[2]()); // 2
  • 这就是块级作用域的体现,此时在循环外访问i是访问不到的。每次循环i都各自保存自己的值,所以输出符合预期。

example–02-不初始化赋值

// var 的情况

console.log(a); // undefined

var a= 1;

// let 的情况

console.log(b); // 报错 b is not defined

let b= 2;

// const 的情况

// const声明一个只读的常量,不可变。

const c=1;

//报错 Assignment to constant variable.

c=2;

//const定义的常量必须初始化赋值

const d;

// SyntaxError: Missing initializer in const declaration

console.log(d)

解构赋值


  • ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
  • 注意模式匹配,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
  • 如果解构不成功,变量的值就等于undefined。

example–03-数组的解构赋值

//快速为变量赋值
var [a, b, c] = [1, 2, 3];
console.log(a);//1
console.log(b);//2
console.log(c);//3

//注意模式匹配
var [a, [[b], c]] = [1, [[2], 3]];
console.log(a)// 1
console.log(b)// 2
console.log(c)// 3

// 可以只获取自己想要的
var[ , , c] = ["a", "b", "c"];
console.log(c) // c

var [x, , z] = [1, 2, 3];
console.log(x)// 1
console.log(z)// 3

example-04-字符串的解构赋值

const [a, b] = '高芊';
console.log(a) // 高
console.log(b) // 芊

example-05-函数的解构赋值

function add([x, y]){
return x + y;
}

add([1, 2]); // 3

…语法


  • 对于数组和对象而言,…运算符超级好用,可将参数列表或对象属性一一拆解,也可重新拼凑。
  • 值得注意的是:对象的解构与数组有一个重要的不同,数组的元素是按次序排列的,变量的取值由它的位置决定;
  • 对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

example–06-…语法

//一一拆解后拼凑
var obj={name:"高芊",like:"编程"}
var selfObj={...obj}//相当于拷贝
console.log(selfObj)//{name:"高芊",like:"编程"}

//一一拆解
var { a, b} = { a: "aaa", b: "bbb" };
console.log(a) // aaa
console.log(b) // bbb


//此时的b实际时剩余项组成的数组

var [a, ...b] = [1, 2, 3, 4];
console.log(a) // 1
console.log(b) // [2, 3, 4]

example-07-复杂对象解构

  • 注意,此时p是一种模式,不是变量,故不会被赋值
var obj = {
p: [
'Hello',
{ b: 'World' }
]
};

var { p: [a, { b }] } = obj;
console.log(a) // "Hello"
console.log(b) // "World"
  • 如果p也要作为变量赋值,可以写成下面这样。
var obj = {
p: [
'Hello',
{ b: 'World' }
]
};

var { p,p: [a, { b }] } = obj;
console.log(a) // "Hello"
console.log(b) // "World"
console.log(p) // ['Hello', { b: 'World' } ]

  • 下面代码有4次解构赋值,分别是对loc、start、line、column四个属性的解构赋值。
  • 注意,最后一次对line,column属性的解构赋值之中,只有line,column是变量,loc和start都是模式,不是变量。

var  node = {
loc: {
start: {
line: 1,
column: 5
}
}
};

var { loc, loc: { start }, loc: { start: { line,column }} } = node;

console.log(line) // 1
console.log(column) // 5
console.log(start) // {line: 1, column: 5}
console.log(loc) //{start: {line: 1, column: 5}}

字符串方法扩展


  • es5只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。
  • ES6 又提供了三种新方法:includes, startsWith,endsWith。
  • 此外,还有两个常用于数据处理的padStart,padEnd
  • includes():返回布尔值,判断是否找到了参数字符串。
  • startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
  • padStart():前补位 param1:最大长度; param2:未达到最大长度情况下补充的内容
  • padEnd():后补位 param1:最大长度; param2:未达到最大长度情况下补充的内容

example-08-字符串扩展方法

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

时间处理

function dateFormat(date=new Date()) {
let y = date.getFullYear().toString();
let m = (date.getMonth() + 1).toString().padStart(2,'0');
let d = date.getDate().toString().padStart(2,'0');
let h = date.getHours().toString().padStart(2,'0');
let M = date.getMinutes().toString().padStart(2,'0');
let s = date.getSeconds().toString().padStart(2,'0');
return y + m + d + " " +h + ":" + M + ":" +s;
}
console.log(dateFormat())
//20191208 12:39:38 注意日期:08 前置补了一个0