ES5增加的一些功能

ES5增加的一些功能

ES5是ECMAScript的第五个升级版本

在原有的js中增加了

1.严格模式:使用严格模式在当前代码段的顶部添加字符串:“use strict”
use strict翻译使用严格的
严格模式的4个新要求:

1.禁止给未声明的变量赋值 在非严格模式下没有声明的变量是会自动在全局创建该变量的,在严格模式下是禁止的,严格模式必须声明变量才能使用该变量

<script>
    //在顶部声明严格模式
	"use strict"
	//在非严格模式下,是可行的,会自动在全局创建的,但是在严格模式下是会报错的
	a = 1;
console.log(a)//Uncaught ReferenceError:a is not defined
</script>

2.静默失败:在非严格模式中,执行不成功,但是不会报错.ES5对这一情况进行了改善.在严格模式下,已经将所有的静默失败都升级了错误,在这个情况下便于调试,避免歧义

3.普通函数调用和匿名函数自调中的this默认指undefined,而不再指window

<script>
    //在非严格模式下
	function Student(sname,sage){
    	this.sname = sname
    	this.sage  = sage
	} 
	//正确的使用构造函数
	var zz = new Student('zhuzhu',11)
    console.log(zz)//{sname :zhuzhu,sage:11}
	//错误的使用构造函数  Student函数变成了普通函数 普通函数中的this指向window
	var hbb = Student('hanbinbin',9)
    console.log(hbb)//undefined
	console.log(window.sname)//hanbinbin
</script>


<script>
    //在严格模式下
	function Student(sname,sage){
    	this.sname = sname
    	this.sage  = sage
	} 
	//正确的使用构造函数
	var zz = new Student('zhuzhu',11)
    console.log(zz)//{sname :zhuzhu,sage:11}
	//错误的使用构造函数  Student函数变成了普通函数 普通函数中的this指向undefined
	var hbb = Student('hanbinbin',9)
    //报错:Uncaught TypeError: Cannot set property 'sname' of undefined
    //不能 修改的 属性 sname 在 undefined中
    console.log(hbb)
	console.log(window.sname)
</script>

4.禁止使用arguments.callee

arguments.callee 可以自动获取当前函数对象本身,直接用当前函数对象进行递归调用,与函数名无关了

严格模式下禁用: 因为递归调用效率太低了,重复计算量太大

2.保护对象

阻止对对象的属性进行不符合规定的修改

ES5中把每个对象的属性,变成了一个小对象

获得对象中一个属性的描述小对象
var 属性的描述对象 = Object.getOwnPropertyDescriptor(对象,"属性名")

描述小对象

{
    configurable: true	  //是否可以配置当前描述小对象
	enumerable: true	 //是否可以被枚举
	value: 1			//保存值
	writable: true		//是否可以值修改
}

修改对象中一个属性的描述小对象

Oject.defineProperty(对象,"属性名",{
	开关名:truefalse
})

修改对象中多个属性的描述小对象

Oject.defineProperties(对象,{
    属性名:{
        开关名:truefalse
    }
})

总结:

保护对象,ES5中添加了对象的属性的描述对象,用于控制对象属性值的修改/枚举和配置描述小对象,但是不够灵活所以有访问器属性

访问器属性

用访问器属性保护数据属性不是为了阻止大家使用,而是为了保证大家在合理的范围内使用属性
定义访问器属性:第一步: 先将要保护的属性,隐姓埋名,半隐藏
			第二步: 为受保护的属性,请保镖: 保镖就是访问器属性,但是为对象添加访问器属性,不能直接在对象的{}内添加。只能通过Object.defineProperty()或Object.defineProperties()添加
保镖要冒名顶替原属性名: 访问器属性的名称,应该和想要保护的哪个数据属性名一致,才能起到替身的作用。
保镖一请就是一对儿: get:function(){ reutrn this.受保护的变量}
set:function(value){ ... }
其中getset不能改变,必须这么写

3.call/apply/bind

这三个函数相同点:都是用来替换函数中不想要的this为想要的对象
这三个函数不同点:
	call:只在调用函数时,临时替换一次this为指定的对象
    apply:apply拥有call相同的功能,都能调用函数,并替换其中this为指定对象,但是apply比call多一个功能,apply先打散数组为多个值,在传参
    bind:会创建一个和原函数一模一样的新函数副本,永久绑定新函数副本中的this为指定对象,而且永久绑定一个或多个实参值到形参变量上。(可以绑定多个实参值,但是按顺序绑定)

4.数组新增函数

//判断两个
//判断数组中是否包含符合条件的元素 
var bool=arr.some(function(val){
		return 判断条件
	  })
//判断数组中是否所有元素都符合条件
var bool=arr.every(function(val){
		return 判断条件
	  })
//遍历2个
//仅单纯遍历原数组中每个元素
  arr.forEach(function(val){
		对val的操作
	  })
//遍历元素数组中每个元素,修改后,放入新数组中返回
var 新数组=arr.map(function(val){
		return 根据当前元素值val,修改后的一个新值
	  })
//过滤和汇总
//复制出原数组中符合条件的元素组成新数组返回,原数组保持不变
var 新数组=arr.filter(function(val){
		return 判断条件
	})
//遍历数组中每个元素,对所有元素进行统计,最终得出一个统计结果
var 统计结果=arr.reduce(
		function(prev, val){
			prev+=val;
			return prev
		},
		起始值
	)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值