ES5&ES6 day016

77 阅读4分钟

ES5:没有简化操作,但是带来了一些新特性

1、保护对象:属性和方法

保护对象:属性和方法
	1、底层具有四大特性:
		{
				"value": "威图", - 真正实际保存值的地方
				"writable": true, - 开关:控制着是否可以被修改
				"enumerable": true, - 开关:控制着是否可以被for in循环遍历到
				"configurable": true - 开关:控制着是否可以被删除,总开关:一旦设置为false,其他特性不可以再次修改,自己也不可逆
		}

		如何修改四大特性:
			Object.defineProperties(对象名,{
				"属性名":{四大特性},
				...
			})

	2、三个级别:
		1、防扩展:防止添加:Object.preventExtensions(obj);

		2、密封:防止添加、删除:Object.seal(obj);

		3、冻结:防止添加、删除、修改:Object.freeze(obj);

	没用的:
		1、如果你不用面向对象开发,你保护个串串
		2、前辈们都没有保护,你更不用保护了

2、*数组的新API:3组6个:

*1、判断

	every:每一个,理论完全等效于&&,必须全部满足结果才为true,只要一个不满足,结果就为false
		var bool=arr.every(function(val,i,arr){
			//val - 当前值
			//i - 当前值的下标
			//arr - 数组本身,前辈们提供了3个形参,不代表3个形参对我们都有用
			//如果你没有写return,默认return undefined,那一来就false了
			return 条件;//必写的
		})

	some:有一些,理论完全等效于||,必须全部不满足结果才为false,只要一个满足,结果就为true
		var bool=arr.some(function(val,i,arr){
			return 条件;//必写的
		})

数组的新api判断.png

*2、遍历

遍历:对数组中的每一个元素执行相同 或 相似的操作
         
         forEach:直接修改原数组 - 个人更喜欢
			arr.forEach(function(val,i,arr){
				操作
			})

		map:不修改原数组,【返回】一个新数组
			var newArr=arr.map(function(val,i,arr){
				return 操作;
			})

过滤和汇总 新数组的API.png

3、过滤和汇总

过滤:根据你的条件,筛选出你需要的部分,但是不会修改原数组
			var subArr=arr.filter(function(val,i,arr){
				return 条件
			})

		汇总:把元素汇总到一起
			arr.reduce(function(prev,val,i,arr){//prev - 我们当初取名字的sum,prev为0,不断的做操作就完了
				return prev+val;
			},基础值);//基础值会和arr累加后的结果再次相加

其实以上6个API,都是简化了for循环,一切的回调函数再拥有ES6过后都可以简化为箭头函数,以后我们不要再写for循环了,前提的是一个数组

4、Object.create()

	Object.create():根据父对象创建子对象,设置好继承
	var 子对象=Object.create(父对象,{
		"属性名":{四大特性},
		...
	});

5、面试时会问你什么是严格模式:严格模式:很严格

	开启:在你的任何作用域的顶部加上一句话:"use strict"
	功能:1、禁止了给未声明的变量赋值 - 解决全局污染
	          2、静默失败升级为了错误
	一旦报错后续代码就不再运行了

6、 ***** call、apply、bind:不是自己的方法也可以用 - 笔试面试都很容易碰到

*call和apply 临时调用 -借

        call/apply:【临时】替换了函数中的this - 借用
		
		语法:函数名.call(借用的对象,实参,...) - 单独传入每一个实参
		          函数名.apply(借用的对象,arr) - 只能传入一个实参,要求是一个数组实参,apply会悄悄的打散数组
		
		强调:call/apply,相当于立刻调用函数,立刻执行

call和apply.png

*bind:【永久】替换了函数中的this - 买

		3件事:
		1、创建了一个和原函数功能完全相同的新函数
		2、将新函数钟的this永久绑定为了指定对象
		3、将新韩淑中的部分参数永久固定
		用法:var 新函数=原函数.bind(指定对象,永久实参,....); - 不是立刻执行的,需要自己调用
		强调:bind绑定的新函数没有办法被call/apply借走

bind.png

*固定套路 call/apply

         个人更推荐:call/apply - 借:白嫖

		1Math.max/min.apply(Math,arr);
		2Object.prototype.toString.call/apply(x);
		3、***类数组转为普通数组:
			var 普通数组=Array.prototype.slice.call/apply(类数组对象);
			ES5还给出了一种方案:var 普通数组=Array.from(类数组对象)

*摇号功能案例

摇号功能案例.png

ES6(ES2015):不光带了新特性,还带来了新语法,都是简化操作

1、*模板字符串

*模板字符串:可以在字符串中放入变量 - 不需要再做字符串拼接,在字符串中实现了一个简单的js环境
`我的名字叫${name}`

模板字符串.png

2、*let关键字

	let关键字:创建变量,以后要【优先】使用let创建变量s
	let 变量名=值;
	作用:
		1、禁止声明提前
		2、添加了块级作用域 - 一个{}就是一个块!
		3、记录着当前触发事件的元素的下标!

3、*箭头函数:简化一切回调函数

箭头函数:简化一切回调函数
口诀:function删掉,在()和{}之间添加=>,形参如果只有一个,可以省略小括号,函数体只有一句话,删除{},函数体只有一句话并且是return,{}和return都删掉

摇号功能箭头函数.png

4、for of循环:垃圾

	for(var v of arr){
		v;//当前值
	}

	缺点:1、因为没有下标,无法修改原数组
	          2、无法遍历hash数组,也不能遍历对象