es6语法学习
1、块级作用于
用 let来来代替之前 由于var块级作用于,变量泄漏的问题
Let声明变量,只在当前块级作用域中有效
对于没有声明的变量,先使用,再用let声明则会报错
块级作用域中相同变量名不允许重复声明
可以任意嵌套
ES5中块级作用域中,内部的作用域函数可以在外部没有此变量或者函数的时候得到提升,
称为函数提升(目的是为了兼容浏览器)
在ES6浏览器环境中,可以按照函数提升规则
在ES6其他环境中,则会报错,不会将内部函数或者变量进行作用域提升
ES6块级作用域声明函数,仅限 函数在大括号包围函数的情况下,才成立
最好将函数写成 表达式 let f = function(){};比较好,放在块级作用域中
do{ 表达式};则可以返回表达式的值
Const 常量,当用const声明对象,只是保证对象内存地址不变,但是内容可以变
Es6 有 let const var function import class 六种声明变量方法
Global顶层对象,
2、变量的解构赋值
let [x,y,z] =[1,2,3];让左边值等于右边值,如果两部个数不匹配,则左边有的值可能为undefined
注意左右格式解构要对应
对于数组形式结构,只要 某种数据结构具有 Iterator接口,可以遍历,就可以数组解构
Let [x=1] = [undefinde]; 左边x=1 表示,如果x为undefined,则去取默认值1
但是x为undefinde 是 x严格等于undefinde 即 x===undefined
上面表达式是 值为x 则去取1的
严格的undefined 是 无定义
Null不是undefined
对象的解构
对象的解构不是按照次序的,,,必须是 变量与 属性同名,才会去取对应的值
Let { bar, foo} = {foo:”aaa”,bar:”bbb”};
上面这种方式,默认 属性名和变量名一致
如果变量名与属性名不一致则需要这样写
Let {foo:f, bar: b} = {foo:”aaa”,bar:”bbb”};
属性名是 foo 变量名是 f
则f的值是 aaa, b的值是 bbb
Let 和 const不允许重新声明,否则会报错
且上面方式 是 声明和 赋值是一体的,所以不允许再在后面进行 let声明对应变量
Let 声明变量后,其下面一行 必须用圆括号括起来
Let foo;
({foo} = {foo:1});
可以嵌套
对象赋值 key value形式 ,通过key 找到 前后 value 进行value赋值,而不是给key赋值
由于js会将 {}理解为一个代码块,所以对于对象的赋值形式,外层必须加 大括号才有效,不报错
Let { log,sin,cos} = Math;将Math对象的 对数 正弦 余弦三个方法,赋值到对应的变量上
字符串的解构赋值
Const [a,b,c,d,e] = ‘hello’;则 a = h,b=e,c = l,d = l, e = o;这是吧字符串看成数组形式赋值
Let {length: len} =’hello’; 则 len = 5,,把字符串看成字符串对象有 length属性,属性值赋给len
即前面的属性,必须是 后面的对象所包含的
等号右边是 数值或者布尔值,则会先转化为 对象
Let {toString : s} = 123; s值为 Number.prototype.toString 是 true
解构规则,,只要等号右边的值不是对象或者数组,就先将其转化为 对象,无法转化为对象的如 undefinde和 null则会解构报错
函数的参数解构
1、正常形式 数组 对象解构 和 上部分一致
如 函数为 function add([x,y]){return x+y}
add([1,2]) 1 2 对应 x y
2、函数参数默认值形式
函数 Function move({x =0,y=0} = {}){ return [x,y]}
Move({x:3,y:8});//这里含义是 传入[3,8]
含义是,传入参数 如果 x为undefinde 则x去取默认值 0,如果y 为undefined 则y去取默认值 0
================================================================
第三点 变量的解构赋值 不能使用圆括号的情况
1、变量声明语句中,不能带有圆括号
如 let[(a)] =[1]; //这个是错误的
2、函数参数中,模式不能带有圆括号
如 function f([(z)]) {return z;}//这个是错误的
3、赋值语句中,不能将整个模式或者嵌套模式中的一层放到圆括号中
({p:a}) = {p:42};//这个是错误的
可以放到圆括号的只有赋值语句中的 非模式部分
[(b)] = [3];//正确 是赋值语句。圆括号不属于模式的一部分
({p:(d)}) ={};//正确, 模式是p,而不是 d,所以d可以放到圆括号中
[(parseInt.prop)] =[3];
变量解构用途
1、交换变量值 [x,y] = [y,x];
2、从函数返回多个值
Function example(){return [1,2,3]} let [a,b,c] = example();
Functon example(){return {foo:1,bar:2};} let {foo,bar} = example();
3、函数参数定义
Function f([x,y,z]) {}’
F([1,2,3]);
Function f({x,y,z}){}; f({z:3,y:2,x:1});
4、提取json数据
Let jsonData ={id:42,status:”OK”,data:[867,5309]};
Let{id,status,data:number} = jsonData; //形式,即是声明又是赋值
5、函数参数 默认值
jQuery.ajax = function(url,{
async =true;
beforeSend = function(){},
cache = true,
complete = function(){},
crossDomain = false,
global = true,
}){
//函数内容
}
6、遍历 Map结构
var map = new Map();
map.set(‘first’,’hello’);
map.set(‘second’,’word’);
for(let [key,value] of map)
{
Console.log(key + “is ” + value);
}
或者只获取键名
for(let [key] of map)
{
}
只获取键值
for(let[,value] of map)
{
}
//
加载模块
const { SourceMapConsumer, SourceNode} = require(“source-map”);
字符串的扩展
1、”\u{待解析字符}” 之前表示是 “\uABCD\uDEFA” 且 \u0000 ~ \uFFFF字符之间
现在可以大于此字符 放在\u中会自动将 “\u{待解析字符}” 解析为 “\u****\u****”
解析字符规则 按照 UTF-16进行解析
所以
Var s =””;上土下口,吉 的异体字
S.length ;//为 2
s.charAt(0);// ‘’ charAt无法读出 为四个字节的字符
s.charAt(1); ‘’
s.charCodeAt(0);// 55362 只能读出前两个字节 值
s.charCodeAt(1);//57271 和 后两个字节
但是上述是 每个都是 四个字节 编码 是 0xD842 0XDFB7
所以 用 codePointAt来进行可以转化
Var s = ‘上土下古字 a’
s.codePointAt(0).toString(16);// 20bb7
s.codePointAt(1);// 52271
s.cidePointAt(2).toString();// ‘61’
codePointAt方法可以字符是 由 两个字节 还是四个字节构成
Function is32Bit(c)
{
Return c.codePointAt(0) > 0xFFFF;
}
is32Bit(“我”);//true
Is32Bit(“a”);//false
2、
String .fromCodePoint()方法
之前es5 String.fromCharCode 不能识别 32位的UTF-16字符,即UNICODE 大于 0xFFFF的
但是 es6 String.fromCodePoint方法可以识别
3、遍历
For(let codePoint of ‘foo’)
{
Console.log(codePoint);
}
// “f”
//”o”
//”o”
Var text = String.fromCodePoint(0x20bb7);
For(let i=0;i