zoukankan      html  css  js  c++  java
  • ES6基础语法


    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);     
    

      

     
     
  • 相关阅读:
    MYSQL一对多,两表查询合并数据
    bootstrap瀑布流代码
    os mac apache+php+mysql环境配置
    centos 6.5 服务器安装 (LNMP ntfs文件支持 PHP-RPM CHROOT沙盒)
    在linux下将当前目录文件全部小写含目录名
    Javascript知识汇总------js中容易被忽略的细节(持续更新)
    Javascript知识汇总------js数据类型隐式转换
    下次要写约瑟夫和并查集
    --wrong answer
    --最小生成树
  • 原文地址:https://www.cnblogs.com/yimiflh/p/9280597.html
Copyright © 2011-2022 走看看