一、let 和 const 命令
let 命令
1.块级作用域(区分:全局变量和局部变量)只有在 { } 内有效,与function无关
for (let i=0; i< btns.length; i++) {
var btn = btns[i];
btn.onclick = function(){
}
console.log(i); //打印i为1、2、3、4、5,
// 如果是var i= 0;打印结果是5、5、5、5、5
}
for (var i = 0; i < btns.length; i++) {
(function(index){
var btn = btns[index];
btn.onclick = function(){
console.log(index); //打印i为1、2、3、4、5
//实际即为全局变量i赋值给了局部变量index,打印的是局部变量
}
})(i);
}
2.不存在变量作用域提升,使用let必须先声明再使用
3.不允许重复声明
4.暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
5.顶层对象属性:全局变量和window没有关系,严格区分window对象与全局对象
6.函数块级声明
const命令
const声明常量
1.一旦声明不可改变,一般定义常量使用全部大写(开发规范)
2.不能重复声明
3.声明必须赋值 ,防止意外修改变量
4.先声明后使用 ,作用域和let一样
5.对象常量,内容可变 ,对象常量本身的引用地址不能变,但是引用的内容可以修改
二、解构赋值
1.数组结构
step1: 数组解构
let a = 1;
let b = 2;
let c = 3;
ES6 允许写成下面这样。
let [a, b, c] = [1, 2, 3];
step2:数组嵌套
2.对象解构
let arr= [0,1,2,3];
let {length} = arr; //length 打印出为4
//相当于 let {length} = {length: 4},因为数组对象中有这个length
应用:如何快速提取多层JSON数据,使用解构赋值
3.字符串的解构赋值
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
类似数组的对象都有一个length
属性,因此还可以对这个属性解构赋值。
let {length : len} = 'hello';
len // 5
4.数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
上面代码中,数值和布尔值的包装对象都有toString
属性,因此变量s
都能取到值。
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined
和null
无法转为对象,所以对它们进行解构赋值,都会报错。
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
三、函数参数默认值
此处加={}为了后面ajax方法调用时不传值也能有默认值,解构不报错,传值则会覆盖掉{}
上面为给函数指定了默认值,后面为给函数指定了默认对象,所以没有默认值就是undefined
四、number数值扩展
一、JS进制问题
1. 2进制 0b(ES6)
2. 8进制 0o(ES6),
3. 10进制
4. 16进制 0x
二、指数运算 **
2**3 = 8
三、Number.isSafeInteger安全整数
JS能表示的最大整数在(-2^53 ,2^53)之间,超出范围后计算结果就不精确了
Number.isSafeInteger(Math.pow(2, 53));//false
Number.isSafeInteger(Math.pow(2, 53)-1);//true
四、Number.isFinite数值有限
Number.isFinite()用来检查一个数值是否为数字
对数值有效,非数值一律返回false
Number.isFinite(30);//true
Number.isFinite(Nan) ; //false
五、Number.isNaN() 判断是否为空,空为true
NaN:不是一个有意义的数字
是用来检查一个值是否为NaN,对数值有效,非数值一般返回true
Number.isNaN(NaN); // true
Number.isNaN(20) ; // false
五、字符串扩展
重点:标签模板
标签模板
String.raw:避免转义
console.log(`Hi\n${2+3}!`); //Hi
//5!
console.log(String.raw`Hi\n${2+3}!`); //Hi5!