针对以前学习 Vue
用到的 es6
特性,以及接下来进一步学习 Vue
要用到的 es6
特性,作下简单总结。ios
es6
以前,JavaScript 并无块级做用域,所谓的块,就是大括号里面的语句所组成的代码块,好比es6
function fire(bool) { if (bool) { var foo = "bar"; } console.log(foo); } fire(true); //=> bar
虽然变量 foo
位于 if
语句的代码块中,可是 JavaScript 并无块级做用域的概念,所以被添加到了当前的执行环境 - 即函数中,在函数内均可以访问到。axios
另一个使人困惑的地方是变量提高:数组
function fire(bool) { if (bool) { var foo = "bar"; } else { console.log(foo); } } fire(false); //=> undefined
咱们都知道,直接访问一个未定义的变量,会报错:函数
console.log(nope); //=> Uncaught ReferenceError: nope is not defined
可是在上述的例子中,会返回 undefined
。也就是说,变量的定义被提高到了做用域的顶部,等价于:学习
function fire(bool) { var foo; if (bool) { foo = "bar"; } else { console.log(foo); } } fire(false);
而在 JavaScript 中,声明可是未赋值的变量会被赋值为 undefined
,所以,结果输出 undefined
。this
为了解决上述问题,引入了 let
关键字,let
定义的变量。rest
首先,let
定义的变量只在代码块内有效:code
function fire(bool) { if (bool) { let foo = "bar"; } console.log(foo); } fire(true); //=> Uncaught ReferenceError: foo is not defined
其次, let
定义的变量不存在变量提高:component
function fire(bool) { if (bool) { let foo = "bar"; } else { console.log(foo); } } fire(false); //=> Uncaught ReferenceError: foo is not defined
所以,使用 let
,上述问题彻底解决,这也告诉了咱们,应当尽量的避免用 var
,用 let
来代替,除非你须要用到变量提高。
const
与 let
的基本用法相同,定义的变量都具备块级做用域,也不会发生变量提高。不一样的地方在于,const
定义的变量,只能赋值一次。
对于基本类型来讲,须要经过赋值来改变其值,所以 const
定义以后就至关于没法改变:
const a = 1; a = 2; // Uncaught TypeError: Assignment to constant variable. ++a; // Uncaught TypeError: Assignment to constant variable.
对于数组和对象来讲,值是能够改变的:
const arr = ["a","b","c"]; arr.push("d"); arr.pop();
那么何时使用 const
呢? 在一些不须要重复赋值的场合能够用:
const provinces = []; const months = [];
总而言之,多用 let
和 const
,少用 var
。
在 Vue 中,使用箭头函数的最大好处就是可让 this
指向 Vue 实例:
var vm = new Vue({ el:'#root', data:{ tasks:[] }, mounted(){ axios.get('/tasks') .then(function (response) { vm.tasks = response.data; }) } });
因为回调函数的 this
指向全局对象 window
,所以,咱们须要经过 vm
来访问实例的方法,若是使用箭头函数,则能够写成:
new Vue({ el:'#root', data:{ tasks:[] }, mounted(){ axios.get('/tasks') .then(response => this.tasks = response.data); } });
箭头函数的 this
对象始终指向定义函数时所在的对象,至关于:
var vm = new Vue({ el:'#root', data:{ tasks:[] }, mounted(){ var that = this; axios.get('/tasks') .then(function (response) { that.tasks = response.data; }) } });
模板字符串为 Vue 的组件模板定义带来了巨大的便利,在此以前,须要这样定义一个模板:
let template = '<div class="container"><p>Foo</p></div>';
若是要写成多行,能够用反斜杠:
let template = '<div class="container">\ <p>Foo</p>\ </div>';
或者使用数组形式:
let template = [ '<div class="container">', '<p>Foo</p>', '</div>' ].join('');
若是要嵌入变量,能够写成:
let name = "jack"; let template = `<div class="container"><p>` + name + '</p></div>';
而使用模板字符串,则能够方便的在多行里面编写模板:
let template = ` <div class="container"> <p>Foo</p> </div> `
因为模板字符串的空格和换行会被保留,为了避免让首行多出换行符,能够写成:
let template = `<div class="container"> <p>Foo</p> </div> `
或者使用 trim()
方法从字符串中移除 前导 空格、尾随空格和行终止符。
let template = ` <div class="container"> <p>Foo</p> </div> `.trim();
模板字符串嵌入变量或者表达式的方式也很简单:
let name = "jack"; let template = ` <div class="container"> <p>${name} is {100 + 100}</p> </div> `.trim();
在 es6
以前,JavaScript 不能像 PHP 那样支持默认参数,所以须要本身手动定义:
function takeDiscount(price, discount){ discount = discount || 0.9; return price * discount; } takeDiscount(100);
es6
则容许定义默认参数
function takeDiscount(price, discount = 0.9){ return price * discount; } takeDiscount(100);
甚至能够以函数形式传递参数:
function getDiscount(){ return 0.9; } function takeDiscount(price, discount = getDiscount()){ return price * discount; } takeDiscount(100);
先从函数的参数传递提及:
function sum(a,b,c){ let total = a + b + c; return total; } sum(1, 2, 3);
在 JavaScript 中,函数参数实际上以数组的方式进行传递,参数会被保存在 arguments
数组中,所以上例等价于:
function sum(){ let total = arguments[0] + arguments[1] + arguments[2]; return total; } sum(1, 2, 3);
不过 arguments
不仅仅包括参数,也包括了其余东西,所以无法直接用数组函数来操做 arguments
。若是要扩展成任意多个数值相加,可使用循环:
function sum() { let total = 0; for (let i = 0; i < arguments.length; i++) { total = total + arguments[i]; } return total; } sum(1, 2, 3, 4, 6);
es6
则提供了 rest 参数来访问多余变量,上例等价于:
function sum(...num) { let total = 0; for (let i = 0; i < num.length; i++) { total = total + num[i]; } return total; } sum(1, 2, 3, 4, 6);
能够以变量形式进行传递:
function sum(...num) { let total = 0; for (let i = 0; i < num.length; i++) { total = total + num[i]; } return total; } let nums = [1, 2, 3, 4, 6]; sum(...nums);
在函数中体内,num
就是单纯由参数构成的数组,所以能够用数组函数 reduce
来实现一样的功能:
function sum(...num) { return num.reduce( (preval, curval) => { return preval + curval; }) } sum(1, 2, 3, 4, 6);
...
还能够与其余参数结合使用,只须要将其余参数放在前面便可:
function sum(total = 0, ...num) { return total + num.reduce( (preval, curval) => { return preval + curval; }); } let nums = [1,2,3,4]; sum(100, ...nums);
函数的简写,以前在 Vue
中已经用到过:
Vue({ el: '#root', data:data, methods: { addName: function() { vm.names.push(vm.newName); vm.newName = ""; } } });
能够简写为:
new Vue({ el: '#root', data:data, methods: { addName() { vm.names.push(vm.newName); vm.newName = ""; } } });
在组件中频繁用到:
Vue.component('example',{ data(){ return { }; } });
let data = { message: "你好,Vue" }; var vm = new Vue({ el: '#root', data:data })
能够简写成:
let data = { message: "你好,Vue" }; var vm = new Vue({ el: '#root', data })
也就是说,能够直接在对象中直接写入变量,当函数的返回值为对象时候,使用简写方式更加简洁直观:
function getPerson(){ let name = 'Jack'; let age = 10; return {name, age}; // 等价于 // return { // name : name, // age : age // } } getPerson();
解构赋值能够方便的取到对象的可遍历属性:
let person = { firstname : "steve", lastname : "curry", age : 29, sex : "man" }; let {firstname, lastname} = person; console.log(firstname, lastname); // 等价于 // let firstname = person.firstname; // let lastname = person.lastname;
能够将其用于函数传参中:
function greet({firstname, lastname}) { console.log(`hello,${firstname}.${lastname}!`); }; greet({ firstname: 'steve', lastname: 'curry' });