初步认识ECMAScript6
简介:
有个概念:ECMAScript6和JavaScript的区别是:
ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现;
目前这个ES6,也可以是ECMAScriipt2015
当前这个是不兼容ie8的,如果想兼容ie8就要利用babel转码器(这个我觉得需要单独拿出来说才行,这里不说了)
一 let和const命令
1let用于声明变量,相当于var,但是和var有一些区别
(1)let命令所在的代码域内生效
{ let a=1; var b=2; } 在外部congsole的话,a等于defined b等于2
var a=[];
for(let i=0;i<10;i++){
a[i]=function(){
console.log(i);} }
}
a[6]();//结果是6 如果是var i的话 结果就是10
(2)不存在变量提升 所以变量一定在声明之后才能使用
//结果是undefined 这个因为使用var console.log(foo); var foo=2; //报错 因为let不能变量提升 console.log(a); let a=2;
(3)只要块级作用域内存在let,它声明的变量就绑定了,不再受外部的影响
var aa="123"; if(true){ aaa="111"; let aaa;结果报错 因为用let声明了aaa 就已经在作用域中绑定了,而这个aaa又把声明放在后面了 所以报错 }
(4)不允许重复声明,同一个变量不允许重读声明 ;否则报错
2块级作用域
实际上是let实现了块级作用域 就是外层的代码不会受内层代码影响
函数的本身就是它自己的作用域
3const
用来声明常量的,它的值时不变的
const和let一样,不会提升 存在暂时性死区 只能在声明之后调用 只在声明所在的快级作用域内有效 不能重复定义
需要注意的是:
对于复合型的常量,变量名不指向数据,而是指向数据所在的地址。当然const只要保证变量名指向的地址不变就成了
const foo={}; foo.prop123;
如果想在一个模块中使用另一个模块的常量的话:
module1: export const a=1; export const b=2; module2: inport *as constants from './module1'; console.log(contants.a)//1 console.log(contants.b)//2 module3: import {a,b} form './module1'; console.log(a)//1
二变量的解构赋值
什么是解构:
从数组或者对象中提取值,对变量进行赋值
1数组的
(1)等号两边模式相同
let [a,b,c]=[1,2,3]
(2)左边的模式只是匹配右边数据的一部分
let [d,f,g]=["hello","world"]; console.log(f);
如果等号右边不是数组,则会报错!
只要某种数据结构具有iterator接口,都可以采用数据形式的解构赋值(Iterator就是迭代器)
默认值
注意:ES6内部使用严格相等运算符(===)判断一个位置是否有值
let [a=1,b=2,c]=[4,,6] console.log(a);//如果对应的右边有值 则最后是右边的值 如果没有 看是否有默认值
默认值可以引用解构赋值中的其他变量,前提是这个其他变量必须已经声明
let [x=1,y=x]=[] console.log(x)
2对象的
和数组的不用是:数字的元素是按着次序来排序的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名;
一致的
var {a,b}={a:"123",b:"234"}; console.log(a);
不一致的
var {x:y}={x:"hello"}; console.log(y)真正复给制的是y
3字符串的
const [a,d,b,d,e]='hello' console.log(a)
4数值和布尔值
如果等号右边是数值或者布尔值的话,则会先转化为对象
let {toString:s}=123; console.log(s)
注意:如果是数值或者布尔值则转化为对象。但是null和undefined不能转化为对象,则这两个就会报错
5圆括号的问题:
只要有可能就不要再解构中添加圆括号
三正则
1,RegExp构造函数
在es5中构造函数的参数需要是字符串
在es6中参数可以使正则
var regx=new RegExp(/xyz/i);
2,字符串的正则方法:
math()进行正则匹配
replace()根据pattern进行正则匹配,把匹配结果替换为replacement
search()根据pattern进行搜索,成功返回true
split()根据pattern进行正则分割,返回一个分割的数组
3,u的修饰符
用来正确处理大于\uFFF的unicode的字符
4,y修饰符
粘连修饰符 : 是全局匹配,后一次匹配都从上一次匹配成功的下一位置开始,y必须保证匹配必须熊剩余的第一个位置开始。
5,sticy属性
表示是否设置了y修饰符
6,flags属性
会返回正则表达式的修饰符
四数值的扩展
1,二进制和八进制的表示法
二进制 前缀0b
八进制 前缀0B
2,Number.isFinite()检查infinite
Number.isNaN()检查NaN
这两个方法和传统方法的区别是:传统方法是先将非数值转化为数值,然后再进行比较 而现在的方法是直接进行比较 非数值直接返回false
3,Number.parseInt();
Number.parseFloat();
4,Number.isInteger()判断一个数是否为整数
5,Number.EPSILON这是一个极小的数值
用来减少浮点数计算的误差
6,安全数
因为js能计算的数值范围是-2^{53}到2^{53} 所以Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER
Number.isSafeInterger用来判断一个数是否在这个范围之内
五 函数的扩展
1.参数默认值
之前的参数如果没有被赋值的话 需要在函数体中写一个默认值。但是现在es6可以直接在参数上写上默认值
function a(a,b="123"){ console.log(b) } a();
与解构赋值默认值相结合
{ function f({x,y=4}){ console.log(x,y) } f({}); f({x:1}); f({x:1,y:2}); }
函数的length属性
如果参数中没有参数有默认值,则length的值时全部的;如果有则有默认值的那个不算在length里面;
{ var a=(function f(x,y=1){}).length; console.log(a); }
作用域:
如果参数默认值是一个变量,咋改变量所处的作用域与其他变量的作用域规则是一样的,即显示当前作用域然后才是全局作用域
let x=1; function f(y=x){ //在y的时候,x指向的是全局变量 所以结果是1 let x=2; console.log(y); } f();
另一个例子(困扰窝了)
let x=1; function f(x,y=x){//结果是报错 因为现在调用x的时候没有默认值 所以x指向全局变量 可是函数内部又重新声明了x 这就报错了 let x=2; console.log(y); } f();
2.rest参数
形式为(...变量名) 用于获取函数的多余参数rest参数搭配的变量是一个数组,该变量将多余的参数放入其中
function f(...value){ for(var i of value){ console.log(i) } } f(2,3,4)
3.扩展运算符
是三个点(...)好比rest的逆运算,将一个数组转为用都还分割的参数序列
console.log(...[1,2,3])
主要用于函数调用,并且提供了数组合并的新写法
[1,2,...more]相当于[1,2].concat(more)
与解构赋值结合
[a,...rest]=list相当于a=list[0],rest=list.slice(1)
如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则报错
const [list,1,...more]=[1,2,3,4,5,67]