Fork me on GitHub

初步认识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]

 

posted @ 2017-03-20 15:31  zhang_yx  阅读(210)  评论(0编辑  收藏  举报