前端之ES6浅学习

ES6我没有学完,毕竟JS我也才过了一遍基础,其实我也就跟着B站Pink老师的视频学了一下CSS和JS,而且是跳跃式的学习,毕竟我不是前端,估计也不会以前端为职业。仅仅是为了兴趣,所以jQuery这等老爷爷级别的框架我就没学了,毕竟我不会维护老的项目。我学前端大概率就是从0-1搭建网站而已。

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

说人话就是ES6是JS的增添版,目的是为了使得JS更健壮而出来的。为什么要学它呢?因为JS有些语法太反人类,可能是反我这种小白,而ES6里好多新特性都真香。

一、let/const VS var

JS一直都是使用var,var的弊端就是作用域问题。首先说说我觉得的重要的区别:

  1. var会有声明提前,let不会
  2. var是全局作用域,let是块级作用域

var的声明提升貌似称为变量提升,就是无论你在哪里定义的var a;都会把a的声明编译时放在最前面。这里要重点提示一下,var a = 1;前面var a是声明,= 1是赋值。变量提升,仅仅是提升了var a。并没有提升赋值。下面代码就是所谓的变量提升。

console.log(a); //此时显示a为undefined
var a = 1;
//变量提升即为
var a;
console.log(a); //打印为undefined
a = 1;

//let不提升和
console.log(b); //直接报错
let b = 1;

接下来讲一下var 的全局作用域和let的块级作用域的区别。直接上代码吧,通俗易懂。

if(true){
    var a = 1;
}
console.log(a); //打印1
//let作用域展示
if(true){
    let b = 1; //b的作用域仅仅是在if条件内
}
console.log(b); //报错,提示b没有定义。

看完代码可以看到,全局内只要使用var声明了a,a就存在,是全局作用域。而let声明的是块级作用域,这里主要解决了ES5里面if和for等没有块级作用域,引入let之后就可以解决这个问题,从而不需要依赖函数的作用域了。这里需要注意的是在函数内,如果是想声明并赋值一个变量,一定要有声明(即var)不然该变量会变成全局变量。

ES6里面const用于定义常量。需要注意一下几点:

  1. const修饰的标识符为常量,不可以再次赋值
  2. 在使用const定义标识符,必须进行赋值
  3. 常量的含义是指向的对象不能修改,但是可以改变对象内部的属性。比如const app = new Vue({})里面的数据是可以修改的

二、ES6对象字面量增强写法

这里依然复习一下在JS里如何创建对象,有三种方式:

  1. 通过JS内置对象,此种方法用得少,需要慢慢添加属性

    var person = new Object();//创建基础对象实例
    person.name = 'll'; //给实例添加属性
    person.age = 28;//给实例添加属性
    
  2. 自定义构造函数实现,此方法的优势是一次创建构造函数,可以创建多个对象,大大简化代码

    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    var person = new Person('ll', 18);
    
  3. 直接定义,即使用对象字面量

    var person = {
        name: 'll';
        age: 18;
    }
    

那么对象字面量增强,我们也得先了解一下什么是对象字面量法,无代码无真相,如下。

const person = {
    name: 'll',
    age: 18,
    run: function(){
        console.log('running')
    },
    eat: function(){
        console.log('eating')
    }
}

这种是直接声明定义,假如我们需要添加性别属性怎么办?或者说我们声明对象的时候,还没想好是名字到底用哪个。还有字面量增强写法到底是什么呢?

//ES5写法
const name = 'll';
const age = 18;

const obj = {
    name: name,
    age: age
}

//ES6写法
const name = 'll';
const age = 18;

const obj = {
    name,
    age,
    run(){
        console.log('runnning');
    }
}

其实字面量增强说起来超级简单,就是以前在{}里面定义属性需要key: value型,现在在外面定了常量,直接使用key就好了。说到底,字面量增强只是简化了对象声明时的写法。不管用哪种,只要自己顺手都行。

三、ES6模块导入和导出

导入和导出使用的是import和export,接下来看看代码,感觉跟python很像。

导出:

//导出变量/常量
export var age = 18;
export var name = 'll';
export const sex = male;

//导出类
export class Person {
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
}

//导出函数
export function add(num1, num2){
    return num1 + num2;
}

导入:导入可以全部一起导入,也可以导入某几个,也可以指导入一个

//全部导入
import * as example from './example.js';

//导入几个
import {add, Person, age} from './example.js'

//导入一个
import {add} from './example.js'

此外还有默认导出:

function add(num1, num2){
    reutrn num1 + num2;
}

export default add;

导入默认导出的方式跟普通导出是一样的。

四、ES6箭头函数

箭头函数是什么?直接上代码吧

//箭头函数
let ccc = () => {}

//两个参数的箭头函数
const sum = (num1, num2) => {
    return num1 + num2;
}
//一个参数时的箭头函数,可以省略()
const power = num => {
    return num * num;
}

//只有一行代码的箭头函数,可以省略return自动返回
const mul = (num1, num2) => num1 * num2;

//只有一行代码,只有一个参数的箭头函数
const power = num => num * num;

够简单的吧?必然小括号里面就是形参,{}里的就是函数内部代码,ccc是函数名。上面代码接下来展示了两个参数时的形式,这也是标准形式。但是ES6处处替程序猿着想,该简写的一定能让你简写,简直太贴心了。但凡有一就可简写,只有一个参数时,可以省略括号,只有一行代码时,可以省略return。那么只有一个参数,一行代码,必然就是最后一个啦。要不是有个=>简直简略到认不出来了。

五、ES6的高阶函数

5.1 filter()

主要作用:过滤,返回一个数组

形参为回调函数,该函数的参数为要过滤数组的每一个元素,该回调函数必须返回boolean值,返回true时,将该元素加入新的数组中,返回false时,回调函数内部会过滤掉这次的元素

let nums = [1,2,3,4,5,6,7,8];
let newNew = nums.filter(function(item){
    return item < 4;
})
//newNew为[1,2,3];
使用箭头函数简写回调函数
let newNew = nums.filter(item => item < 4)

5. 2 map()

主要作用:将原来数组做一些操作输出新的数组

let nums = [1,2,3,4,5,6,7,8];
let numNew = nums.map(item => item * 10);
console.log(numNew);

5.3 reduce()

主要作用:对数组里的元素进行汇总

输入:两个参数,第一个参数是一个回调函数,该回调函数有两个参数,回调函数的第一个参数为输入数组的当前元素的上一个元素,回调函数的第二个参数为输入数组的当前元素。reduce的第二个参数为初始值。下面代码实现累加:

let nums = [20, 40, 60, 80];
//reduce实现累加
let total = nums.reduce((prev, cur) => prev + cur, 0);
console.log(total);

//reduce实现累乘
let sum = nums.reduce((prev, cur) => prev * cur, 1);
console.log(sum);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容