let关键字就是用来声明变量的,使用let关键字声明的变量具有块级作用域,在一个大括号中使用let关键字声明的变量才具有块级作用域
let定义的变量不能重名
let a=11; var a=10;console. log(a); //会报错 使用let关键字声明的变量没有变量提升 console.log(a) ;// a is not definedlet a =20; 使用let关键声明的变量具有暂时性死区特性 var tmp = 123; if (true) { tmp = 'abc'; let tmp; } let定义的全局变量不会挂载到window上 window.name这个属性特别特殊它表示的是window的名字 window.top这个属性更特殊它表示最顶层window对象 var a=10; console.log(window.a); let b=11; console.log(window.b) for循环:防止循环变量变成全局变量 <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var lis = document.querySelectorAll("ul li"); for (let i = 0; i < lis.length; i++) { lis[i].onclick = function () { console.log(i) } } </script>如果循环变量用var去定义那么就是定义了一个全局变量 如果循不变量用let去定义那么就是在每一个 块级作用域中各定义了一个变量i
var lis = document.querySelectorAll("ul li"); for (var i = 0; i < lis.length; i++) { lis[i].onclick = function () { console.log(i); //4 } }为了解决上面的问题 有以下的方法
方法一 :用块级关键字let 替换 var
for (let i = 0; i < lis.length; i++) { lis[i].onclick = function () { console.log(i); //4 } }在没有ES6的时候 解决上面问题的办法
方法2:添加属性
for (var i = 0; i < lis.length; i++) { lis[i].idx = i; lis[i].onclick = function () { console.log(this.idx); } }方法3:IIFE
for (var i = 0; i < lis.length; i++) { //立即执行函数 (function (num) { lis[num].onclick = function () { console.log(num); } })(i); }定义语法: ``; (反引号) 按键位置: 横向数字键1左侧 | tab键上侧 | esc键下方 插值语法: ${ }
var name = "huahua"; var age = 20; //普通写法 //var message='hello,my name is '+name+',I\'m '+age+' years old'; //alert(message); //ES6写法 var message1=`hello, ${name}, your age is ${age}`; alert(message1);startsWith(str, pos): 用于检测字符串是否以指定的字符开头。 参数: str:匹配的字符串 pos:从第几位开始 如果在字符串的开头找到给定的字符 返回true; 否则,false。 一般的话是用于来判断是否以http://开头或者以file:///开头 区分大小写
let str = '12345abcdefg'; console.log(str.startsWith('123')); //true console.log(str.startsWith('abc', 5)); //true console.log(str.startsWith('EF',9)); //falseendsWith(str, pos): 用于检测字符串是否以指定的字符结尾。 参数: str:匹配的字符串 pos:为匹配最后一个字符的位置(以0为开始),省略则为最后一个字符位置 如果在字符串的开头找到给定的字符 返回true; 否则,false。 可用于判断这个字符串是不是以 .png 、.jpg结尾 区分大小写
let str = '12345abcdefg'; console.log(str.endsWith('g')); //true console.log(str.endsWith('abc', 8)); //true console.log(str.endsWith('ABC', 8)); //falseincludes( ): 用于检测参数字符串是否在原字符串里面。 区分大小写
let str = '12345abcdefg'; console.log(str.includes('abcd')); //true console.log(str.includes('ABCD')); //falserepeat(): 返回新字符串,表示将原字符串重复多次
var str = "hello "; var str1 = str.repeat(8); console.log(str1); //hello hello hello hello hello hello hello hello在ES6中新增了3个普通方法2个静态方法 静态方法:构造函数调用的方法叫做静态方法 普通方法:数组调用的方法叫做普通方法
Array.from() 方法:用于将 类数组对象/可遍历的对象/字符串转为真正的数组
function demo() { var arr = Array.from(arguments); // 这是ES6中提供的标准方法 var arr = [ ].slice.call(arguments); // 这是我们以前的方法 return arr.reduce(function(prev, value) { return prev + value; }, 0); } demo(1, 2, 3, 4, 5, 6, 7, 8);Array.of() 方法: 用于定义数组
var arr = Array.of(10); console.log(arr); //[10]copyWithin() 数组的内部复制 参数: target:替换的开始位置 satrt:截取的开始位置(包含) end:截取的结束位置 (不包含)
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var res = arr.copyWithin(3, 4, 7); console.log(res);//[1, 2, 3, 5, 6, 7, 7, 8, 9]Object.is() 方法:用来判断两个值是否相等 (类似 ===)
Object.is与 ===判断符只有两个差别
Object.is判断NaN等于 NaN 而===判断为falseObject.is判断 -0和0 是不相等的 而 === 判断 -0和0 是相等的 console.log(+0 === -0 ? true : false); //true console.log( NaN === NaN ? true : false); //false console.log( Object.is(+0,-0)); //false console.log( Object.is(NaN,NaN)); //trueObject.assign() 方法:用于浅复制 语法:Object.assign(target,obj1,obj2…) 第一个参数是接收属性的对象 第二个参数开始往后都是提供属性的对象,如果参数冲突,以后面的为准
var target = { name:'huahua', age:18 }; var obj = { sex:'女', score: 88 } var result = Object.assign(target,obj); target.sex = "男"; console.log(target); // {name: "huahua", age: 18, sex: "男", score: 88} console.log(target == result)//true封装: 指的是将内容包装在一起代码封装 使用函数数据封装 使用数据结构 解构: 指的是解除构造\解除结构
解构数组
// 定义数组 var arr = [1, 2, 3, 4, 5]; 人工解除结构 var a = arr[0]; var b = arr[1]; var c = arr[2]; var d = arr[3]; var e = arr[4]; ES6语法解构 var [a, b, c, d, e] = arr; console.log(a,b,c,d);//1 2 3 4 //交换两个变量 var a = 10; var b = 20; [a, b] = [b, a]; console.log(a, b); //20 10解构对象
ES6语法解构 // 解构对象 var obj = { name: "xiaoming", sex: "男", hobby: { name: "yumaoqiu" } } var {sex,name,hobby} = obj; console.log(name,sex, hobby);传递参数
var arr = [1, 2, 22, 33, 44, 42, 32, 22, 556, 65,7]; //Math.max.apply("", arr); var result = Math. max(...arr); //等价于 Math.max(1, 2, 22, 33, 44, 42, 32, 22, 556, 65,7) console.log(result);//556收集函数参数
function sum(a, b, c, ...args) { //a接收第一个参数 // b接收第二个参数 //c接收第三个参数 // args接收剩余参数 console.log(args); } sum(1, 2, 3);//[] sum(1, 2, 3, 5, 88, 23, 4);// [5, 88, 23, 4]帮组解构数组
var arr=[1,2,3,4,5,6]; var [a, b, ...arr1] = arr; console.log(a, b); //1 2 console.log(arr1); //[3, 4, 5, 6]语法: let fun= () => {}
let fun = () =>{ console.log(1); } fun(); 箭头函数中没有arguments let fun = () => { console.log(arguments); } fun(); // arguments is not defined 箭头函数中this不变 箭头函数中的this一旦确定,将再也无法改变。 箭头函数中的this指向谁,要看它所在的作用域中的this是谁 var obj = { fun: function () { return () => { console.log(this) } } } // let arrow = obj.fun.call(document.body); // 这两条代码请注释一条 打开一条 let arrow = obj.fun(); // 这两条代码请注释一条 打开一条 arrow(); document.onclick = arrow; arrow.call(document); arrow.apply(document); let arrow1 = arrow.bind(document); arrow1(); 箭头函数不可以通i过new运算符进行调用 let arrow=()=>{} new arrow(); // arrow is not a constructor 箭头函数的简写形式 1.如果参数只有一个 那么可以省略圆括号 2.如果函数体中只有一条代码并且还是返回值 则可以省略大括号 和return let arrow = a =>{ return a + 1; } let result = arrow(10); console.log(result ); //简写后 let arrow = a => a+1; let result = arrow(10); console.log(result );