深入浅出ES6---第一篇

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了。所以就算我们现在不打算使用ES6,但是也该懂点ES6的语法了。

let和const

这两个的用途与var类似,都是用来声明变量的,但在实际运用中他俩都有各自的特殊用途。
注意:ES6里let和const没有变量的提升,一定要声明后再使用,但代码编译成ES5之后,变量提升依旧存在.
let
(1)在ES5只有全局作用域和函数作用域,没有块级作用域,而let则实际上为JavaScript新增了块级作用域。用它所声明的变量,只在let命令所在的代码块内有效。

let name = 'yuu'

while (true) {
    let name = 'xiao'
    console.log(name)  //xiao
    break
}

console.log(name)  //yuu

(2)另外一个var带来的不合理场景就是用来计数的循环变量泄露为全局变量,而使用let则不会出现这个问题。

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
     
    console.log(i);
  };
}
a[6](); // 6

const
const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变,当我们尝试去改变用const声明的常量时,浏览器就会报错。
const有一个很好的应用场景,就是当我们引用第三方库的时声明的变量,用const来声明可以避免未来不小心重命名而导致出现bug.

const PI = Math.PI
PI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only

注意:当值为基础数据类型时,那么这里的值,就是指值本身。 而当值对应的为引用数据类型时,那么这里的值,则表示指向该对象的引用。这里需要注意,正因为该值为一个引用,只需要保证引用不变就可以,我们仍然可以改变该引用所指向的对象。

const obj = {
    a: 20,
    b: 30
}

obj.a = 30;
obj.c = 40;

console.log(obj); // Object {a: 30, b: 30,c:40}
这种情况下只要不是直接覆盖obj的值,只改变属性什么的还是还可以

模版字符串

模板字符串是为了解决使用+号拼接字符串的不便利而出现的。使用 反引号“(键盘上esc下面那个键) 将整个字符串包裹起来,而在其中使用 ${} 来包裹一个变量或者一个表达式。

// es5
var a = 20;
var b = 30;
var string = a + "+" + b + "=" + (a + b);

// es6
const a = 20;
const b = 30;
const string = `${a}+${b}=${a+b}`;

默认参数(Default Parameters)

以前我们通过下面方式来定义默认参数:

var link = function (height, color, url) {
    var height = height || 50;
    var color = color || 'red';
    var url = url || 'http://azat.co';
    ...
}

但是到参数值是0后,就有问题了,因为在JavaScript中,0表示fasle,它是默认被hard-coded的值,而不能变成参数本身的值。但在ES6,我们可以直接把默认值放在函数声明里:

var link = function(height = 50, color = 'red', url = 'http://azat.co') {
  ...
}

多行字符串(Multi-line Strings )

ES6的多行字符串是一个非常实用的功能。在ES5中,我们不得不使用以下方法来表示多行字符串:

alert("你好,\n 我叫\n yuu");

然而在ES6中,仅仅用反引号就可以解决了:

alert(`你好
我叫
olive`);

解构(destructuring)赋值

数组以序列号一一对应,这是一个有序的对应关系。
对象根据属性名一一对应,这是一个无序的对应关系。
数组的解构赋值

// es5
var arr = [1, 2, 3];
var a = arr[0];
var b = arr[1];
var c = arr[2];

// es6
const arr = [1, 2, 3];
const [a, b, c] = arr;
console.log(a,b,c)  // 1,2,3

对象的解构赋值

const MYOBJ = {
    className: 'trigger-button',
    loading: false,
    clicked: true,
    disabled: 'disabled'
}

// es5
var loading = MYOBJ.loading;
var clicked = MYOBJ.clicked;

// es6
const { loading, clicked } = MYOBJ;
console.log(loading);// false

// 还可以给一个默认值,当props对象中找不到loading时,loading就等于该默认值
const { loadings = false, clicked } = MYOBJ;
console.log(loadings);// false

展开运算符(spread operater)

在ES6中用…来表示展开运算符,它可以将数组方法或者对象进行展开。
1.函数调用中使用展开运算符

//函数调用里,将一个数组展开成多个参数,我们会用到apply:
function test(a, b, c) {
      }
var args = [0, 1, 2];
test.apply(null, args);

//ES6
function test(a,b,c) {
      }
var args = [0,1,2];
test(...args);

2.数组字面量中使用展开运算符
有了ES6,我们可以直接加一个数组直接合并到另外一个数组当中.

const arr1 = [1, 2, 3];
const arr2 = [...arr1, 10, 20, 30];

// 这样,arr2 就变成了[1, 2, 3, 10, 20, 30];

展开运算符也可以用在push函数中,可以不用再用apply()函数来合并两个数组.

var arr1=['a','b','c'];
var arr2=['d','e'];
arr1.push(...arr2); //['a','b','c','d','e']

3.用于解构赋值

let [arg1,arg2,...arg3] = [1, 2, 3, 4];
arg1 //1
arg2 //2
arg3 //['3','4']

注意:解构赋值中展开运算符只能用在最后,否则会报错
4.展开运算符可以将伪数组变成真正的数组

var list=document.querySelectorAll('div');
var arr=[..list];

Object.prototype.toString.apply(list) // "[object NodeList]"
 Object.prototype.toString.apply(arr) // "[object Array]"

你可能感兴趣的:(ES6,es6)