关于ES6那些事儿

2019-02-23  本文已影响0人  人性本薄凉

一:ES6的简介

1.1996年javascript的创造者决定将javascript提交给标准化组织ECMA希望这种语言可以成为国际标准。

2.之后ECMA把这一标准称之为ECMAscript。可以说javascript是ECMAscript的实现。es6则是js的规格。

****重要重要****

ES6新增了一种独一无二的数据类型:Symbol。详情会在后面解释。

即现在javascript的数据类型共有以下7种。

String    Number    Boolean    null    undefined    Object    Symbol

二:let和const命令

关于let命令:

1.不存在变量提升。

2.从变量的使用到变量的声明属于暂时性死区。

3.不允许重复声明。

块级作用域

1.js只存在函数作用域以及全局作用域,es6为es5生成了块级作用域。

2.js的全局作用域相当于顶层作用域。

eg:var a=0;window.a=0;

es6新增的块级作用域会将全局作用域与顶层作用域区分。

eg:let b=1;window.b==>undefined;

2.块级作用域中声明函数只允许在{}中声明。

const命令

1.不允许重复声明;

2.声明之后变不可改变;当声明一个对象时需注意

eg:const a=0;a=3;==>报错

eg:const obj={};obj.a=a;不报错 obj={};==>报错;

解释:const声明的变量存储的是指向内存地址的指针,故不可赋值给其他,当声明的变量为对象时,可扩展此对象。

3.ES6新增了let、const、import、class四种声明变量的方法

三:变量的结构赋值

数组的结构赋值

1.ES6允许按照一定模式从数组或对象中提取值对变量进行赋值。

eg:let [a,b,c]=[1,2,3];

eg:let [a,[[bar],baz]]=[1,[[2],3]];

不完全解构

eg:let [a,[b],d]=[1,[2,3],[4]];==a=1;b=2;d=4

解构赋值可设置默认值(只有在数组成员中严格等于undefined时,才可以使用默认值)

eg:let [x=1]=[null];===>x=null

eg:let [x=2,y=2]=[]===>x=2;y=2;

对象的结构赋值

1.对象的结构赋值,变量名必须与属性名同名才可以赋值

eg:let { foo, bar } = { foo: "aaa", bar: "bbb" };

foo // "aaa"

bar // "bbb"

eg:let {baz} = {foo:"aaa",bar:"bbb"};

baz // undefined

2.嵌套对象的解构

let obj={p:["hello",{y:"world"}]};

let {p:[x,{y}]}=obj;

x //hello

y //world

p //报错(p is not defined)

解释:对象解构赋值的是值,而不是模式,此时P就是模式,则不会进行赋值;

下面将对p进行赋值

let obj={p:["hello",{y:"world"}]};

let { p, p: [x, { y }] } = obj;

x // "Hello"

y // "World"

p // ["Hello", {y: "World"}]

3.解构不成功的变量为undefined;

let {foo}={bar:"baz"};

foo //undefined

4.如果解构对象为嵌套的对象,而且子对象的父级属性不存在,则会报错

eg:let {foo:{bar}} = {bar:"baz"};

相当于执行的为 foo.bar 因此时foo为undefined-所以报错

字符串的结构赋值

1.const [a,b,c]="boy";

a //b

b //o

c //y

1.let {length : len} = 'hello';

len // 5

数值和布尔值的结构赋值

1.结构赋值的规则,只要等号右边不是数组或对象,就先将其转化为对象

eg:let {toString:s}=123;

s===Number.prototype.toString //true

eg:let {toString:s}=true;

s===Boolean.prototype.toString //true

函数参数的结构赋值

1.函数的参数也可以使用解构赋值

eg:function move([x,y])={return x+y};move([1,2]) //3

2.函数的参数也可以使用默认值

eg:function move({x=0;y=0}={}){return [x,y]};

move({1,2}) //[1,2]

move({})==move() //[0,0]

上面的函数的参数是一个对象,通过这个对象进行解构,得到变量x/y的值,若解构失败,则等于undefined

eg:function move({x,y}={x:0,y:0}){return [x,y]}

move({1,2}) //[1,2]

move({}) //[undefined,undefined]

move() //[0,0]

字符串的扩展

1.字符串的遍历器接口

eg:for(key of 'foo'){console.log(key)};  //f o o

这个遍历器最大的优点是可以识别大于0xFFFF的码点

2.js只有通过indexof来判断是否包含某个字符串,ES6新增了三个方法来判断一个字符串是否包含另一个字符串

eg:let s="hello world!";

eg:s.includes("o",1) //true  //判断是否包含

eg:s.startsWith("hello",1) //true  //判断是否在原字符串的开头

eg:s.endsWith("!",1); //true  //判断是否在字符串的结尾

第二个参数表示开始搜索的位置

endsWith较与其他两个方法的区别为:

endsWith:是针对于前N个字符

startsWith-includes:是指从第n个字符到结尾位置

3.字符串的repeat的方法

eg:"x".repeat(3) //'xxx';

若是小数则取整处理

eg:"x".repeat(2.9) //"xx"

若参数为不是数值,则会转换为数值

eg:"x".repeat("3") //"xxx"

若参数为小于-1的负数 则会报错

若参数为-1-0的数,则为空字符串

"x".repeat(-0.7) //""

4.padStart(),padEnd()方法

ES2017引入了补全字符串的方法,

eg:"x".padStart(4,"ab")  //abax

eg:"x".padEnd(4,"ab")  //xabab

若设置补全字符串长度小于原字符串的长度时-则保持不变

eg:"xxx".padStart(2,"ab") //xxx

若省略第二个参数,默认使用空格补全

eg:'x'.padStart(4) //"  x"

字符串补全的用途

提示字符串格式

eg:'09-12'.padStart(10,"YYYY-MM-DD") //YYYY-09-12

模板字符串

eg:let color="red";$("result").append("this is a"+a+'apple');

使用字符串模板之后:`` 反单引号

eg:$(result).append(`this is a ${color} apple`);

若变量表示用到``则使用\进行转义

eg:console.log(`\`09\`123`);

  //`09`123

正则的扩展

1.关于RegExp构造函数

es5中构造函数的参数如下

eg:var reg=new RegExp("xyz","i");

或者 var reg=new RegExp(/xyz/);此时不能有第二个参数出现,否则会报错

ES6中允许在这种情况下允许第二个参数的设置

eg:var reg=new RegExp(/xyz/ig,'i').flags = 'i'

并且此正则对象的flags以第二个参数为准

2.u修饰符

ES6新增了u修饰符来识别码点大于0XFFFF的unicode字符

3.ES6中新增了判断是否含有u修饰符的方法

eg:let reg=/hello/;let reg1=/hello/u;

reg.unicode //false

reg1.unicode  //true

3.正则的扩展稍后跟进。。。

数值的扩展

1.二进制与八进制的表示法

ES6提供了二进制和八进制新的表示法。分别用前缀0b/0B 0o/0O表示

ES5的严格模式声明八进制不允许使用前缀0表示,ES6进一步明确使用0o表示

八进制转换为十进制

Number('0o111')  //7

2.ES6在Nuber对象上新增了Number.isFinite()与Number.isNaN()方法

Number.isFinite()判断数值是否为有限的

eg:Number.isFinite(15) true

eg:Number.isFinite(Infinity) false

Number.isNaN()判断数值是否为NaN

Number.isNaN(5)  false

Number.isNaN(NaN) true

3.ES6将全局的parseInt()和parseFloat()方法转移到Number对象上

ES5的写法:

parseInt("12.12")  //12

parseFloat("12.122323%"); //12.122323

ES6的写法

Number.parseInt("12.12")  //12

4.Number的isInteger()用来判断数值是否为整数

Number.isInteger(23) //true

Number.isInteger(20.1) //false

需要注意的是23.0==23

Number.isInteger(23.0) //true

5.ES6在Number对象上新增了常量Number.EPSILON

表示了1与大于1的最小浮点数的差

6.安全整数和Number.isSafeInteger()

Number.isSafeInteget(15)  //true

Number.isSafeInteger(1.3) //false

7.ES6为Math对象新增了17个方法

Math.trunc()去除小数部分,返回整数

eg:Math.trunc(5.4) //5

eg:Math.trunc(-0.9) //-0

对于无法取整的参数,等于NaN

eg:Math.trunc(NaN) //NaN

判断数值为整数或者负数或者0--Math.sign()

返回五种结果如下:若参数为非数值则先转换为数值再进行判断

Math.sign(5)  //+1表示整数

Math.sign(-5) //-1表示负数

Math.sign(0)  //+0

Math.sign(-0) //-0

Math.sign(NaN) //NaN

Math.sign("9") //+1

其他方法稍后更新。。。

上一篇下一篇

猜你喜欢

热点阅读