ES5 发行时间
严格模式
- 运行模式: 正常(混杂)模式与严格模式
- 应用严格模式:
use strict
<script type="text/javascript">
'use strict';
</script>
- 作用:
- 使得 Javascript 在更严格的条件下运行
- 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为
- 消除代码运行的一些不安全之处,保证代码运行的安全
- 需要记住的几个变化
- 声明定义变量必须用
var
- 禁止自定义的函数中的
this
关键字指向全局对象 - 创建
eval
作用域, 更安全
JSON 对象
- 作用:用于在 json 对象/数组与 js 对象/数组相互转换
JSON.stringify(obj/arr)
:js 对象(数组)转换为 json 对象(数组)JSON.parse(json)
:json 对象(数组)转换为 js 对象(数组)
Object 扩展
Object.create(prototype, [descriptors])
:以指定对象为原型创建新的对象,为新的对象指定新的属性, 并对属性进行描述
value
:指定值writable
:标识当前属性值是否是可修改的, 默认为 true
configurable
:标识当前属性是否可以被删除,默认为 false
enumerable
:标识当前属性是否能用 for in
枚举,默认为 false
<script type="text/javascript">
var obj = {username: 'danny', age: 30};
var obj1 = Object.create(obj, {
sex: {
value: '男',
writable: true,
configurable: true,
enumerable:true
}
});
console.log(obj1.sex);
obj1.sex = '女';
delete obj1.sex;
for(var i in obj1) {
console.log(i);
}
</script>
Object.defineProperties(object, descriptors)
:为指定对象定义扩展多个属性
- get 方法:用来得到当前属性值的回调函数
- set 方法 : 用来监视当前属性值变化的回调函数
- 存取器属性:
setter
,getter
一个用来存值,一个用来取值
<script type="text/javascript">
var obj2 = {firstName: 'danny', lastName: 'Bob'};
Object.defineProperties(obj2, {
fullName: {
get: function () {
return this.firstName + ' ' + this.lastName;
}
set: function(data) {
var names = data.split(' ');
this.firstName = names[0];
this.lastName = name[1];
console.log(data);
}
}
});
console.log(obj1.sex);
</script>
<script type="text/javascript">
var obj2 = {
firstName: 'danny',
lastName: 'Bob',
get fullName() {
return this.firstName + ' ' + this.lastName;
},
set fullName(data) {
var names = data.split(' ');
this.firstName = names[0];
this.lastName = name[1];
}
};
</script>
Array扩展
Array.prototype.indexOf(value)
:得到值在数组中出现 value 的第一个下标Array.prototype.lastIndexOf(value)
:得到值在数组中出现 value 元素的最后一个下标Array.prototype.forEach(function(item, index){})
:遍历数组
var arr = [2, 3, 4, 2, 1];
arr.forEach(function (item, index) {
console.log(item, index);
});
Array.prototype.map(function(item, index){})
:遍历数组返回一个新的数组
var arr1 = arr.map(function (item, index) {
return item + 10;
});
Array.prototype.filter(function(item, index){})
:遍历过滤出一个子数组
var arr2 = arr.filter(function (item, index) {
return item > 3;
});
Function扩展
Function.prototype.bind(obj)
:将函数内的 this 绑定为 obj , 并将函数返回
| this 的绑定对象 |
---|
方法调用模式 | 调用该方法的对象 |
函数调用模式 | 如:function fn() {}
fn(); this 被绑定到 window 上 |
call()、apply()、bind()
:改变函数运行时 this 的指向
| 参数 |
---|
call() | 第一个参数:要绑定给 this 的值,后面的是参数列表,直接用逗号隔开即可 |
apply() | 第一个参数:要绑定给 this 的值,第二个参数是一个参数数组。 |
bind() | 和 call() 很相似,第一个参数:要绑定给 this 的值,后边是一系列参数列表 |
注
:
- 第一个参数为
null
,undefine
时,默认指向 window
bind
绑定完 this ,不会立即调用当前函数,而是将函数返回,并且原函数中的 this 指向并没有被改变。call 和 apply 是绑定完立即调用- 低版本中没有 bind 方法,实现代码
if (!Function.prototype.bind) {
Function.prototype.bind = function () {
var self = this,
context = [].shift.call(arguments),
args = [].slice.call(arguments);
return function () {
self.apply(context, [].concat.call(args, [].slice.call(arguments)));
}
}
}