ES6基础语法
00-ES6是什么?
javascript_top的第6版
在ES5的基础上增加了遇到新特性
箭头函数
字符串插值
代理
生成器
......
01-let和const
00-作用声明变量
01-let使用注意
// 01-作用域只是限于当前代码
//let 和 const 声明变量和常量 var // 01-作用域只是限于当前代码 { var str = '张三'; console.log(str); //张三 let str1 = '李四'; console.log(str1); //李四 } console.log('+++++++++++',str);//张三 console.log('-----------',str1); //报错:str1 is not defined
// 02-使用let申明的变量作用域不会被提升
//es5
//es5 { console.log(str); //undefined var str = '张三'; console.log(str); //张三 //相当于以下代码 var str; console.log(str); //undefined str = '张三'; }
//es6
//es6 { console.log(str); // 报错,es6不存在作用域提升. str is not defined let str = '李四'; }
// 03-在相同的作用域下不能声明相同的变量
{ //es5 // var str = '张三'; // var str = '李四'; // console.log(str); // 李四 //es6 let str1 = '王五'; let str1 = '赵六'; console.log(str1); // 报错。Identifier 'str1' has already been declared 先解析,有错的话所有代码都不会执行。 }
// 04-for循环体现let的父子作用域
//es5
/* var btns = document.querySelectorAll("button"); for(var i=0;i<btns.length;i++){ btns[i].onclick = function(){ alert(i); // 5 } } */ var btns = document.querySelectorAll("button"); for(var i=0;i<btns.length;i++){ (function(i){ btns[i].onclick = function(){ alert(i); // 0-4 } })(i); }
//es6
let btns = document.querySelectorAll("button"); for(let i=0;i<btns.length;i++){ btns[i].onclick = function(){ alert(i); // 0-4 } }
for循环作用域
for(let i=0;i<5;i++){ console.log(i); // 0-4 } for(let i=0;i<5;i++){ let i=20 console.log(i); // 5个20 }
02-const使用注意
// 01-只在当前的代码块中有效
// 01-只在当前的代码块中有效 { const a = 'zhangsan'; console.log(a); //zhangsan } console.log(a); //a is not defined
// 02-作用域不会被提升
// 02-作用域不会被提升 { console.log(a); //报错:先解析 a is not defined const a = 'zhangsan'; }
// 03-不能重复申明
// 03-不能重复申明 { const a = 'zhangsan'; const a = 'lisi'; console.log(a); // 报错Identifier 'a' has already been declared }
// 04-申明的常量必须赋值
// 04-申明的常量必须赋值 { // let name; // name = 'zhangsan'; // console.log(name); //'zhangsan'; const name; name = 'zhangsan'; console.log(name); //报错:Missing initializer in const declaration } // 不能修改 { const name = 'zhangsan'; name = 'list'; console.log(name); //报错:Missing initializer in const declaration } const obj = {name:'张三'}; console.log(obj); //{name: "张三"} //obj存放的地址 obj.name = '李四'; console.log(obj); //{name: "李四"}
02-结构赋值
ES6允许按照一定模式从数组和对象中提取值对变量进行赋值,这被称为解构。
01-基本用法
// 01-基本用法 // es5 let name = '张三', age = 18, sex = '男'; console.log(name); // 张三 console.log(age); // 18 console.log(sex); // 男 //es6解构赋值 批量处理 达到和以上一样的效果 let [name,age,sex] = ['李四',20,'女'] name = 'hahaha'; console.log(name); // hahaha console.log(age); // 20 console.log(sex); // 女
02-对象的解构赋值
// 02-对象的解构赋值 // var obj = {name:'张三',age:55,sex:'男'}; //解构赋值 分别拿出每一个值 let {name,age,sex} = {name:'张三',age:55,sex:'男'}; console.log(name); // 张三 console.log(age); // 55 console.log(sex); // 男 // 一一对应 let {name,age,sex} = {name:'张三',age:55,friends:['lulu','王五']}; console.log(name); // 张三 console.log(age); // 55 console.log(sex); // undefined // 数组 let {name,age,friends} = {name:'张三',age:55,friends:['lulu','王五']}; console.log(name); // 张三 console.log(age); // 55 console.log(friends); // ["lulu", "王五"] //对象 let {name, age, friends, pet} = {name:'张三',age:55,friends:['lulu','王五'],pet:{name:'土豆',age:6}}; console.log(name); // 张三 console.log(age); // 55 console.log(friends); // ["lulu", "王五"] console.log(pet); // {name: "土豆", age: 6}
// 注意:必须key对应值的形式才能赋值 let {name: str} = {name:'张三'}; console.log(name); // 空 console.log(str); // 张三
03-数组的解构赋值
// 03-数组的解构赋值 // let [name, age, sex] = ['李四', 20, '女'] // 数组嵌套数组 let [arr1,[arr2,arr3,[arr4,arr5]]] = [1,[2,3,[4,5]]]; console.log(arr1,arr2,arr3,arr4,arr5); //1,2,3,4,5 let [arr1] = []; console.log(arr1); //undefined let [a,b,c] = [1,2,3]; console.log(a,b,c); // 1 2 3 let [a, , , c] = [1,2,3]; console.log(a); //1 console.log(c); //undefined let [a, , c] = [1,2,3]; console.log(a); //1 console.log(c); //3
04-基本类型的解构赋值
// 04-基本类型的解构赋值 let [a,b,c,d,e] = '我是中国人'; console.log(a); //我 console.log(b); //是 console.log(c); //中 console.log(d); //国 console.log(e); //人 //数字是不存在构造器的,会报错。12306 is not iterable let [a,b,c,d,e] = 12306; console.log(a); console.log(b); console.log(c); console.log(d); console.log(e);
03-数据集合-set (ES6新增的。和数组比较相似)
// 01-特点
01-类似于数组,没有重复的元素(唯一的)
// 1.创建一个集合
let set = new Set();
console.log(set); //Set(0)
02-开发中用于去除重复数据
03-key和value都是相等的
// 03-key和value都是相等的 // 1.创建一个集合 let set = new Set(); console.log(set); //Set(0) // 存值 let set = new Set(['张三','李四','王五']); console.log(set); //Set(3) {"张三", "李四", "王五"} //去重 let set1 = new Set(['张三','李四','王五','张三','李四',]); console.log(set1); //Set(3) {"张三", "李四", "王五"}
// 02-一个属性
// 02-一个属性
let set1 = new Set(['张三','李四','王五','张三','李四',]);
console.log(set.size); //长度:3
// 03-四个方法
01-add 增
// add 增 let set1 = new Set(['张三','李四','王五','张三','李四',]); // set1.add("刘德华"); // console.log(set1); //Set(4) {"张三", "李四", "王五","刘德华"} set1.add("刘德华").add("贝贝"); console.log(set1); //Set(5) {"张三", "李四", "王五","刘德华","贝贝"}
02-delete 删
// delete 删 let set1 = new Set(['张三','李四','王五','张三','李四',]); // set1.delete("张三"); // console.log(set1); //Set(2) {"李四", "王五"} //有返回值 console.log(set1.delete("张三")); //true
03-has 判断有没有该元素true/false
// has 判断有没有该元素true/false let set1 = new Set(['张三','李四','王五','张三','李四',]); console.log(set1.has("张三")); //true console.log(set1.has("张三1")); //false
04-clear 清除
// clear 清除 let set1 = new Set(['张三','李四','王五','张三','李四',]); set1.clear(); //没有返回值 console.log(set1); //set(0){}
// keys values
// keys values let set1 = new Set(['张三','李四','王五','张三','李四',]); console.log(set1.keys()); // SetIterator {"张三", "李四", "王五"} console.log(set1.values()); // SetIterator {"张三", "李四", "王五"}
04-数据集合-map(和对象比较相似)
// 01-特点
01-类似于对象本质上是键值对的集合
02-'键'不是限于字符串。各种类型的值(包括对象)都可以当作键
03-对象'字符串-值'Map'值-值'是一种更加完善的结构实现
对象的键不管是什么类型的,都会转成了字符串。
let obj1 = {a:1}, obj2 = {b:2}, obj = {}; //存值 obj.name = '张三'; //键是字符串 obj[obj1] = '天空'; //{name: "张三", [object Object]: "天空"} obj[obj2] = '大海'; //{name: "张三", [object Object]: "大海"} =======大海覆盖了天空 console.log(obj); // 相当于都转成了字符串 console.log(obj1.toString()); console.log(obj2.toString()); console.log(obj1.toString() === obj2.toString()); //true
打印结果
1.创建一个Map,字符串作为键
//1.创建一个Map // const map = new Map(); // console.log(map); //Map(0) {} //存值 const map = new Map([ ['name','张三'], ['age',18], ['sex','男'] ]); console.log(map); //Map(3) {"name" => "张三", "age" => 18, "sex" => "男"}
结果:
2.对象作为键、数组作为键
// 对象作为键 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map1 = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'] ]); console.log(map1); //Map(5) {"name" => "张三", "age" => 18, "sex" => "男", {…} => "今天天气真好!", {…} => "适合敲代码!"}
结果:
// 数组作为键 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map1 = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); console.log(map1);
结果:
//============================================================常用属性 size 长度。Map也具备去除
//常用属性 // size 长度。Map也具备去除 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'], ['name','李四'], ['age',55] ]); console.log(map); console.log(map.size); // 6
//=============================================================常用方法
// 02-set和get
//常用方法 // 02-set和get let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); console.log(map); //set设置,键可以多样化设置,链式设置。 map.set('friends',['赵六','力气']).set(['dag'],'小白'); console.log(map); //get获取值(键相同即可取值) console.log(map.get('name')); //张三 console.log(map.get(obj1)); //今天天气真好!
// 03-delete
// 03-delete删除 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); console.log(map); // map.delete(obj1); console.log(map.delete(obj1)); //true console.log(map.delete('xxxxx')); //false console.log(map);
// 04-has是否有该值
// 04-has let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); console.log(map.has(obj1)); //true console.log(map.has('xxxxx')); //false
// 05-clear清空
// 05-clear let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); map.clear(); console.log(map); //Map(0) {}
// 06-keys,values,entres
// 06-keys,values,entries所有的键值 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); console.log(map.keys()); console.log(map.values()); console.log(map.entries());
结果:
// 07-遍历
// 07-遍历集合 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); map.forEach(function(value, index){ // console.log('value:',value); // console.log('index:',index); console.log(index + ':' + value); });
结果:
注意事项::两个空对象是不同的地址
//注意事项:两个空对象是不同的地址 let obj1 = {a:1}, obj2 = {b:2}, obj = {}; const map = new Map([ ['name','张三'], ['age',18], ['sex','男'], [obj1,'今天天气真好!'], [obj2,'适合敲代码!'], [[1,2],'hhh'] ]); map.set({},'呵呵呵'); map.set({},'哈哈哈'); console.log(map); console.log({} === {}); //false
05-Symol
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。
重新复习下新知识:基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
场景
ES5的对象属性名都是字符串,容易造成属性名冲突。
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。
对象的属性名可以有两种类型
字符串
Symbol类型
独一无二,不会去其他属性名产生冲突。
//1.定义 let str1 = Symbol(); let str2 = Symbol(); console.log(str1 === str2); //false console.log(typeof str1); //symbol console.log(typeof str2); //symbol //2.描述 let str3 = Symbol('name'); let str4 = Symbol('name'); console.log(str3); //Symbol(name) console.log(str4); //Symbol(name) console.log(str3 === str4); //false //3.对象的属性名(最常用) const obj = {}; // obj.name = '张三'; // obj.name = '李四'; //属性名相同值会覆盖 // console.log(obj); //{name: "李四"} obj[Symbol('name')] = '张三'; obj[Symbol('name')] = '李四'; console.log(obj); //{Symbol(name): "张三", Symbol(name): "李四"}
06-Class的基本运用
//ES5
//1.构造函数 function Person(name,age){ this.name = name; this.age = age; } //原型 Person.prototype = { constructor: Person, //属性 print(){ //方法 console.log('我叫' + this.name + ',今年' + this.age + '岁'); } }; //new一个对象 let person = new Person("张三",19); console.log(person);
//ES6 2 通过class面向对象
//ES6 // 2 通过class面向对象 class Person{ //constructor:构造函数 constructor(name,age){ this.name = name; //属性 this.age = age; } //方法 print(){ console.log('我叫' + this.name + ',今年' + this.age + '岁'); } } let person = new Person("张三",19); console.log(person); //Person {name: "张三", age: 19} person.print(); // 我叫张三,今年19岁
07-Class运用-绚丽小球
08-内置对象扩展
// 1.模板字符串 ``反引号
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>08-内置对象扩展</title> </head> <style> .test{ 100px; height: 100px; background: red; } </style> <body> </body> <script_top> //1.模板字符串 ``反引号 let str = '合适敲代码'; let className = 'test'; let html=` <html> <head> <title></title> </head> <body> <p>今天的天气很好!</p> <div class="${className}">${str}</div> </body> </html> ` console.log(html); </script_top> </html>
//2.数组的扩展
2.1 Array.from 将伪数组转成真数组
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>08-内置对象扩展</title> </head> <style> </style> <body> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> </body> <script_top> //2.数组的扩展 // Array.from 将伪数组转成真数组 let allList = document.querySelectorAll('li'); //allList像一个数组。注意:length属性颜色不是灰色。 console.log(allList); //NodeList(4) [li, li, li, li] // 判断是不是一个数组 console.log(Array.isArray(allList)); // false //如何以数组的格式存储??? console.log(Array.from(allList));//(4) [li, li, li, li] console.log(Array.isArray(Array.from(allList))); //True </script_top> </html>
结果:
2.2 Array.of 其他类型都可转成数组
//2.数组的扩展 //2.2 Array.of 其他类型都可转成数组 console.log(Array.of(1,2,3,4)); //(4) [1, 2, 3, 4] console.log(Array.of('张三','李四','王五')); //(3) ["张三", "李四", "王五"]
3.对象的扩展
1. ES6中 key和value是一样的,写一个就够了。
// 对象扩展 /* // es5 对象 let obj = { // key:value 'name':'张三', 'age':18 }; console.log(obj); // {name: "张三", age: 18} */ //1. ES6中 key和value是一样的,写一个就够了。 let name = '张三'; let age = 18; let obj = { // key:value // 'name':name, // 'age':age name, age }; console.log(obj); // {name: "张三", age: 18}
//3.2 Object.assign() 合并对象
//3.2 Object.assign() 合并对象 let obj1 = {name:'张三'}; let obj2 = {age:18}; let obj3 = {sex:'男'}; let obj4 = {friends:'李四'}; //合并对象 let obj = {} Object.assign(obj,obj1,obj2,obj3,obj4); console.log(obj); //{name: "张三", age: 18, sex: "男", friends: "李四"}
//3.3延展操作符 三个点(...)
// 3.31 打散字符串放到数组中
//3.3延展操作符 三个点(...) // 3.31 打散字符串放到数组中 let str = '今天的天气很好!'; let strArr = [...str]; console.log(strArr);//(8) ["今", "天", "的", "天", "气", "很", "好", "!"]
//3.32 一整个对象传入到对象中,不拆分。用于数据的传递。
// 3.33 去重
// 3.33 去重 let myArr = [1,2,10,'张三',20,2,1]; //方法1:转成集合 // console.log(new Set(myArr)); //Set(5) {1, 2, 10, "张三", 20} //方法2:... console.log([...new Set(myArr)]); // (5) [1, 2, 10, "张三", 20]
09-函数扩展
1.默认值
// es5. 形参设置默认值 function sum(num1,num2){ num1 = num1 || 10; num2 = num2 || 10; console.log(num1 + num2); } sum(10,30); //40 sum(); //20 // es6. 形参设置默认值 function sum(num1 = 10,num2 = 10){ console.log(num1 + num2); } sum(10,30); //40 sum(); //20
2.参数形式
// 2. 参数形式 //es5 arguments:参数 function sum(){ let result = 0; // arguments:参数 for(let value of arguments){ result += value; } return result; } console.log(sum(10,20,30)); // 60 //es6 ...延展操作符 优势:不用区分实参类型 function sum(name,...nums){ let result = 0; // console.log(name); for(let value of nums){ result += value; } return result; } // console.log(sum(10,20,30,50)); //110 console.log(sum('贝贝',10,20,30,50)); //110
3.遍历数组
// function 函数名(){} // 箭头函数 // () => {} let sum = (num1,num2)=>{ return num1 + num2;} console.log(sum(100,300)); //400 //=============================== 遍历数组 //普通函数 let nameArr = ['张三','李四','王五'] nameArr.forEach(function(value,index){ console.log(value+'==='+index); }); // 张三===0 // 李四===1 // 王五===2 //箭头函数 let nameArr = ['张三','李四','王五'] nameArr.forEach((value,index)=>{ console.log(value+'---'+index); }); // 张三---0 // 李四---1 // 王五---2
4.this的指向
//this的指向 function demo(){ setTimeout(function(){ console.log(this); //Window },1000); setTimeout(()=>{ console.log(this); //{} },1000); }; let obj = {}; demo.call(obj);