摘要:檢測檢測一個變量是否為數(shù)組類型,最直接的方法這種方法問題在于如果網(wǎng)頁中有多個框架,即存在多個版本的構(gòu)造函數(shù),不同框架的數(shù)組實例檢測起來就會失敗,但這種情況畢竟不常見。
無論什么編程語言,數(shù)組總是用的最多的引用數(shù)據(jù)類型之一。JS中的數(shù)組有些特殊,它不像Java那種強類型語言那樣,一個數(shù)組只能存放一種類型的數(shù)據(jù)。JavaScript允許數(shù)組中的每一項的數(shù)據(jù)類型不同。、
本文分九個層面對JavaScript數(shù)組的功能及用法做一個簡單的介紹。
創(chuàng)建數(shù)組的創(chuàng)建無非有兩種方式:
構(gòu)造函數(shù):
var arr1 = new Array(1,2,3,4); // [1,2,3,4] var arr2 = new Array(2); // [,,,]
字面量:
var arr1 = [1,2,3,4];
如上,構(gòu)造函數(shù)Array()在傳入一個數(shù)值作為參數(shù)時,這個數(shù)值是數(shù)組的長度,顯然存在歧義,ES6中的Array.of()方法完善了這一點。
Array.of(1, 2, 3, 4); // [1, 2, 3, 4]
Array.of(2); // [2]
當然,絕大數(shù)情況都是使用字面量的形式去創(chuàng)建數(shù)組的。
讀寫對數(shù)組進行讀寫,最簡單的莫過于
var arr = [1, 2, 3, 4]; arr[1]; // 2 arr[1] = 5;
另外,數(shù)組的length屬性是可寫的,改變length值也會改變數(shù)組:
arr.length = 5; // [1, 2, 3, 4,] arr[4]; // undefined
利用length值還可以在數(shù)組末尾新增項:
arr[arr.length] = 7; // 數(shù)組最后一項的index為 length - 1
復雜一點的讀寫方式有:push()、pop()、shift()、unshift()
push()、pop()使得數(shù)組可以作為棧的一種實現(xiàn),push()可以接受任意數(shù)量的參數(shù),并將其添加至數(shù)組尾部返回修改后的數(shù)組長度,pop()彈出并返回數(shù)組最后一個元素。shift()、push()使數(shù)組可以作為隊列的一種實現(xiàn),shift()將數(shù)組第一個元素彈出并返回。而unshift()在數(shù)組頭部添加任意數(shù)量的元素并返回長度。
檢測一個變量是否為數(shù)組類型,最直接的方法:
target instanceof Array
這種方法問題在于如果網(wǎng)頁中有多個框架,即存在多個版本的Array構(gòu)造函數(shù),不同框架的數(shù)組實例檢測起來就會失敗,但這種情況畢竟不常見。
另外就是
Array.isArray(target);
這個API的問題在于過老版本的瀏覽器不支持ES5,但也不足為道。
檢測數(shù)組中是否存在某個值,在ES5中往往通過indexOf()實現(xiàn),但ES6新增了includes()方法,彌補了arr.indexOf(value) === -1;在語義化和忽略了NaN的問題。
var arr = [1, 2, 3, 4, NaN]; arr.includes(NaN); // true轉(zhuǎn)換
將數(shù)組轉(zhuǎn)換為字符串,默認的方法有toString(),toLocalString(),valueOf(),以上三種方法都是對數(shù)組的每一項調(diào)用該方法,然后用逗號連接這些項;當需要用其他符號連接每一項時,就需要用到j(luò)oin()方法:
var arr = [1, 2, 3, 4, 5]; arr.join("*"); // 1*2*3*4*5
將數(shù)組轉(zhuǎn)換為參數(shù)列表:使用的是ES6的擴展運算符...,這在函數(shù)調(diào)用的時候十分有用
function add(x, y, z) { return x + y + z; } add(...[1, 2, 3]); // 6
可以利用這一點對一些只接受參數(shù)列表的函數(shù)傳遞數(shù)組,從而實現(xiàn)某種需求,如求數(shù)組中的最大值:
var arr = [1, 2, 3, 4, 5]; // ES5 Math.max().apply(null, arr); // ES6 Math.max(...arr);
將其他數(shù)據(jù)類型(類數(shù)組對象、可遍歷對象(如arguments對象,NodeList對象))轉(zhuǎn)換為數(shù)組:可以用擴展運算符,也可以用Array.from()。
兩者的區(qū)別在于擴展運算符調(diào)用的是目標對象的iterator接口,所以...只能將可遍歷對象轉(zhuǎn)換為數(shù)組,而Array.from()還可以將類數(shù)組對象,即擁有l(wèi)ength屬性的對象轉(zhuǎn)換為數(shù)組。另外Array.from()還可接受第二個參數(shù):作用類似于map函數(shù);第三個參數(shù):第二個參數(shù)中的this。
無論是擴展運算符還是Array.from(),在將字符串轉(zhuǎn)換為數(shù)組時都會將32位Unicode字符正確識別為一個字符,可以利用這一點來正確讀取字符串的長度。
排序數(shù)組實例有兩個方法可以對數(shù)組排序,分別是reverse() 和 sort()。
reverse()僅僅將數(shù)組的順序反轉(zhuǎn),而如果簡單地調(diào)用sort(),無論數(shù)組的每一項為何值,都會將其轉(zhuǎn)換為字符串比較,就會出現(xiàn)奇怪的現(xiàn)象:
var arr = [2, 10, 5, 4]; arr.reverse(); // [4, 5, 10, 2] arr.sort(); // [10, 2, 4, 5]
這是因為字符串比較的是對應(yīng)位置的Unicode值,因為1在2前面所以10比2小。這樣顯然是不合理的,需要向sort傳入排序規(guī)則,如:
var arr = [2, 10, 5, 4]; arr.sort(function(curr, next) { if (curr < next) { return -1; } else if (curr > next) { return 1; } else { return 0; } }); arr // [2, 4, 5, 10]
因為arr的每一項都是數(shù)值,可以寫成
arr.sort(function(curr, next) { return curr - next; });操作
將多個數(shù)組或者參數(shù)拼入已有的數(shù)組————concat(item1, arr, item2...)
concat接收任意多個參數(shù),可以是數(shù)組或者其他類型,返回一個新的數(shù)組。
// concat不會改變原數(shù)組 var arr = [1, 2, 3, 4]; var arr1 = arr.concat(5, [6, 7]); arr1; // [1, 2, 3, 4, 5, 6, 7]
取出數(shù)組中某一段————slice()
slice接收一個或兩個參數(shù),接收一個參數(shù)時返回這個參數(shù)代表的位置到數(shù)組末尾的段,接收兩個參數(shù)時返回兩個參數(shù)之間的段,"包括頭不包括尾。"
// slice也不會改變原數(shù)組 var arr = [1, 2, 3, 4]; var arr1 = arr.slice(0, 3); arr1; // [1, 2, 3]
刪除、插入、替換數(shù)組中的項————splice(start, delMount, ...replace)
splice的返回值總是刪除的項
// splice會改變原數(shù)組 var arr = [1, 2, 3, 4]; // 刪除 arr.splice(1, 1); // [2] arr; // [1, 3, 4] // 插入 arr.splice(1, 0, 2, 5); arr; // [1, 2, 5, 3, 4] // 替換 arr.splice(2, 1, 8); // [5] arr; // [1, 2, 8, 3, 4]
數(shù)組內(nèi)部替換————copyWithin(target, start, end) ES6
此方法返回的是修改后的數(shù)組
// copyWithin會改變原數(shù)組 var arr = [1, 2, 3, 4, 5]; arr.copyWithin(0, 3); // [4, 5, 3, 4, 5]
這里省略了end參數(shù),默認為到數(shù)組結(jié)尾
填充數(shù)組————fill(item, start, end)
var arr = [1, 2, 3, 4, 5]; arr.fill(7); arr; // [7, 7, 7, 7, 7] arr.fill(8, 0, 2); arr; // [8, 8, 7, 7, 7]位置
查找指定元素在數(shù)組中的位置————indexOf(item, start)、lastIndexOf(item, start)
// 若數(shù)組中無該元素則返回-1, 此處比較機制為全等=== var arr = [1, 2, 3, 4, 5, 2]; arr.indexOf(2); // 1 arr.indexOf(2, 2); // 5
查找符合條件的元素在數(shù)組中的位置————findIndex(func(value, index, arr)) ES6
var arr = [1, 2, 3, 4, 5]; arr.findIndex(function(value) { return value > 3; }); // 3迭代
every、filter、forEach、some、map、find(ES6)
迭代方法傳入的都是一個函數(shù):
function(value, index, arr) { if (......) { // 符合條件 return true } }
every: 數(shù)組所有項都符合條件時返回true;
some: 數(shù)組中任意一項符合條件就返回true;
filter: 返回數(shù)組中符合條件的項組成的數(shù)組;
forEach: 對數(shù)組所有項執(zhí)行操作,不返回任何值;
map: 對數(shù)組每一項執(zhí)行操作,返回由函數(shù)返回值構(gòu)成的數(shù)組;
find: 返回數(shù)組中第一個符合條件的項;
reduce(function(prev, curr, index, array), initValue),reduce從數(shù)組第一項開始執(zhí)行參數(shù)中的函數(shù),其返回值作為第二項的prev,第二個參數(shù)可選,指定prev的初始值
var arr = [1, 2, 3, 4]; arr.reduce(function(prev, cur) { return prev + cur; }); // 10
reduceRight()是從數(shù)組末尾開始執(zhí)行的,用法與reduce一致。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85122.html
let和const let和const兩者并不存在變量提升 這里要說明的是變量一定要在聲明后使用,否則報錯。 vara=[]; for(vari=0;i<10;i++){ a[i]=function(){ console.log(i); }; } a[6]();//10 變量i是var聲明的,我們要知道這里在全局范圍內(nèi)都有效。我們要知道在每一次循環(huán)中,新的...
摘要:返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。參考語法返回一個布爾值與的全等操作符比較兼容環(huán)境把對象的值復制到另一個對象里淺拷貝定義方法用于將所有可枚舉的屬性的值從一個或多個源對象復制到目標對象。語法要設(shè)置其原型的對象。 一步一步似爪牙。 前言 學習es6之前我們可能并不知道es6相比es5差距在哪, 但是這并不妨礙我們站在巨人的肩膀上; 程序員就是要樂于嘗鮮; 學習es6最終目的是...
摘要:面試筆記,該部分為下部分。構(gòu)造函數(shù)模式使用自定義的構(gòu)造函數(shù)與普通函數(shù)一樣,只是用它來創(chuàng)建對象,定義對象類型如的屬性和方法。使用原型來添加屬性共享一個原型對象的方法原型是指向原型對象的,這個原型對象與構(gòu)造函數(shù)沒有太大關(guān)系,唯一的關(guān)系 js&jq面試筆記,該部分為下部分。 字符串相關(guān) 1、定義一個方法,用于將string中的每個字符之間加一個空格,并輸出 如:hello -> h e l ...
摘要:在中必須調(diào)用方法,因為子類沒有自己的對象,而是繼承父類的對象,然后對其進行加工而就代表了父類的構(gòu)造函數(shù)。雖然代表了父類的構(gòu)造函數(shù),但是返回的是子類的實例,即內(nèi)部的指的是,因此在這里相當于。要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次函數(shù),否則會報錯。 1.class ES6 提供了更接近傳統(tǒng)語言的寫法,引入了 Class(類)這個概念,作為對象的模板。通過class關(guān)鍵字,可以定義類。基本上,ES...
閱讀 2962·2021-11-11 16:55
閱讀 523·2021-09-27 13:36
閱讀 1095·2021-09-22 15:35
閱讀 2920·2019-08-30 12:46
閱讀 3133·2019-08-26 17:02
閱讀 1833·2019-08-26 11:56
閱讀 1300·2019-08-26 11:47
閱讀 431·2019-08-23 17:01