ES6常用语法

01、ES6 解构赋值

	const object = {
		a: 1,
		b: 2,
		c: 3,
		d: 4
	}
	// 在ES5中我们使用 object.property 获取对象的value
		console.log(object.a, object.b)
		// 如果需要删除对象的某个属性需要 
		// 但是这样就对源对象进行的删除操作 不想改变源数据需要对当前对象进行深拷贝在进行处理
		delete object.a 
	
	// 在ES6中我们可以使用 解构赋值进行value获取 
		// 提示解构赋值必须保证解构的对象存在, 否则会出现undefined,null.
		const { a, b, c, d } = object || {};
		console.log(a,b,c,d); 
		// 如果同时在获取多个对象值时存在属性值重复可以进行名称修改
		const { a: a1 } = object || {};
		const { a: a2 } = object || {};
		console.log(a1,a2)
		// 如果需要删除对象中的属性值获得其余属性的对象:
		const { a, ...otherProperty } = object || {};
		console.log(otherProperty) // { b:2, c:3, d:4 }
		console.log(object) // { a:1, b:2, c:3, d:4 }

02、ES6 扩展运算

Object.assign 的使用

	const arr1 = [1,2,3,4];
	const arr2 = [5,6,7,8];
	const object1 = { a: 1};
	const object2 = { a: 2, b: 2};
	// ES5中数组合并和对象合并需要借助concat方法和Object.assign()方法
		// 数组合并
		const arr3 = arr1.concat(arr2); // [1,2,3,4,5,6,7,8];
		// 对象合并 
		// 注意: assign后面的参数如果存在和前面对象的属性相同则会被后面的进行覆盖
		// 并且如下所示会对object1 源数据进行更改
		const object3 = Object.assign(object1, object2); // { a: 2, b: 2 }
		// 如果不想改变源数据 如下即可
		const object3 = Object.assign({}, object1, object2); // { a: 2, b: 2 }
		
	// ES6	数组对象合并
		// 数组合并
		const arr3 = [...arr1, ...arr2]; // [1,2,3,4,5,6,7,8];
		// 数组合并去重 
		const arr4 = new Set([...arr1, ...arr2]); // [1,2,3,4,5,6,7,8];
		// 对象合并
		// 注意:扩展的后面对象如果存在属性和其之前对象相同则会覆盖其之前的value
		const object3 = { ...object1, ...object2 }; // { a: 2, b: 2 }
		const object4 = { ...object2, ...object1 }; // { a: 1, b: 2 }

03、ES6 模板字面量

	const name = "蜡笔小新";
	const age  = 5;
	// ES5 字符串拼接 以及字符拼接时的逻辑判断
		const str = name + '已经'+ age+'岁了,';
		if(age >= 5) {
			str += '从幼儿园进入到小学了';
		} else {
			str += '还在幼儿园上学';
		}
	// ES6 模板字面量 在 ${} 表达式中可以使用 JavaScript 表达式
		const str = `${name}已经${age}岁了,${ age>=5? '从幼儿园进入到小学了' : '还在幼儿园上学' }`;

04、ES6 数组

小知识: 类数组是指在写法上跟数组一样,比如arguments,函数的第一个参数是argument[0],写法上跟数组一样,但是不是数组,它的原型是Object。eg:

	// 类数组
	Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]
	    0:3
	    1:2
	    callee:ƒ functionName()
	    length:2
	    Symbol(Symbol.iterator):ƒ values()
	    __proto__:Object
 	(1)、Array.includes(value, index) // 包含
		// ES5 在条件判断时存在多个条件进行判断处理
			const cond = 2;
			if(cond == 1 || cond == 2 || cond == 3 || cond ==4){}
		// ES6 includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。
			const condition = [1, 2, 3, 4];
			if(condition.includes(cond)){}
			// includes 第二个参数决定从哪个下标开始查找 默认下标 0
			
	(2)、Array.from(arrayLike[, mapFn[, thisArg]]) // 将类数组对象或可迭代对象转化为数组。
		// 类数组虽然看起类和数组一样但是不能使用数组的方法如ForEach...
		// 将Map、Set 转换成数组
			const map = new Map();
			map.set('key0', 'value0');
			map.set('key1', 'value1');
			const set = new Set([1, 2, 3]);
			console.log(Array.from(map)); // [['key0', 'value0'],['key1', 'value1']]
			console.log(Array.from(set)); // [1, 2, 3]
		// 将字符串转换成数组
			const str = 'abc';
			console.log(Array.from(str)); // ["a", "b", "c"]
		
	(3)、Array.of() // 将给定的元素生成一个数组 不传值为[]
		Array.of(1, 2, 3, 4); // [1, 2, 3, 4];
		// ES5 写法
			function ArrayOf(){
			  return [].slice.call(arguments);
			}
	
	(4)、Array.find(function(currentValue, index, arr),thisValue) 
		// 返回当前当前func 命中条件 若没有命中 返回undefined
		
	(5)、Array.findIndex(function(currentValue, index, arr),thisValue) 
		// 返回当前当前func 命中条件的下标位置 若没有命中 返回 -1
	
	(6)、Array.some(function(currentValue,index,arr),thisValue)
		// func 中条件判断如果有一个判断值为true 则返回 true
		
	(7)、Array.every(function(currentValue,index,arr),thisValue) 
		// func 中条件判断如果有一个判断值为false 则返回 false
		
	(8)、Array.map(function(currentValue,index,arr), thisValue) // 不更改原数组 返回新数组
		// 对数组内容进行修改 一般常用于api返回数据的修改 必须返回内容 如果没有返回则默认undefined
		
	(9)、Array.filter(function(currentValue,index,arr), thisValue) // 不更改原数组 返回新数组
		// 对数组内容进行过滤 不更改原数组 return false 表示该值被过滤处理
	
	(10)、Array.reduce(function(total, currentValue, currentIndex, arr), initVal)
		// initVal:初始值 可选  如果不填写则默认数组第一个值为初始值
		// total: 如果存在initVal 则为initVal 否则第一次为数组第一个值 其余为计算总和的值
		// currentValue: 数组当前对象/值
		
	(11)、Array.fill(value, start, end) // 对指定范围内的内容进行替换
		// start:表示 >= start 的下标范围 
		// end: 表示 < end 的下标范围 默认值是arr.length(数组末尾)
		const arr = [1, 2, 3, 4];
		arr.fill('k', 1, 3); // [1, 'k', 'k', 4]
		
	(12)、Array.copyWithin(target, start, end)  // 改变原数组
		// target: 复制的值从哪个下标开始进行替换
		// start: 	从哪个下标开始进行复制
		// end: 复制到哪个下标开始结束
		const arr = ['o', 'b', 'j', 'e', 'c', 't'];
		arr.copyWithin(1, 3, 5); // ['o', 'e', 'c', 'e', 'c', 't']
		// 在上面例子中 	
		// target: 从下标1 开始进行覆盖 就是从 'b' 开始
		// start( >= ): 从下标3( >=3 ) 开始进行复制 就是从 'e' 开始
		// end( < ): 从下标5( < 5 ) 结束复制 就是到 'c' 结束  
		// start-end: ['e' 'c'] 
		// 将元素组中的 'b'开始进行覆盖 将['b', 'j'](target)替换成 ['e' 'c'](start-end)
		// 被替换的值数量由 start-end 获取到的数量决定
		
	(13)、Array.at()
		const arr = [5, 12, 8, 130, 44];
		// 在数组中获取数组末尾的值时通常使用 数组长度减一(arr[arr.length-1])
			console.log(arr[arr.length-1]); // 44
		// 使用at 可以直接获取 -- 方法不仅可用于数组,也可用于字符串和类型数组
			console.log(arr.at(-1)); //44

05、ES6 可选链式操作符

	// ES5 根据属性获取对象属性值
		const name = object && object.name; // 判断object是否存在name属性如果存在则获取value
	// ES6 
		const name = object?.name; // 如果name存在则获取值 否则undefined
		const name = object['name']; // 使用 [] 表达式取值 如果对象不存在该属性则返回undefined
		const name = object.name; // 使用 . 表达式取值 如果对象不存在则报错终止运行

06、ES6 对象属性名使用表达式

	const object = {};
	const _index = 1;
	// 属性名可以直接使用 [] 表达式动态命名
	object[`attr${index}`] = `attr${index}`

07、ES6 空值合并运算符

	// ES5 判断当前变量是否为 null , undefined, '' 时
		if(value !== null && value !== undefined && value !== ''){};
	// ES6 空值合并运行
		// 注意:空值合并运算符会允许把 0 和 空字符串 '' 作为有效的数值
		// 空值合并运算符 在变量 (value != null || undefined) 时会返回value本身的值 
		// 如果 (value == null || undefined)  则会返回 ?? 表达式 右侧设定的值
		if(value??'' !== ''){}

08、ES6 异步函数 async/await

	// ES5 在Api调用时如果存在多个接口调用 且需要异步处理
		api1().then(res=>{
			api2().then(res2 => {
				//...
			})
		})
	// ES6 使用 async/await
		const func = async () =>{
			const res = await api1();
			const res2 = await api2();
			// ...
		}

09、ES6 Promise

	const api1 = () =>{
	  return new Promise((resolve, reject) => {
	    setTimeout(() => {
	      resolve(1);
	    }, 300);
	  });
	}
	const api2 = () =>{
	  return new Promise((resolve, reject) => {
	    setTimeout(() => {
	      resolve(2);
	    }, 600);
	  });
	}
	// Promise 在处理并发请求时使用Promise.all()
		// 注意:如果请求时 其中一个api 失败则不会返回result
		Promise.all([api1(), api2()]).then(result=>{
			console.log(result); // [res, res2]
		}).catch(err=>{
			console.log(err);
		}).finally(res=>{
			// 如果需要在请求完成后处理逻辑
		})
	// Promise.race() 率先返回用时最短的api值 失败可查看错误日志 catch
		Promise.race([api1(), api2()]).then(result=>{
			console.log(result); // res || res2
		}).catch(err=>{
			console.log(err);
		}).finally(res=>{
			// 如果需要在请求完成后处理逻辑
		})

10、ES6 Symbol

Reflect 详解

	// ES6 中新增的一个数据类型 常用在属性名上面
		let syObject = {};
		const sy = Symbol("key1");
		syObject[sy] = "kk";
		console.log(syObject); // {Symbol(key1): 'kk'}
		
		// 不会出现在 for...in 、 for...of 的循环中
		// 也不会被 Object.keys() 、Object.getOwnPropertyNames() 返回
		for (let i in syObject) {
		  console.log(i);
		}    // 无输出
		Object.keys(syObject);                     // []
		// 可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
		Object.getOwnPropertySymbols(syObject);    // [Symbol(key1)]
		Reflect.ownKeys(syObject);                 // [Symbol(key1)]
		
	// Symbol:每次返回一个新的symbol 
		Symbol('zz') == Symbol('zz'); // false
	// Symbol.for(key):创建一个 symbol 并放入 symbol 注册表中,键为 key 再次调用时则从内存中取出
	 	Symbol.for("key1") == Symbol.for("key1"); // true
 	// Symbol.keyFor(key):一般和 Symbol.for 搭配使用
	 	let yellow1 = Symbol.for("Yellow");
		Symbol.keyFor(yellow1); // "Yellow"

11、ES6 函数(不定参数、默认参数、箭头函数)

	// 不定参数 
		const varargsParams = (...params) => { console.log(params) };
		varargsParams(1,2,3); // [1, 2, 3]
		varargsParams(2); // [2]
	// 默认参数
		const defaultParams = (x=1, y=5) => console.log(x+y);
		defaultParams(); // 6
		defaultParams(2,3); // 5
		defaultParams(3); // 8
	// 箭头函数 使用箭头函数时 this 概念会被模糊掉,通常都是由调用者决定 this 指向问题

12、ES6 flat() 数组扁平化

	const arr = [ 1, 2, 3, [7, 8 , 9, [10, 11, 12, [13, 14, 15],6],5], 4];
	// Flat(level)  level: 扁平化层级
	// flat() 函数将删除原始数组中存在的所有空值  flat()不会改变原数组
		const array1 = [1, , 3, , 5];
		array1.flat(); // [1, 3, 5]
		// level 默认 1 二维数组扁平化
			arr.flat(); // [1, 2, 3, 7, 8, 9, [10, 11, 12, [13, 14, 15],6], 5, 4]
		// level == 0  // 不改变
			arr.flat(0); // [ 1, 2, 3, [7, 8 , 9, [10, 11, 12, [13, 14, 15],6],5], 4];
		// level == 2 // 三维数组扁平化
			arr.flat(2); // [1, 2, 3, 7, 8, 9, 10, 11, 12, [13, 14, 15], 6, 5, 4]
		// level == Infinity 无限深度扁平化
			arr.flat(Infinity); // [1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 6, 5, 4]
		// level < 0 // 和 flat(0) 结果一致
			arr.flat(-Infinity); // [ 1, 2, 3, [7, 8 , 9, [10, 11, 12, [13, 14, 15],6],5], 4];

13、ES6 Map和Set

entries()keys()values()
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。常用来去重处理。

Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突

	// Map 常用来和对象做对比 相对对象来说 操作便利,内存资源占用小 存储格式 [ key, value ]
		const myMap = new Map(); 
		/*	
			Map 实例的属性和方法:
				size:获取成员的数量
				set:设置成员 key 和 value
				get:获取成员属性值
				has:返回一个布尔值,表示该值是否为Map的成员。
				delete:返回一个布尔值,表示删除是否成功
				clear:清空所有
			Map 实例的遍历方法: 
				keys():返回键名的遍历器。
				values():返回键值的遍历器。
				entries():返回所有成员的遍历器。
				forEach():遍历 Map 的所有成员。
		*/
		// myMap.set(key, value) // 设置Map 键,值 -- key可以是任意值
			myMap.set('key', "zero");
			myMap.set(1, "one");
		// myMap.get(key) // 取出对于key值的 value
			myMap.get('key'); // zero
		// 遍历迭代Map  
			console.log(myMap); // {'key' => 'zero', 1 => 'one'}
			for (var [key, value] of myMap) {
			  console.log(key + " = " + value); // 'key' = 'zero', 1 = 'one'
			}
			for (var [key, value] of myMap.entries()) {
			  console.log(key + " = " + value); // 'key' = 'zero', 1 = 'one'
			}
			// 获取 key
				for (var key of myMap.keys()) {
				  console.log(key); // 'key', 1
				}
			// 单独获取 values
				for (var value of myMap.values()) {
				  console.log(value); // 'zero', 'one'
				}
		// Array.from() 可以将Map转成二维数组 
			Array.from(myMap) // [['key', 'zero'],[1, 'one']]
		// 二维数组放入Map中可以转为 Map的键值对
			new Map([['key', 'zero'],[1, 'one']]) // {'key' => 'zero', 1 => 'one'}
		// Map 可以对多个Map实例进行合并处理 效果和Object.assign类似 键名相同 后面的覆盖前面
			var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
			var second = new Map([[1, 'uno'], [2, 'dos']]);
			// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的
			//  {1 => 'uno', 2 => 'dos', 3 => 'three'}
			var merged = new Map([...first, ...second]); 
			
	// Set 一般用来去重处理  存储格式 [ value ]
		const mySet = new Set(); 
		/*
			Set 实例的属性和方法:
				size: 返回Set实例的成员总数。
				add(value):添加某个值,返回 Set 结构本身。
				delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
				has(value):返回一个布尔值,表示该值是否为Set的成员。
				clear():清除所有成员,没有返回值。
			Set 实例的遍历方法:  因为Set 并没有Key 所以在调用时返回的都是value , entries 则是把value当成key
				keys():返回键名的遍历器。 {1, 5, {…}, {…}}
				values():返回键值的遍历器。{1, 5, {…}, {…}}
				entries():返回所有成员的遍历器。{1 => 1, 5 => 5, {a: 1, b: 2} => {a: 1, b: 2}, {a: 1, b: 2} => {a: 1, b: 2}}
				forEach():遍历 Map 的所有成员。1, 5, {a: 1, b: 2}, {a: 1, b: 2}
		*/
		// 相对于Map来说 Set和Array类似 只是Set的值是唯一的
			mySet.add(1); // Set(1) {1}
			mySet.add(5); // Set(2) {1, 5}
			mySet.add(5); // Set(2) {1, 5} 这里体现了值的唯一性
			// 存储的对象内容相同但是 在堆区的地址并不一样 所以可以保存下来  
			// 堆栈的概念可以查看下面链接
			const o = {a: 1, b: 2}; 
			mySet.add(o);
			mySet.add({a: 1, b: 2}); // [{a: 1, b: 2}, {a: 1, b: 2}]
			
		// Set转Array
			[...mySet]; // [1, 5, {a: 1, b: 2}, {a: 1, b: 2}]
			
			

14、ES6 Object的entries(),keys()和values()

	let obj = { a: 1, b: 2, c: 3 };
	// 获取对象的key
		Object.keys(obj); // ['a', 'b', 'c']
	// 获取对象的value
		Object.values(obj); //  [1, 2, 3]
	// 将 key 和 value 以数组的形式都返回 转成二维数组
		Object.entries(obj); //  [['a', 1], ['b', 2], ['c', 3]]
		// 如果不使用循环获取entries的值
			entries.next().value; // ['a', 1] 
			entries.next().value; // ['b', 2]
			entries.next().value; // ['c', 3]
		// 二维数组转成Map集合
		// Object.entries方法的一个用处是,将对象转为真正的Map结构。
			new Map(Object.entries(obj)); // {'a' => 1, 'b' => 2, 'c' => 3}

JavaScript中 堆栈的概念

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值