let是定义变量的关键字,与var的作用相同
let a =123;
console.log(a);
特点:
1.必须先定义后使用
2.不能重复定义
3.块级作用域,被let修饰的变量,在该作用域下,变量不会丢失,也不能在该作用域外使用
{let a =123;}
console.log(a);var oLis = document.querySelectorAll("li");for(let i=0; i<oLis.length; i++){
oLis[i].onclick=function(){
console.log(i);}}
console.log(i);4.暂时性死区:当内部变量与外部变量同名时,内部变量屏蔽外部变量(暂时性死区(TDZ:Temporal Dead Zone):实际上,在块作用域开始的时候,let所声明的变量已经存在,但是他不允许被访问,直到该变量的声明语句出现,从块作用域开始到该变量声明语句间的区域被称为暂时性死区)
let a =123;{let a =456;
console.log(a);}
console.log(a);
将json格式字符串转换为JSON对象通常我们称之为JSON的反序列化
语法:JSON.parse(json格式字符串)----------常用(转成的json对象通过返回值带回)
let str ='{"name":"laowang","age":18}';let json =JSON.parse(str);
console.log(json.name,json.age);
json对象转字符串
将json对象转化为json格式字符串形式通常我们称之为JSON的序列化
语法:JSON.stringify(json对象)(转成的json对象形式的字符串通过返回值带回)
let json ={"name":"laowang","age":18};let str =JSON.stringify(json);
console.log(str);
for。。。in 与 for。。。of
for…in
功能:遍历下标或json的key,常用于遍历json对象(也可以用来遍历数组等,但是如果数组对象的原型链上添加了自定义属性,需要通过hasOwnProperty()判断属性是否属于数组本身,forin的特性就是会吧原型链上的自定义属性一起遍历)
语法:for(let 索引 in 容器){循环体内的索引:a.数组是下标 b.json就是key
}let json ={"name":"老王","age":18}for(let index in json){
console.log(json[index]);}
for…of
功能:遍历元素内容(注意事项:不能遍历json)
常用于遍历没有下标的容器-------------set(集合),map(映射)
let arr =[6,5,7,"heihei",8,9,3];for(let item of arr){
console.log(item);}
箭头函数
特点以及代码演示
箭头函数:匿名函数的另一种写法
letf=function(){
console.log("f");}letf=()=>{
console.log("f");}f();
document.onclick=()=>{
console.log("haha");}特点:1.当箭头函数只有一个参数时,可以省略参数的()letf=a=>{
console.log(a+5);}f(8);2.当函数体只有一条语句时,可以省略{}letf=a=> console.log(a+5);f(8);3.当函数体只有一条语句时,则自带returnletf=a=> a +13;
console.log(f(10));
关于this:
箭头函数的this问题--->代表箭头函数父元素的前缀/父元素的this指向(箭头函数没有this指向,如果上下文存在函数,会继承上下文函数的this指向,如果上下文没有函数,则继承全局变量的前缀,也即window)
document.onclick=()=>{
console.log(this);-----------------此处this代表的不是document,而是window,因为函数document的父元素前缀是window
}let stu ={"name":"凢凢","show":()=>{
console.log(this);}}
stu.show();----------------被调用时,函数show里面的this代表的是window,是函数show所在的父元素stu的前缀window
综合案例:五星好评
代码演示
style:
*{margin:0;padding:0;}
div {width: 27px;height: 27px;background:url(img/star.gif) no-repeat top center;float: left;}
html:
<div></div><div></div><div></div><div></div><div></div>
script:
var hbs = document.getElementsByTagName("div");for(let i =0; i < hbs.length; i++){
hbs[i].onmouseover=function(){for(let j =0; j < hbs.length; j++){if(j <= i){
hbs[j].style.backgroundPosition ="bottom center";}else{
hbs[j].style.backgroundPosition ="";}}}
hbs[i].onclick=function(){for(let h =0; h < hbs.length; h++){if(h <= i){
hbs[h].style.backgroundPosition ="bottom center";}else{
hbs[h].style.backgroundPosition ="";}
hbs[h].onmouseover =null;--------------点击事件之后,所有的星星需要循环解绑划入事件
}}}
解构赋值
解构赋值:解析结构进行赋值
1.定义变量时批量赋值
a.数组方式赋值
let x,y;
x =1;
y =2;let[x,y]=[1,2];
console.log(x,y);
b.json对象方式赋值--->可以去掉json访问属性时的前缀:let{key1,key2}= json对象;
上下文环境:在访问json对象的属性时,可能出现很长的前缀,比如:xxx.xxx.xxx.xxx.xxx.name
let stu ={"name":"马浩奇","age":18}let{name,age}= stu;
console.log(name,age);2.交换两个变量的值
let x,y;
x =123;
y =456;[x,y]=[y,x];
console.log(x,y);-------------此时X,Y原本的赋值已经被交换,x =456,y =123;
补充:无参交换
var a =1,b =2;
a = a + b;
b = a - b;
a = a - b;
console.log(a,b)---------------此时a,b值发生交换