目录
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
array.reduce()/array.reduceRight()【数组-归并方法】
ES5(ECMAScript 2009)
严格模式 (‘use strict’)
ES5 引入了严格模式,通过 ‘use strict’ 开启,使代码在执行时对错误更加敏感,提高代码的安全性和效率。
'use strict';
x = 10; // ReferenceError: x is not defined
Object对象方法
Object.getPrototypeOf()
Object.getPrototypeOf(),方法返回指定对象的原型 ( 即, 内部[[Prototype]]属性)。
语法:【 Object.getPrototypeOf(obj) 】
参数:obj要设置其原型的对象。
返回值:给定对象的原型。如果没有继承的属性,则返回
null
。
注意事项:在ES5中,TypeError
如果obj
参数不是一个对象,它将会抛出一个异常。在ES6中,参数将被强制为一个Object
。
hasOwnProperty()
hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
语法:【 obj.hasOwnProperty(prop) 】
参数:
prop
要检测的属性 字符串字符串名称或者Symbol。返回值:用来判断某个对象是否含有指定的属性的 Boolean
obj = new Object();
obj.prop = 'exists';
function changeO() {
obj.newprop = obj.prop;
delete o.prop;
}
obj.hasOwnProperty('prop'); // returns true
changeO();
obj.hasOwnProperty('prop'); // returns false
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
语法:【 Object.getOwnPropertyDescriptor(obj, prop)】
参数:
obj
需要查找的目标对象、prop
目标对象内属性名称(String类型)返回值:如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyDescriptors()方法用来获取一个对象的所有自身属性的描述符。
语法:【 Object.getOwnPropertyDescriptors(obj) 】
参数:
obj
任意对象返回值:所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
Object.getOwnPropertyNames()
Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
语法:【 Object.getOwnPropertyNames(obj) 】
参数:
obj
一个对象,其自身的可枚举和不可枚举属性的名称被返回。返回值:在给定对象上找到的属性对应的字符串数组。
object.isPrototypeOf()
object.isPrototypeOf()方法用于测试一个对象是否存在于另一个对象的原型链上。
语法:【 prototypeObj.isPrototypeOf(object) 】
参数:
object
在该对象的原型链上搜寻返回值:如果prototypeObj为 undefined 或 null,会抛出
TypeError。出现原型返回true
Object.create()
Object.create()创建一个拥有指定原型和若干指定属性的对象
语法:【 Object.create(proto[, propertiesObject]) 】
参数:
proto
创建对象的原型,表示要继承的对象。propertiesObject
可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。返回值:在指定原型对象上添加新属性后的对象。
异常:如果
proto
参数不是 null 或一个对象,则抛出一个异常。
Object.defineProperties()
Object.defineProperties()方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
语法:【 Object.defineProperties(obj, props) 】
参数:
obj
在其上定义或修改属性的对象。props
要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty())。描述符具有以下键:configurabletrue
当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。返回值:传递给函数的对象。
Object.defineProperty()
Object.defineProperty()为对象定义一个新属性,或者修改已有的属性,并对属性重新设置 getter 和 setter,这里可以被用作数据绑定的对象劫持用途
语法:【 Object.defineProperty(obj, prop, descriptor) 】
参数:
obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。返回值:被传递给函数的对象。
Object.seal()
Object.seal()方法可以让一个对象密封,并返回被密封后的对象。密封对象将会阻止向对象添加新的属性,并且会将所有已有属性的可配置性(configurable)置为不可配置(false),即不可修改属性的描述或删除属性。但是可写性描述(writable)为可写(true)的属性的值仍然可以被修改。
语法:【 Object.seal(obj) 】
参数:obj将要被密封的对象
返回值:被密封的物体。
Object.isSealed()
Object.isSealed()方法判断一个对象是否被密封。
语法:【 Object.isSealed(obj) 】
参数:obj要被检查的对象。
返回值:表示给定对象是否被密封的一个Boolean
Object.freeze()
Object.freeze()方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。
语法:【 Object.freeze(obj) 】
参数:obj要被冻结的对象。
返回值:被冻结的对象。
Object.isFrozen()
Object.isFrozen() 方法判断一个对象是否被冻结。
语法:【 Object.isFrozen(obj) 】
参数:obj被检测的对象。
返回值:表示给定对象是否被冻结的
Boolean。
Object.preventExtensions()
Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
语法:【Object.preventExtensions(obj) 】
参数:obj将要变得不可扩展的对象。
返回值:已经不可扩展的对象。
Object.isExtensible()
Object.isExtensible()方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。
语法:【Object.isExtensible(obj) 】
参数:obj被检测的对象。
返回值:Boolean表示给定对象是否可扩展。
Object.keys()
Object.keys()返回一个由给定对象的所有可以枚举自身属性的属性名组成的数组
语法:【Object.keys(obj) 】
参数:obj要返回其枚举自身属性的对象。
返回值:一个表示给定对象的所有可枚举属性的字符串数组。
object.toString()
object.toString()方法返回一个表示该对象的字符串。
语法:【 obj.toString() 】
返回值:表示该对象的字符串。
object.valueOf()
object.valueOf() 方法返回指定对象的原始值。
语法:【 object.valueOf() 】
返回值:返回值为该对象的原始值。
Array数组方法
Array.isArray()
Array.isArray() 用于确定传递的值是否是一个Array
语法:【Array.isArray(obj) 】
参数:obj需要检测的值。
返回值:如果对象是Array,则为true; 否则为false。
Array.isArray([1, 2, 3]); // true
Array.isArray({foo: 123}); // false
Array.isArray('foobar'); // false
Array.isArray(undefined); // false
array.push()
array.push()方法将一个或多个元素添加到数组的末尾,并返回新数组的长度。
array.pop()
array.pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
语法:【 arr.pop() 】
返回值:从数组中删除的元素(当数组为空时返回undefined)。
var a = [1, 2, 3];
a.pop();
console.log(a); // [1, 2]
array.shift()
array.shift()方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
语法:【 arr.shift()】
返回值:从数组中删除的元素(当数组为空时返回undefined)。
var a = [1, 2, 3];
var b = a.shift();
console.log(a); // [2, 3]
console.log(b); // 1
array.unshift()
array.unshift()方法将一个或多个元素添加到数组的开头,并返回新数组的长度。
var a = [1, 2, 3];
a.unshift(4, 5);
console.log(a); // [4, 5, 1, 2, 3]
array.reverse()
array.reverse() 方法将数组中元素的位置颠倒。第一个数组元素成为最后一个数组元素,最后一个数组元素成为第一个。
var a = ['one', 'two', 'three'];
a.reverse();
console.log(a); // ['three', 'two', 'one']
array.sort()
array.sort()方法用就地( in-place )的算法就地( in-place )的算法对数组的元素进行排序,并返回数组。 sort 排序不一定是稳定的稳定的稳定的。默认排序顺序是根据字符串Unicode码点。默认情况下,按升序排序数组项,返回排序后的数组
语法:【 arr.sort() arr.sort(compareFunction) 】
参数:
compareFunction
可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。返回值:返回排序后的数组。原数组已经被排序后的数组代替。
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
// 根据value排序
items.sort(function (a, b) {
return a.value - b.value;
});
array.concat()
array.concat()方法用于合并两个或更多数组。此方法不会更改现有的数组,而是返回一个新的数组。
var arr1 = ['a', 'b', 'c'];
var arr2 = ['d', 'e', 'f'];
var arr3 = arr1.concat(arr2);
array.join()
array.join()方法将一个数组(或一个类数组对象类数组对象)的所有元素连接成一个字符串并返回这个字符串。
var a = ['Wind', 'Rain', 'Fire'];
a.join(); // 'Wind,Rain,Fire'
a.join('-'); // 'Wind-Rain-Fire'
array.slice()
array.slice()方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。
语法:【 arr.slice()、 arr.slice(begin)、 arr.slice(begin, end) 】
参数:
- begin可选,从该索引处开始提取原数组中的元素(从0开始)。如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice
(-2)
表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。如果省略则slice从索引 0 开始。- end可选,在该索引处结束提取原数组元素(从0开始)。
- slice会提取原数组中索引从 begin 到 end的所有元素(包含begin,但不包含end)。
- slice
(1,4)
提取原数组中的第二个元素开始直到第四个元素的所有元素 (索引为 1, 2, 3的元素)。 如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。- slice
(-2,-1)
表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。- 如果 end被省略,
则
slice会一直提取到原数组末尾。如果 end大于数组长度,slice也会一直提取到原数组末尾。返回值:一个含有提取元素的新数组
描述:
- 如果该元素是个对象引用 (不是实际的对象),slice会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
- 对于字符串、数字及布尔值来说(就是String、Number或者 Boolean 对象),slice会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。
array.splice()
array.splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。
语法:【 array.splice(start) 、array.splice(start, deleteCount)、 array.splice(start, deleteCount, item1, item2, ...) 】
参数:
- start
指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从1计数);若只使用start参数而不使用deleteCount、item,如:array.splice(start) ,表示删除[start,end]的元素。- deleteCount可选整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果 deleteCount 大于start之后的元素的总数,则从
start
后面的元素都将被删除(含第start
位)。如果deleteCount被省略,则其相当于(arr.length - start)。item1,item2,...
可选要添加进数组的元素,从start
位置开始。如果不指定,则splice()
将只删除数组元素。- splice方法使用deleteCount参数来控制是删除还是添加
返回值:被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除
元素,则返回空数组。
从第2位开始删除0个元素,插入“你好”
var arr = ['aaa', 'bbb', 'ccc', 'ddd'];
var removed = arr.splice(2, 0, '你好');
// arr 是 ['aaa', 'bbb', '你好', 'ccc', 'ddd']
// removed是 [], 没有被删除的项
array.indexOf()
array.indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
注意:对于String方法,请参阅String.prototype.indexOf()
。
语法:【 arr.indexOf(searchElement, fromIndex]) 】
参数:searchElement要查找的元素。
fromIndex开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
返回值:首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1
var array = [2, 9, 9];
array.indexOf(2); // 0
array.indexOf(7); // -1
array.indexOf(9, 2); // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0
array.lastIndexOf()
array.lastIndexOf()返回指定元素在数组中的最后一个索引值,如果不存在则返回 -1
语法:【 arr.lastIndexOf(searchElement),arr.lastIndexOf(searchElement, fromIndex) 】
参数:searchElement被查找的元素。
fromIndex从此位置开始逆向查找。 默认为数组的长度减 1,即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。
返回值:数组中最后一个元素的索引,如未找到返回-1。
array.every()
array.every()对数组中的每一项运行给定函数 ,如果该函数对每一项都返回 true,则返回 true(方法测试数组的所有元素是否都通过了指定函数的测试)
下例检测数组中的所有元素是否都大于 10。
function isBigEnough(element, index, array) {
return element >= 10;
}
[12, 5, 8, 130, 44].every(isBigEnough); // false
[12, 54, 18, 130, 44].every(isBigEnough); // true
简写形式
[12, 5, 8, 130, 44].every(x => x >= 10); // false
[12, 54, 18, 130, 44].every(x => x >= 10); // true
array.filter()
array.filter()方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
var words = ["spray", "limit", "elite", "exuberant", "destruction", "present"];
var longWords = words.filter(function(word){
return word.length > 6;
});
// Filtered array longWords is ["exuberant", "destruction", "present"]
// ES6写法
var words = ["spray", "limit", "elite", "exuberant", "destruction", "present"];
var longWords = words.filter(word => word.length > 6);
// Filtered array longWords is ["exuberant", "destruction", "present"]
array.forEach()
array.forEach()方法对数组的每个元素执行一次提供的函数。
语法:【array.forEach(callback(currentValue, index, array), thisArg); 】
参数:callback:对数组的每个元素执行的函数,接受三个参数:当前元素的值、当前元素的索引、原数组。
thisArg:执行回调时使用的this值。
返回值:array.forEach()不返回任何值(没有返回值)。
array.map()
array.map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回。
语法:【 array.map(function(currentValue,index,arr), thisValue) 】
参数:callback为数组中每个元素执行的函数,该函数可接受1-3个参数:
currentvalue参数表示数组的当前元素项,必须的参数
index参数表示的当前元素下标,可选参数
arr参数表示当前元素所属的数组,可选参数thisValue表示执行回调函数callback()时的this指向。可选参数。当不写时,则默认是指向window全局
返回值:map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
array.some()
array.some()方法测试数组中的某些元素是否通过由提供的函数实现的测试。
语法:【array.some(callback(currentValue, index, array), thisArg) 】
参数:callback:一个函数,它会被调用数组中每个元素,直到找到一个使该函数返回 true 的元素。
- currentValue:当前正在处理的数组元素。
- index(可选):当前正在处理的数组元素的索引。
- array(可选):正在操作的数组。
thisArg(可选):执行 callback 函数时用作 this 的值。
返回值:如果 callback 函数对任一元素返回 true,则返回 true;如果 callback 函数从未返回 true,则返回 false。
应用场景:权限检查、表单验证、库存管理、内容审查和数据处理。
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
array.reduce()/array.reduceRight()【数组-归并方法】
array.reduce()和array.reduceRight()区别就是 reduce 从第一项开始向后遍历,reduceRight( ) 则从最后一项开始向前遍历
array.reduce()方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。
示例一:求和
var total = [0, 1, 2, 3].reduce(function(sum, value) {
return sum + value;
}, 0);
// total is 6
示例二:将二维数组转化为一维
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
}, []);
// flattened is [0, 1, 2, 3, 4, 5]
array.reduceRight()方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。
示例一:求和
var total = [0, 1, 2, 3].reduceRight(function(a, b) {
return a + b;
});
// total == 6
示例二:将二维数组转化为一维
var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
return a.concat(b);
}, []);
// flattened is [4, 5, 2, 3, 0, 1]