(1)严格模式是ES5的新特性,严格模式主要有以下变化
- a. 未使用 var 创建的变量会报错
- b. 函数顶层的this不再指向window,而是undefined
- c. 强制为eval创建新的作用域
- d. 禁止使用delete删除变量
- e. 禁止使用arguments, callee, caller属性
- f. 禁止使用with语句
- g. 禁止函数参数重名
- h. 禁止对象属性名重复
- i. 禁止使用八进制数字
- j. 不允许在非函数的代码块内声明函数
- k. 新增保留字:implements, interface, let, package, private, protected, public, static, yield。
(2) Object 新增方法
1. Object.create() 创建一个具有指定原型且可选择性地包含指定属性的对象
Object.create(proto, [ propertiesObject ])
proto: 一个对象,作为新创建对象的原型, 或者为null
propertiesObject:可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符。注意:该参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
propertiesObject 数据详解:
数据属性:
writable:是否可以重写
configurable:是否能够删除,是否能够被修改
enumerable:是否能用 for in枚举
value:值
访问属性
get():访问
set():设置
举例:如何使用 Object.create()实现类式继承
// Shape 父类
function Shape(){
this.x = 0;
this.y = 0;
}
// 父类的方法
Shape.prototype.move = function(x, y){
this.x += x;
this.y += y;
console.info('Shape moved')
}
// 子类
function Rectangle(){
Shape.call(this);
}
// 子继承父类
// 继承一个类
Rectangle.prototype = Object.create(Shape.prototype);
// 混合其他类
Object.assign(MyClass.prototype, OtherSuperClass.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log('Is rect an instance of Rectangle?',
console.log(rect instanceof Rectangle)) // true
console.log('Is rect an instance of Shape?',
console.log(rect instanceof Shape)) // true
console.log(rect.move(1, 1))
***2. Object.getPrototypeOf()***
返回该对象的原型(也就是该对象内部属性[prototype]的值)
var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) == proto;
- Object.getOwnPropertyNames()
返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组
var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]
4. Object.defineProperty()
直接在一个对象上定义一个新属性,或者修改一个已存在的属性,并返回这个对象
Object.defineProperty(obj, prop, descriptor)
obj: 需要定义属性的对象
prop: 需定义或修改的属性的名字
descriptor: 设置被定义或修改的属性的描述符
Object.defineProperty(obj, 'key', {
enumerable: false, // 是否能用 for in枚举
configurable: false, // 是否能够删除,是否能够被修改
writable: false, // 是否可以重写
value: "static"
})
5. Object.defineProperties()
在一个对象上添加或修改一个或者多个自有属性,并返回该对象
Object.defineProperties(obj, props)
obj:将要被添加属性或修改属性的对象
props:该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置
// 示例
var obj = {};
Object.defineProperties(obj, {
"property1": {
value: true,
writable: true
},
"property2": {
value: 'hello',
writable: false
}
})
6. Object.getOwnPropertyDescriptor()
指定对象上一个自有属性对应的属性描述符(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)。
如果指定的属性存在于对象上,则返回其属性描述符,否则返回 undefined
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
console.log(d); // { configurable: true, enumerable: true, value: 42, writable: true }
console.log(Object.getOwnPropertyDescriptor(o, "bbr")) // undefined
7. Object.seal()
可以让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象。
Object.seal(obj)
8. Object.freeze()
返回一个永远不可变的对象
Object.freeze(obj);
9. Object.preventExtensions()
让一个对象变的不可扩展,也就是永远不能再添加新的属性
Object.preventExtensions(obj)
10. Object.isExtrensible()
判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)
Object.isExtensible(obj)
11. Object.isSealed()
判断一个对象是否是密封的
Object.isSealed(obj)
12. Object.isFrozen()
判断一个对象是否被冻结
Object.isFrozen(obj)
13 Object.keys()
返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 for-in 循环还会枚举其原型链上的属性)
(3) Object.prototype 新增方法
1. Object.prototype.isPrototypeOf()
测试一个对象是否存在于另一个对象的原型链上
var arr = [];
console.log(arr instanceof Array);//true
console.log(Array.prototype.isPrototypeOf(arr));//true
isPrototypeOf 和 instanceof operator 是不一样的。在表达式 object instanceof AFunction 中,检测的是 AFunction.prototype 是否在object 的原型链中,而不是检测 AFunction 自身
2. Object.prototype.propertyIsEnumerable()
返回一个布尔值,表明指定的属性名是否是当前对象可枚举的自身属性
var o = {};
o.prop = 'is enumerable';
o.propertyIsEnumerable('prop'); // 返回 true
(4) Function.prototype.bind()
bind()方法会创建一个新函数。当这个新函数被调用时,bind()的第一个参数将作为它运行时的 this, 之后的一序列参数将会在传递的实参前传入作为它的参数。
fun.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg: 当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用new 操作符调用绑定函数时,该参数无效。
arg1, arg2, ...: 当绑定函数被调用时,这些参数将置于实参之前传递给被绑定的方法。
this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 返回 81
var retrieveX = module.getX;
retrieveX(); // 返回 9, 在这种情况下,"this"指向全局作用域
// 创建一个新函数,将"this"绑定到module对象
// 新手可能会被全局的x变量和module里的属性x所迷惑
var boundGetX = retrieveX.bind(module);
boundGetX(); // 返回 81
(5) Array 新增方法
1. Array.isArray()
检测是不是数组
2. Array.prototype.indexof(searchvalue,fromindex)
返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回 -1;
3. Array.prototype.lastIndexOf(searchvalue,fromindex)
返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。
4. Array.prototype.every()
都满足条件返回true, 否则返回false
5. Array.prototype.some()
只要一个满足条件就返回true,否咋返回false
6. Array.prototype.filter()
使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组(返回一个新数组,包括原数组中满足条件的元素)
filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或 等价于 true 的值 的元素创建一个新数组。
7. Array.prototype.forEach()
对数组的每个元素执行一次提供的函数
8. Array.prototype.map()
创建一个新数组,其结果是该数组中的每个元素调用一个提供的函数。
map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。
9. Array.prototype.reduce()
对累加器和数组的每个值 (从左到右)应用一个函数,以将其减少为单个值
var sum = [0, 1, 2, 3].reduce(function(acc, val) {
return acc + val;
}, 0);
console.log(sum);// 6
10. Array.prototype.reduceRight()
reduceRight() 方法接受一个函数作为累加器(accumulator),让每个值(从右到左,亦即从尾到头)缩减为一个值。(与 reduce() 的执行方向相反)
var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
return a.concat(b);
}, []);
// flattened is [4, 5, 2, 3, 0, 1]
(6) String
String.trim();
删除一个字符串两端的空白字符
var orig = ' foo ';
console.log(orig.trim()); // 'foo'
(7) Date
1. Date.now();
返回自1970年1月1日 00:00:00 UTC到当前时间的毫秒数。
IE8及以下可以用以下代码来兼容
if(!Date.now){
Date.now = function(){
return new Date().getTime();
}
}
2. Date.prototype.toISOString()
返回一个 ISO(ISO 8601 Extended Format)格式的字符串: YYYY-MM-DDTHH:mm:ss.sssZ。时区总是UTC(协调世界时),加一个后缀“Z”标识。
(8)JSON
1. JSON.parse();
2. JSON.stringfy();