1.let
1.1 let命令的作用域只局限于当前代码
<script> { let a =10; var b = 1; } console.log(a); // error console.log(b); </script>
1.2 let 声明的变量作用域不会被提前
console.log(a); // 输出undefined var a = 10; console.log(b); // error let b = 1;
1.3 在相同作用域下,不能声明相同的变量
// 报错 function func(){ let a= 0; var a = 0; } // 报错 function func(){ let a = 1; let a = 2; } // 报错 function func(arg){ let arg = 0; } // 不报错 function func(arg){ { let arg = 2; } }
1.4 for 循环中let的父子作用域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button>按钮</button> <button>按钮</button> <button>按钮</button> <button>按钮</button> <button>按钮</button> </body> <script> var btns = document.querySelectorAll('button'); for(var i=0; i<btns.length; i++){ btns[i].onclick = function(){ console.log('这是第'+ i +'个按钮'); } } </script> </html>
2、const
const表示声明一个常量。他和let的特点一样,主要区别是常量。
1. const变量在声明时需要赋值。
2.声明后变量的指针地址不能变,但是指向的数据结构内容可以改变。对于简单数据类型就是值 不能变。对于对象类型则是指指针不能变。
3、解构
3.1 什么是解构
解构赋值可以理理解为赋值操作的语法糖,它是针对数组或者对象进⾏行行模式匹配,然后对其中的变量进行赋值。代码书写上⾔简意赅,语义明确,也方便了对象数据的读取操作。
解构不同的数据类型,解构的语法会略有不同。数组解构用的是[],对象解构用的是{}
但是解构的默认值,和别名语法是一样的。
3.2 数组解构
{ let a,b,c; // 声明 [a,b,c] = [1,2,3]; // 解构赋值,数据的解构使用[], console.log(a,b,c) // 1 2 3 } { let [a,b,c] = [1,2,3]; // 声明并解构赋值 console.log(a,b,c) // 1 2 3 } { let [a,,b] = [1,2,3] // 赋值是按照位置顺序指定的,使用,占位符 console.log(a,b) // 1 3 } { let [a,b=2,c=3,d] = [1,22] // 给b设置一个默认值,默认值会被赋值操作覆盖 console.log(a,b,c) // 1 22 3 } { let [a,...other] = [1,2,3]; // 数组分割 console.log(a,other) // 1 [2 3] }
3.3 对象解构
{ let a,b; ({a,b} = {a:1,b:2}); // 对象解构使用的{} console.log(a,b); } { let {a,b} = {b:2,a:1}; // 对象中赋值的对应关系使用的是键值,和顺序无关 console.log(a,b); } { let {a:num1,b:num2} ={a:1,b:2} // 当对象中的键值和变量名称不一致的时候,可以使用别名 console.log(num1,num2); } { function func() { return { schoolname: '学校名称', classlist: [{ classname: '班级1', count: 10 }, { classname: '班级2', count: 11 } ] } } // 解构复杂数据类型 let { schoolname: myschoolname, classlist: [{ classname: myclassname1 }, { classname: myclassname2 }] } = func(); console.log(myschoolname, myclassname1, myclassname2); }
4、字符串方法扩展
{ let str = '123name321'; console.log(str.includes('name')); // 判断是否包涵name console.log(str.startsWith('123')); // 判断是否以123开头 console.log(str.startsWith('name',3)); // 判断从第4位开始,是否以name开头 console.log(str.endsWith('321')); // 判断是否以321结尾 console.log(str.endsWith('name',7)); // 判断第7位以前,是否以name结尾 console.log(str.repeat(2)); // 重复字符串2次 console.log(str.padStart(13,'abcd')) // 头部补全,补全到13位 console.log(str.padEnd(13,'abcd')) // 尾部补全,补全到13位 }
5、字符串模板
在之前的语法中,在字符串中拼接带变量的字符串会比较麻烦,所以引入了字符串模板。
{ let name='youyou'; let age=18; let str = `我叫${name}, 今年${age}岁`; // 注意空格和回车会原样输出 console.log(str) }