这不是真的ES6之ECMAScript 6
最新想学习es6(elasticsearch6),在我的破服务器(512m内存)上搭建了java虚拟机(JVM)环境,首先说明一点,买服务器还是要买高配呀,如图
当我安装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
看到这里我想起了之前拼接字符串的痛苦,并且留下了无知的泪水
注意,这里如果拼接多行字符串,在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呢,像字符串的处理,生成器之类的