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{
		width: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);     

  

 

 
 
posted @ 2018-07-08 17:13  yimi+fly  阅读(203)  评论(0编辑  收藏  举报