这不是真的ES6之ECMAScript 6

薄洪涛6年前JS1145

最新想学习es6(elasticsearch6),在我的破服务器(512m内存)上搭建了java虚拟机(JVM)环境,首先说明一点,买服务器还是要买高配呀,如图

图片1.png

当我安装elasticsearch看到内存不足的时候,把默认内存4G改成128M,最终还是失败了,所以elasticsearch6的学习需要往后放一放了,我要一个大内存的服务器;

这是前言,既然elasticsearch6学不成了,我们就来学一下js的ES6的新特性

刚开始学vue或者react的时候,很多情况下都会去学ES6,但是特性那么多,并不需要我们全部都掌握,我们只需要掌握常用的,有用的就可以了;

敲黑板,来来来,划重点啦

1. 变量的声明方式

在es6之前,我们声明变量都是使用var关键字,在函数内部,使用var声明变量,都会被当做函数内部的全局变量

举个例子

function a(flag){
    if(flag){
        var str = 'hello';
        console.log(str)
    }else{
        console.log(str)
    }
}

这个例子中,咱们在if中声明了str变量,但是!!上诉函数和下面的函数是等价的

function aa(flag){
    var str;
    if(flag){
        str = 'hello';
        console.log(str)
    }else{
 //str在这里是undefined
        console.log(str)
    }
//str在这里是undefined
}

就是凡是在函数内部使用var声明的,都是函数内部的全局变量;这地方是不是很不科学?

这是由于js引擎扫描代码的机制造成的,当发现var声明变量时,会把声明提升到函数或者全局作用域的顶部

看下ES6的变量声明方式:let

function aaa(flag) {
    if(flag){
        let str = 'hello';
        console.log(str)
    }else{
 //str在这里访问不到
        console.log(str)
    }
}

那为什么,let变量在js引擎扫描的时候没有被提升呢?其实也是提升了的,let声明变量,作用域也会被提升到顶部,但是会被关起来;只有执行到变量声明这句话的时候,才会被放出来,才能使用这个变量。这就是传说中的TDZ(暂时性死区)

另外说一下ES6的另外一个声明变量的方式const

const 声明的变量必须提供一个值,而且会被认为是常量,意思就是它的值被设置完成后就不能再修改了。

function b() {
    const name = 'bohongtao'
    //这是错误的
    name = '机智的Coder'
}

特别注意如果const声明的是一个对象,那么对象内部的属性是可以改变的

2. 字符串的处理

 

不多说,直接上代码

function Splicing_es5(){
    var name = 'bohongtao';
    console.log("hello "+name);
}
function Splicing_es6(){
    const name = '机智的Coder';
    console.log(`hello ${name}`)
}

运行结果:

D:\git\base-js-code\es6>node demo1.js
hello bohongtao
hello 机智的Coder

看到这里我想起了之前拼接字符串的痛苦,并且留下了无知的泪水

图片2.png

注意,这里如果拼接多行字符串,在es6之前,我们需要用反斜杠\来连接多行,es6中只需要用反引号括起来就可以了

字符串的常用用法如下

// 1. 判断子串是否包含 return bool
const str = 'helloworld';
console.log(str.includes('d'));// bool
// 2. 重复字符串
const repeat_str = "ha";
console.log(repeat_str.repeat(2));
// 3. startsWith 和 endsWith 判断是否以 给定文本 开始或者结束
// 这个是我最喜欢的功能啊,和python一样,使用频率挺高的
const test_str =  'hello world!';
console.log(test_str.startsWith('hello'));
console.log(test_str.endsWith('!'));

下面是函数的用法

第一.增加了函数参数的默认值

function default_value_es5(flag) {
    flag = flag || 'error';
    console.log(flag)
    //console.log(flag || 'error')  其实我可以这样写的
}
function default_value_es6(flag='error') {
    console.log(flag)
}

在项目中,我按照es6使用了默认值,在chrome中是没问题的,但是在低版本的IE中是会出现错误的,所以还是要注意下这里

第二.箭头函数

使用箭头函数的好处:a.创建函数不需要function关键字来 b.省略return 

var people = (name, age) => {
    const fullName = 'hello'
    return `hello ${name} ,you is ${age}`
}

运行结果:

D:\git\base-js-code\es6>node demo1.js
hello bohongtao ,you is 23

当只有一个参数时,可以省略return和{}

var people = name => 'hello ' + name;
console.log(people('bohongtao'));

运行结果:

D:\git\base-js-code\es6>node demo1.js
hello bohongtao

3.对象的描述

es6以前,对象都是按照键值对的方式初始化,es6中可以简写啦,优点就是再也不用乱起名字啦

function people_es5(name,age) {
    return {
        name:name,
        age:age
    }
}
function people_es6(name,age) {
    return {
        name,
        age
    }
}

运行结果:

D:\git\base-js-code\es6>node demo1.js
{ name: 'bohongtao', age: 23 }
 
D:\git\base-js-code\es6>node demo1.js
{ name: 'bohongtao', age: 23 }

4.对象数据的访问

ES6中新增了解构(将数据结构分解成更小部分的过程)

举个例子

const people = {
    name: 'bohongtao',
    age: 23
};
const name = people.name;
const age = people.age;
console.log(name + ' --- ' + age)

运行结果:

D:\git\base-js-code\es6>node demo1.js
bohongtao --- 23

这个是es5的写法,很是熟悉对不,缺点:如果对象里面的数据很多,你要一个一个获取,要写多少行啊

看下es6的写法

const people = {
    name: 'bohongtao',
    age: 23
};
const { name, age } = people
console.log(`${name} --- ${age}`)

运行结果:

D:\git\base-js-code\es6>node demo1.js
bohongtao --- 23

还不过瘾?继续

//数组
const info = ['bohongtao', '22'];
const [name, age] = info;
console.log(name);
console.log(age);

运行结果:

D:\git\base-js-code\es6>node demo1.js
bohongtao
22

5. 展开运算符...

 

第一个作用合并对象或者数组,以数组为例,相同的键值,右边覆盖左边

const info1 = ['name', 'age'];
const info2 = [...info1, 'sex', 'like'];
console.log(info2);
D:\git\base-js-code\es6>node demo1.js
[ 'name', 'age', 'sex', 'like' ]

第二个作用剔除某些值

//数组
const before = ['name','age','sex'];
const [first, ...after] = before;
console.log(after);
D:\git\base-js-code\es6>node demo1.js
[ 'age', 'sex' ]

好了,ES6的新特性就说到这里,但是不止于此;

个人感觉,js咋越来越像python呢,像字符串的处理,生成器之类的


标签: es6ECMAScript

相关文章

ios textarea标签的placeholder属性多行时被隐藏

ios textarea标签的placeholder属性多行时被隐藏

我们使用的textarea 来做了病情描述,但是在ios手机上,当删除输入的文字后,placeholder显示不全,只有键盘收回的时候,才可以显示,如下图导致的原因目前不明确,但是百度上说有可能是以下...

JS浅拷贝导致的聊天信息丢失问题

JS浅拷贝导致的聊天信息丢失问题

问题背景我们做了一个基于vue的H5在线问诊项目,集成了融云IM,每次进入到会话页面的时候,需要恢复历史聊天数据,我们的历史聊天数据做了三层缓存,内存-->浏览器缓存(LocalStorage)...

vue如何在移动端调试

vue如何在移动端调试

    最近配合做vue的项目开发,我们前端遇到了一些问题,在调试android和ios样式兼容的时候,需要在手机上调试,但是又需要部署包发到服务器上,然后才能...

JsonP跨域请求详解

JsonP跨域请求详解

先来了解一下基本的概念,什么叫做跨域?举个例子,在localhost:8080上有一个ajax请求,代码如下<script src="js/jquery-1.7.2.js&q...

融云搭建IM在安卓微信浏览器无法播放声音

融云搭建IM在安卓微信浏览器无法播放声音

之前我们做了一个在线问诊的项目,基于融云和VUE搭建,在聊天的时候,接收到语音消息进行播放的时候,出了点问题,在安卓的微信浏览器上无法播放,在ios上却可以然后我使用了微信开发者工具,打开了页面,发现...

vue2.0搭建vue脚手架

vue2.0搭建vue脚手架

最近有个项目,老大评估后想用前后端分离技术来做,借这个机会来熟悉下vue前端框架,这次就搭建一个vue项目,下一个目标就是把vue和yii2.0整合;开搞搭建node环境这步很简单,下载安装包右键安装...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。