针对之前学习 Vue 用到的 es6 特性,以及接下来进一步学习 Vue 要用到的 es6 特性,做下简单总结。

var、let 与 const

var 与 let

es6 之前,JavaScript 并没有块级作用域,所谓的块,就是大括号里面的语句所组成的代码块,比如

  1. function fire(bool) {
  2. if (bool) {
  3. var foo = "bar";
  4. }
  5. console.log(foo);
  6. }
  7. fire(true); //=> bar

虽然变量 foo 位于 if 语句的代码块中,但是 JavaScript 并没有块级作用域的概念,因此被添加到了当前的执行环境 - 即函数中,在函数内都可以访问到。

另外一个令人困惑的地方是变量提升:

  1. function fire(bool) {
  2. if (bool) {
  3. var foo = "bar";
  4. } else {
  5. console.log(foo);
  6. }
  7. }
  8. fire(false); //=> undefined

我们都知道,直接访问一个未定义的变量,会报错:

  1. console.log(nope); //=> Uncaught ReferenceError: nope is not defined

但是在上述的例子中,会返回 undefined。也就是说,变量的定义被提升到了作用域的顶部,等价于:

  1. function fire(bool) {
  2. var foo;
  3. if (bool) {
  4. foo = "bar";
  5. } else {
  6. console.log(foo);
  7. }
  8. }
  9. fire(false);

而在 JavaScript 中,声明但是未赋值的变量会被赋值为 undefined,因此,结果输出 undefined

为了解决上述问题,引入了 let 关键字,let 定义的变量。

首先,let 定义的变量只在代码块内有效:

  1. function fire(bool) {
  2. if (bool) {
  3. let foo = "bar";
  4. }
  5. console.log(foo);
  6. }
  7. fire(true); //=> Uncaught ReferenceError: foo is not defined

其次, let 定义的变量不存在变量提升:

  1. function fire(bool) {
  2. if (bool) {
  3. let foo = "bar";
  4. } else {
  5. console.log(foo);
  6. }
  7. }
  8. fire(false); //=> Uncaught ReferenceError: foo is not defined

因此,使用 let,上述问题完全解决,这也告诉了我们,应当尽可能的避免用 var,用 let 来代替,除非你需要用到变量提升。

const

const 与 let 的基本用法相同,定义的变量都具有块级作用域,也不会发生变量提升。不同的地方在于,const 定义的变量,只能赋值一次。

对于基本类型来说,需要通过赋值来改变其值,因此 const 定义之后就相当于无法改变:

  1. const a = 1;
  2. a = 2; // Uncaught TypeError: Assignment to constant variable.
  3. ++a; // Uncaught TypeError: Assignment to constant variable.

对于数组和对象来说,值是可以改变的:

  1. const arr = ["a","b","c"];
  2. arr.push("d");
  3. arr.pop();

那么什么时候使用 const 呢? 在一些不需要重复赋值的场合可以用:

  1. const provinces = [];
  2. const months = [];

总而言之,多用 let 和 const,少用 var 。

箭头函数

在 Vue 中,使用箭头函数的最大好处就是可以让 this 指向 Vue 实例:

  1. var vm = new Vue({
  2. el:'#root',
  3. data:{
  4. tasks:[]
  5. },
  6. mounted(){
  7. axios.get('/tasks')
  8. .then(function (response) {
  9. vm.tasks = response.data;
  10. })
  11. }
  12. });

由于回调函数的 this 指向全局对象 window,因此,我们需要通过 vm 来访问实例的方法,如果使用箭头函数,则可以写成:

  1. new Vue({
  2. el:'#root',
  3. data:{
  4. tasks:[]
  5. },
  6. mounted(){
  7. axios.get('/tasks')
  8. .then(response => this.tasks = response.data);
  9. }
  10. });

箭头函数的 this 对象始终指向定义函数时所在的对象,相当于:

  1. var vm = new Vue({
  2. el:'#root',
  3. data:{
  4. tasks:[]
  5. },
  6. mounted(){
  7. var that = this;
  8. axios.get('/tasks')
  9. .then(function (response) {
  10. that.tasks = response.data;
  11. })
  12. }
  13. });

模板字符串

模板字符串为 Vue 的组件模板定义带来了巨大的便利,在此之前,需要这样定义一个模板:

  1. let template = '<div class="container"><p>Foo</p></div>';

如果要写成多行,可以用反斜杠:

  1. let template = '<div class="container">\
  2. <p>Foo</p>\
  3. </div>';

或者使用数组形式:

  1. let template = [
  2. '<div class="container">',
  3. '<p>Foo</p>',
  4. '</div>'
  5. ].join('');

如果要嵌入变量,可以写成:

  1. let name = "jack";
  2. let template = `<div class="container"><p>` + name + '</p></div>';

而使用模板字符串,则可以方便的在多行里面编写模板:

  1. let template = `
  2. <div class="container">
  3. <p>Foo</p>
  4. </div>
  5. `

由于模板字符串的空格和换行会被保留,为了不让首行多出换行符,可以写成:

  1. let template = `<div class="container">
  2. <p>Foo</p>
  3. </div>
  4. `

或者使用 trim() 方法从字符串中移除 前导 空格、尾随空格和行终止符。

  1. let template = `
  2. <div class="container">
  3. <p>Foo</p>
  4. </div>
  5. `.trim();

模板字符串嵌入变量或者表达式的方式也很简单:

  1. let name = "jack";
  2. let template = `
  3. <div class="container">
  4. <p>${name} is {100 + 100}</p>
  5. </div>
  6. `.trim();

默认参数

在 es6 之前,JavaScript 不能像 PHP 那样支持默认参数,因此需要自己手动定义:

  1. function takeDiscount(price, discount){
  2. discount = discount || 0.9;
  3. return price * discount;
  4. }
  5. takeDiscount(100);

es6 则允许定义默认参数

  1. function takeDiscount(price, discount = 0.9){
  2. return price * discount;
  3. }
  4. takeDiscount(100);

甚至可以以函数形式传递参数:

  1. function getDiscount(){
  2. return 0.9;
  3. }
  4. function takeDiscount(price, discount = getDiscount()){
  5. return price * discount;
  6. }
  7. takeDiscount(100);

rest 参数

先从函数的参数传递说起:

  1. function sum(a,b,c){
  2. let total = a + b + c;
  3. return total;
  4. }
  5. sum(1, 2, 3);

在 JavaScript 中,函数参数实际上以数组的方式进行传递,参数会被保存在 arguments 数组中,因此上例等价于:

  1. function sum(){
  2. let total = arguments[0] + arguments[1] + arguments[2];
  3. return total;
  4. }
  5. sum(1, 2, 3);

不过 arguments 不单单包括参数,也包括了其他东西,因此没法直接用数组函数来操作 arguments。如果要扩展成任意多个数值相加,可以使用循环:

  1. function sum() {
  2. let total = 0;
  3. for (let i = 0; i < arguments.length; i++) {
  4. total = total + arguments[i];
  5. }
  6. return total;
  7. }
  8. sum(1, 2, 3, 4, 6);

es6 则提供了 rest 参数来访问多余变量,上例等价于:

  1. function sum(...num) {
  2. let total = 0;
  3. for (let i = 0; i < num.length; i++) {
  4. total = total + num[i];
  5. }
  6. return total;
  7. }
  8. sum(1, 2, 3, 4, 6);

可以以变量形式进行传递:

  1. function sum(...num) {
  2. let total = 0;
  3. for (let i = 0; i < num.length; i++) {
  4. total = total + num[i];
  5. }
  6. return total;
  7. }
  8. let nums = [1, 2, 3, 4, 6];
  9. sum(...nums);

在函数中体内,num 就是单纯由参数构成的数组,因此可以用数组函数 reduce 来实现同样的功能:

  1. function sum(...num) {
  2. return num.reduce( (preval, curval) => {
  3. return preval + curval;
  4. })
  5. }
  6. sum(1, 2, 3, 4, 6);

... 还可以与其他参数结合使用,只需要将其他参数放在前面即可:

  1. function sum(total = 0, ...num) {
  2. return total + num.reduce( (preval, curval) => {
  3. return preval + curval;
  4. });
  5. }
  6. let nums = [1,2,3,4];
  7. sum(100, ...nums);

对象的简写

函数的简写

函数的简写,之前在 Vue 中已经用到过:

  1. Vue({
  2. el: '#root',
  3. data:data,
  4. methods: {
  5. addName: function() {
  6. vm.names.push(vm.newName);
  7. vm.newName = "";
  8. }
  9. }
  10. });

可以简写为:

  1. new Vue({
  2. el: '#root',
  3. data:data,
  4. methods: {
  5. addName() {
  6. vm.names.push(vm.newName);
  7. vm.newName = "";
  8. }
  9. }
  10. });

在组件中频繁用到:

  1. Vue.component('example',{
  2. data(){
  3. return {
  4. };
  5. }
  6. });

属性的简写

  1. let data = {
  2. message: "你好,Vue"
  3. };
  4. var vm = new Vue({
  5. el: '#root',
  6. data:data
  7. })

可以简写成:

  1. let data = {
  2. message: "你好,Vue"
  3. };
  4. var vm = new Vue({
  5. el: '#root',
  6. data
  7. })

也就是说,可以直接在对象中直接写入变量,当函数的返回值为对象时候,使用简写方式更加简洁直观:

  1. function getPerson(){
  2. let name = 'Jack';
  3. let age = 10;
  4. return {name, age};
  5. // 等价于
  6. // return {
  7. // name : name,
  8. // age : age
  9. // }
  10. }
  11. getPerson();

解构赋值

解构赋值可以方便的取到对象的可遍历属性:

  1. let person = {
  2. firstname : "steve",
  3. lastname : "curry",
  4. age : 29,
  5. sex : "man"
  6. };
  7. let {firstname, lastname} = person;
  8. console.log(firstname, lastname);
  9. // 等价于
  10. // let firstname = person.firstname;
  11. // let lastname = person.lastname;

可以将其用于函数传参中:

  1. function greet({firstname, lastname}) {
  2. console.log(`hello,${firstname}.${lastname}!`);
  3. };
  4. greet({
  5. firstname: 'steve',
  6. lastname: 'curry'
  7. });

Vue 2.0 入门系列(14)学习 Vue.js 需要掌握的 es6 (1)的更多相关文章

  1. Vue 2.0 入门系列(15)学习 Vue.js 需要掌握的 es6 (2)

    类与模块 类 es6 之前,通常使用构造函数来创建对象 // 构造函数 User function User(username, email) { this.username = username; ...

  2. vue 快速入门 系列 —— 初步认识 vue

    其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...

  3. Entity Framework 6.0 入门系列 第一篇

    Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...

  4. ABP入门系列目录——学习Abp框架之实操演练

    ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WE ...

  5. 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记

    VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...

  6. Vue 2.0入门基础知识之全局API

    3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...

  7. Vue 2.0入门基础知识之内部指令

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一 ...

  8. webpack3.10.0(入门系列基本概念1)

    一.概念 webpack的核心是一个用于现代JavaScript应用程序的静态模块打包程序.当webpack处理您的应用程序时,它会递归地构建一个依赖图,其中包含应用程序所需的每个模块,然后将所有这些 ...

  9. vue.js2.0实战(1):搭建开发环境及构建项目

    Vue.js学习系列: vue.js2.0实战(1):搭建开发环境及构建项目 https://my.oschina.net/brillantzhao/blog/1541638 vue.js2.0实战( ...

随机推荐

  1. 使用jquery给html标签加点击事件

    //直接给所有img标签绑定click事件 $("img").click(function(){ alert('你点击了图片'); }) //使用bind方法绑定click事件 $ ...

  2. IoC容器简介

    官网说明: 在核心的第7章节 1 Spring IoC 容器和 beans 简介 本章介绍了 Spring Framework implementation of the Inversion of C ...

  3. Markers

    immune pdf(file = paste0(outdir,"T_B_NK_feature.pdf")) VlnPlot(expr_1_4,features = c(" ...

  4. 【转载】自动化运维系列之Cobbler给Openstack节点安装操作系统

    preface 我们在一篇博文知道了如何搭建Cobbler,那么下面就通过Cobbler来安抓Openstack所有节点吧. 服务器配置信息如下: 主机名 IP 角色 Cobbler.node.com ...

  5. nginx 日志文件分隔

    Nginx命令 Nginx命令帮助如下 nginx -h nginx version: nginx/0.8.45 Usage: nginx [-?hvVt] [-s signal] [-c filen ...

  6. c++结构体、共用体和枚举

    结构体类型 c++中的结构体成员既可以是数据,也可以是函数 c语言中定义结构体变量必须加struct(这也是很多时候和typedef),但是在c++里面,可以不加 结构体和类的不同在于,结构体中的变量 ...

  7. crontab定时调度shell脚本

    本人最近要用crontab做一个定时调度任务,调一个启动脚本去执行jar包,并给main方法传一个日期参数. Linux系统:CentOS7 输入: crontab -e 在里面编写: SHELL=/ ...

  8. 百度编辑器ueditor上传图片失败,显示上传错误,实际上图片已经传到服务器或者本地

    报错,上传失败,图片没有显示,且调试response没有信息,但是图片已经上传到了本地 这个问题是因为ueditor里面的Upload.class.php里面__construct()方法里面的ico ...

  9. git && github 相关

    权限问题(error: The requested URL returned error: 403 Forbidden while accessing):1. 将自己机器的ssh public key ...

  10. Python 使用Qt进行开发(二)

    上次简单实现了显示窗口,下面我们在窗口中加入一些部件. 1,我们在窗口中使用 setToolTip() 方法添加一个文本提示,在窗口中鼠标暂停几秒即可显示该文本信息. class test(): de ...