列舉一下JavaScript數(shù)組和對象有哪些原生方法?
數(shù)組:
-
arr.concat(arr1, arr2, arrn);--合并兩個或多個數(shù)組。此方法不會修改原有數(shù)組,而是返回一個新數(shù)組 -
arr.fill(value,start,end) ;--用一個固定值填充一個數(shù)組中從起始索引到終止索引內(nèi)的全部元素。此方法會修改原有數(shù)組 -
arr.filter((element,index,array)=>{},this) ;--filter方法過濾數(shù)組,返回一個新數(shù)組, 其保留 通過所提供函數(shù)測試的 所有元素。此方法不會修改原有數(shù)組 -
arr.reduce((previousValue,currentValue,index,array) => {},initialValue);--reduce方法迭代數(shù)組的所有項,又稱為“累加器”,返回函數(shù)最終計算的一個值。 -
arr.join(",");--將一個數(shù)組的所有元素連接成一個字符串返回。不會修改原有數(shù)組 -
arr.sort();--對數(shù)組的元素進行排序,并返回數(shù)組。此方法會修改原有數(shù)組 -
arr.unshift(e1, e2, en);--添加元素到數(shù)組的頭部,返回該數(shù)組的新長度。此方法會修改原有數(shù)組 -
arr.push(e1, e2, en);--添加元素到數(shù)組的尾部,返回該數(shù)組的新長度。此方法會修改原有數(shù)組 -
arr.pop();--刪除數(shù)組尾部的元素。此方法會修改原有數(shù)組 -
arr.shift();刪除數(shù)組頭部的元素。此方法會修改原有數(shù)組 -
arr.splice(index, count);--刪除任意位置元素的方法。此方法會修改原有數(shù)組 -
arr.reverse();--將數(shù)組中元素的位置顛倒,并返回該數(shù)組。此方法會修改原有數(shù)組 -
arr.slice(start, end);--包頭不包尾的截取數(shù)組中的一段,并返回新數(shù)組。不會修改原有數(shù)組 -
arr.splice(index, count, e1, e2, en);--添加元素到數(shù)組的任何位置。此方法會修改原有數(shù)組 -
arr.indexOf(searchElement,fromIndex);--返回在數(shù)組中可以找到一個給定元素的第一個索引,如果不存在,則返回-1。 -
arr.includes(searchElement,fromIndex);// ES6 --判斷一個數(shù)組是否包含一個指定的值,根據(jù)情況,返回布爾值。 -
arr.map((currentValue,index,array) => {} ,this);--創(chuàng)建一個新數(shù)組,其結(jié)果是該數(shù)組中的每個元素是調(diào)用一次提供的函數(shù)后的返回值。此方法不會修改原有數(shù)組 -
arr.forEach((currentValue,index,array) => {} ,this);--對數(shù)組的每個元素執(zhí)行一次給定的函數(shù)。 -
arr.from(arrayLike,(currentValue) => {} ,this);--從一個類似數(shù)組或可迭代對象創(chuàng)建一個新的數(shù)組,淺拷貝的數(shù)組實例。此方法會修改原有數(shù)組 -
arr.find((element,index,array) => {} ,this);--返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的值。否則返回 undefined。find方法不會改變數(shù)組 -
arr.findIndex((element,index,array) => {} ,this);-- 返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的索引。若沒有找到對應(yīng)元素則返回-1。findIndex不會修改所調(diào)用的數(shù)組 -
arr.flat(depth);--會按照一個可指定的深度遞歸遍歷數(shù)組,并將所有元素與遍歷到的子數(shù)組中的元素合并為一個新數(shù)組返回。此方法不會修改原有數(shù)組 -
arr.flatMap((currentValue,index,array) => {} ,this);--首先使用映射函數(shù)映射每個元素,然后將結(jié)果壓縮成一個新數(shù)組。與 map 連著深度值為1的 flat幾乎相同,但flatMap通常在合并成一種方法的效率稍微高一些。此方法不會修改原有數(shù)組 -
arr.some((element,index,array)=>{},this)--依據(jù)判斷條件,數(shù)組的元素是否有一個滿足,若有一個滿足則返回ture -
arr.every((element,index,array)=>{},this)--依據(jù)判斷條件,數(shù)組的元素是否全滿足,若滿足則返回ture
對象:
-
Object.assign();--將所有可枚舉屬性的值從一個或多個源對象分配到目標(biāo)對象,它將返回目標(biāo)對象 -
Object.defineProperty() ;--直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性,并返回此對象 -
object.hasOwnProperty(prop);--對象自身屬性中是否具有指定的屬性(返回布爾值) -
Object.getOwnPropertyNames();--返回一個由指定對象的所有自身屬性的屬性名組成的數(shù)組 -
object.propertyIsEnumerable(prop);--判斷指定的屬性是否可枚舉(返回布爾值) -
object.valueOf();--返回指定對象的原始值 -
object.toString();--返回一個表示該對象的字符串,Object.prototype.toString.call() -
Object.create();--創(chuàng)建一個新對象,使用現(xiàn)有的對象來提供新創(chuàng)建的對象的proto。 -
Class.prototype.isPropertyOf(object);--測試一個對象是否存在于另一個對象的原型鏈上 -
Object.keys() ;--方法會返回一個由一個給定對象的自身可枚舉屬性組成的數(shù)組 -
Object.values();--方法返回一個給定對象自身的所有可枚舉屬性值的數(shù)組 -
Object.entries();--方法返回一個給定對象自身可枚舉屬性的鍵值對數(shù)組 -
Object.setPrototypeOf() ;--方法設(shè)置一個指定的對象的原型 -
Object.getPrototypeOf() ;--方法返回指定對象的原型
Array.slice() 與 Array.splice() 的區(qū)別?
arr.slice(開始位置(含), 結(jié)束位置(不含)):“讀取”數(shù)組指定的元素,不會對原數(shù)組進行修改;
arr.splice(index, count, [insert Elements]):操作”數(shù)組指定的元素,會修改原數(shù)組,返回被刪除的元素;
index :是操作的起始位置
count = 0 :插入元素,count > 0 :刪除元素;
[insert Elements] :向數(shù)組新插入的元素;
數(shù)組去重方法總結(jié):
- 方法一、利用ES6 Set去重(ES6中最常用)
//ES6 中的 Set 去重
function unique(array) {
return Array.from(new Set(array));
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
//{}沒有去重
- 方法二、利用for嵌套for,然后splice去重(ES5中最常用)
//雙層 for 循環(huán)
function unique(arr) {
let len = arr.length;
//雙層循環(huán),外層循環(huán)元素,內(nèi)層循環(huán)時比較值。值相同時,則刪去這個值。
for (let i=0; i<len; i++) {
for (let j=i+1; j<len; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1);
// splice 會改變數(shù)組長度,所以要將數(shù)組長度 len 和下標(biāo) j 減一
len--;
j--;
}
}
}
return arr;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
// [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", Object { }, Object { }]
// NaN和{}沒有去重,兩個null直接消失了
- 方法三、利用indexOf去重
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var array = [];
for (var i = 0; i < arr.length; i++) {
if (array .indexOf(arr[i]) === -1) {
array .push(arr[i])
}
}
return array;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]
//NaN、{}沒有去重
- 方法四、利用sort()
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return;
}
arr = arr.sort()
var arrry= [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) {
arrry.push(arr[i]);
}
}
return arrry;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[0, 1, 15, NaN, NaN, "NaN", {…}, {…}, "a", false, null, "true", true, undefined]
//NaN、{}沒有去重
- 方法五、利用對象的屬性不能相同的特點進行去重
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var arrry= [];
var obj = {};
for (var i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
arrry.push(arr[i])
obj[arr[i]] = 1
} else {
obj[arr[i]]++
}
}
return arrry;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, null, NaN, 0, "a", {...}]
// //兩個true直接去掉了,NaN和{}去重
- 方法六、利用includes
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var array =[];
for(var i = 0; i < arr.length; i++) {
if( !array.includes( arr[i]) ) {//includes 檢測數(shù)組是否有某個值
array.push(arr[i]);
}
}
return array
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
//{}沒有去重
- 方法七、利用hasOwnProperty
function unique(arr) {
var obj = {};
return arr.filter(function(item, index, arr){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]
//所有的都去重了
- 方法八、利用filter
function unique(arr) {
return arr.filter(function(item, index, arr) {
//當(dāng)前元素,在原始數(shù)組中的第一個索引==當(dāng)前索引值,否則返回當(dāng)前元素
return arr.indexOf(item, 0) === index;
});
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
//{}沒有去重
- 方法九、利用遞歸去重
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var array =[];
for(var i = 0; i < arr.length; i++) {
if( !array.includes( arr[i]) ) {//includes 檢測數(shù)組是否有某個值
array.push(arr[i]);
}
}
return array
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
//{}沒有去重
- 方法十、利用Map數(shù)據(jù)結(jié)構(gòu)去重
function unique(arr) {
let map = new Map();
let array = new Array(); // 數(shù)組用于返回結(jié)果
for (let i = 0; i < arr.length; i++) {
if(map .has(arr[i])) { // 如果有該key值
map .set(arr[i], true);
} else {
map .set(arr[i], false); // 如果沒有該key值
array .push(arr[i]);
}
}
return array ;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {...}, {...}]
//{}沒有去重
- 方法十一、利用reduce+includes
function unique(arr){
return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr));
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
- 方法十二、[...new Set(arr)]
[...new Set(arr)]
//代碼就是這么少----(其實,嚴(yán)格來說并不算是一種,相對于第一種方法來說只是簡化了代碼)
快速的讓一個數(shù)組亂序
var arr = [1,2,3,4,5,6,7,8,9,10];
arr.sort(function(){
return Math.random() - 0.5;
})
console.log(arr);
判斷是否是數(shù)組
Array.isArray(arr)Object.prototype.toString.call(arr) === '[Object Array]'arr instanceof Arrayarray.constructor === Array
參考:最新數(shù)組去重