摘要:刪除數(shù)組的第一個(gè)元素,返回值是刪除的元素對數(shù)組中的元素進(jìn)行排序添加或刪除數(shù)組中的一個(gè)或多個(gè)元素。循環(huán)迭代方法對數(shù)組中的每一個(gè)元素調(diào)用參數(shù)中指定的過濾函數(shù),并將對于過濾函數(shù)返回值為的那些數(shù)組元素集合為新的數(shù)組返回。
一、在類數(shù)組對象上復(fù)用通用的數(shù)組方法
類數(shù)組有:arguments, NodeList, 字符串
什么是類數(shù)組? 兩個(gè)條件
具有 length 屬性
length 屬性大于該對象的最大索引
比如:
var arrayLike = { 0: "a", 1: "b", 2: "c", length: 3}; var result = Array.prototype.map.call(arrayLike, function(s) { return s.toUpperCase(); });//["A", "B", "C"]
幾乎所有的數(shù)組方法都是通用的(forEach,slice,map ...) 除了 concat。
因?yàn)?concat 在連接時(shí),會(huì)檢查其參數(shù)的 [[Class]] 屬性。
一些方法,比如 join,僅僅讀取他們被調(diào)用的對象的長度和數(shù)值屬性。 另外,像 reverse 一樣,要求對象的數(shù)值屬性和長度屬性是可變的;因此,這些方法不能在像 String 這樣的對象上被調(diào)用,String不允許它的長度屬性和synthesized的數(shù)值屬性被設(shè)置。
function namesColumn() { return ["Names"].concat(arguments); } namesColumn("alice", "arale");//["Names", {0: "alice", 1: "arale"}] //解決辦法:應(yīng)先使用 slice 將 arguments 轉(zhuǎn)為數(shù)組 function namesColumn() { return ["Names"].concat([].slice.call(arguments)); }二、數(shù)組優(yōu)先使用 for 循環(huán),而不是 for in 循環(huán)。
for in 更多的是用于 遍歷對象,但是 它也會(huì)去檢查 對象的原型。
如果瀏覽器支持 for of (ES6)的話,最好是使用它,它不會(huì)去遍歷原型。
三、迭代優(yōu)于循環(huán)一個(gè)原因是,迭代可以消除沒必要的 終止條件 和 任何數(shù)組索引
比如:
for (var i = 0; n = players.length; i < n; i++) { players[i].score++; } //使用迭代 players.forEach(function(p){ p.score++; });
例1: 對數(shù)組每一個(gè)元素操作后生成一個(gè)新的數(shù)組
//獲得所有輸入框去除多余空格后的值 var trimmed = input.map(function(s) { return s.trim() })
例2: 獲取價(jià)格在特定區(qū)間的列表
listings.filter(function(listing) { return listing.price >= min && listing.price <= max })
當(dāng)然這都是 ES5 的方法,我們也可以自己寫一個(gè)。
function takeWhile(a, pred) { var result = [] for (var i = 0; n = a.length; i < n; i++) { if (!pred(a[i], i)) { break } result[i] = a[i] } return result } var prefix = takeWhile([1, 2, 4, 8, 16, 32], function(n) { return n < 10 }) // [1, 2, 4, 8]
把它加在 Array 上
Array.prototype.takeWhile = function(pred) { var result = [] for (var i = 0; n = this.length; i < n; i++) { if (!pred(this[i], i)) { break } result[i] = this[i] } return result } [1, 2, 4, 8, 16, 32].takeWhile(function(n) { return n < 10 }) // [1, 2, 4, 8]
循環(huán)僅一點(diǎn)優(yōu)于迭代: 控制流操作 如 break 和 continue
ES5 中 只有 some 和 every 可以提前終止循環(huán), 但設(shè)計(jì)他們的本意不是用來提前終止循環(huán)。
// some 一旦回調(diào)產(chǎn)生了一個(gè)真值,則立即返回,不會(huì)執(zhí)行其余的元素 [1, 10, 100].some(function(x) { return x > 5 }) //true [1, 10, 100].some(function(x) { return x < 0 }) //false // every 相反, 一旦產(chǎn)生假值,則立即返回,不會(huì)執(zhí)行其余元素 [1, 2, 3, 4, 5].every(function(x) { return x > 0 }) //true [1, 2, 3, 4, 5].every(function(x) { return x < 3 }) //false
這種行為可以用來實(shí)現(xiàn) forEach 提前終止循環(huán)的變種時(shí)派上用場
function takeWhile(a, pred) { var result = []; a.every(function(x, i) { if (!pred(x)) { return false //break } result[i] = x; return true; //continue }) return result }四、數(shù)組方法分類
這些方法可以改變數(shù)組自身
pop : 移除數(shù)組的最后一個(gè)元素,返回值是被刪除的元素。
push : 在數(shù)組的末尾添加一個(gè)或者多個(gè)元素,返回值是新的數(shù)組的長度。
reverse : 顛倒數(shù)組中元素的順序,原先第一個(gè)元素現(xiàn)在變成最后一個(gè),同樣原先的最后一個(gè)元素變成了現(xiàn)在的第一個(gè),也就是數(shù)組的索引發(fā)生了變化。
shift : 刪除數(shù)組的第一個(gè)元素,返回值是刪除的元素
sort : 對數(shù)組中的元素進(jìn)行排序
splice : 添加或刪除數(shù)組中的一個(gè)或多個(gè)元素。
unshift : (將廢棄)添加一個(gè)或者多個(gè)元素在數(shù)組的開頭,返回值是新的數(shù)組的長度。
這些方法不改變數(shù)組自身
concat : 返回一個(gè)包含此數(shù)組和其他數(shù)組和/或值的結(jié)合的新數(shù)組
indexOf : 返回第一個(gè)與給定參數(shù)相等的數(shù)組元素的索引,沒有找到則返回-1
join : 將所有的數(shù)組元素連接成一個(gè)字符串
lastIndexOf : 返回在數(shù)組中搜索到的與給定參數(shù)相等的元素的最后(最大)索引
slice : 返回?cái)?shù)組中的一段。
toString : 返回代表該數(shù)組及其元素的字符,重寫Object.toString 過程.
valueOf : 重寫Object.valueOf過程。
filter : 對數(shù)組中的每一個(gè)元素調(diào)用參數(shù)中指定的過濾函數(shù),并將對于過濾函數(shù)返回值為true的那些數(shù)組元素集合為新的數(shù)組返回。
forEach : 對數(shù)組的每一個(gè)元素依次調(diào)用參數(shù)中指定的函數(shù)。
every : 如果數(shù)組中每一個(gè)元素都滿足參數(shù)中提供的測試函數(shù),則返回真
map : 創(chuàng)建一個(gè)新數(shù)組,新數(shù)組中含有,分別對于原來數(shù)組的每一個(gè)元素調(diào)用一個(gè)給定函數(shù)的結(jié)果
some : 如果數(shù)組中至少有一個(gè)元素滿足參數(shù)函數(shù)的測試,則返回true。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85980.html
摘要:所謂的高級(jí),其實(shí)就是講了一些我們平常用不到或許用了不知道,但是非常實(shí)在的東西。比如如果你想檢測里面的屬性值的話,基本上是不可能的。要知道,我們是有情懷的淫。 JS進(jìn)階 說起這個(gè)應(yīng)該算是老生常談了吧。所謂的高級(jí),其實(shí)就是講了一些我們平常用不到(或許用了不知道),但是非常實(shí)在的東西。算是熟練掌握js的一個(gè)必經(jīng)road吧。 檢測函數(shù)類型 其實(shí)檢測函數(shù)的類型應(yīng)該算是js的一個(gè)痛點(diǎn),因?yàn)閖s是一...
摘要:有種內(nèi)置類型,分別是除對象之外,其他統(tǒng)稱為基本類型。另一個(gè)需要注意的是數(shù)組確切地說,數(shù)組也是的一個(gè)子類型我們可以通過下面的方法檢查變量是不是數(shù)組處理未聲明的變量時(shí),會(huì)返回這是因?yàn)橛幸粋€(gè)特殊的安全防范機(jī)制。 js有7種內(nèi)置類型,分別是undefined null boolean string number symbol object除對象之 Object 外,其他統(tǒng)稱為基本類型。符號(hào) ...
摘要:第二章值的數(shù)組不需要預(yù)設(shè)數(shù)組大小,可以直接向數(shù)組添加任何類型的值,如果形成了稀疏數(shù)組,那么未賦值的部分將會(huì)是。某些不是數(shù)組的對象,如果其有屬性,就是類數(shù)組,例如元素列表,,通常用這個(gè)將其轉(zhuǎn)化為數(shù)組,而為我們提供了一種新途徑。 從名字上看可能會(huì)覺得JS應(yīng)該和Java是有很緊密的聯(lián)系的吧,實(shí)際上它們是兩種完全不同的語言,JS是ECMAScript的瀏覽器規(guī)范,是一種弱類型的語言,不同于Ja...
摘要:內(nèi)置對象,在中,它們實(shí)際上只是一些內(nèi)置函數(shù)。這些內(nèi)置函數(shù)可以當(dāng)作構(gòu)造函數(shù),使用調(diào)用,產(chǎn)生新對象。在必要時(shí)語言會(huì)自動(dòng)把字符串字面量轉(zhuǎn)換成一個(gè)對象,也就是說你并不需要顯式創(chuàng)建一個(gè)對象。屬性操作符要求屬性名滿足標(biāo)識(shí)符的命名規(guī)范。 1 如何定義 // 聲明形式,大部分情況下使用聲明形式 let obj ={ a:2, b:3 }; // 構(gòu)造形式 let obj= = new Obje...
摘要:版本截圖當(dāng)然,搜狗瀏覽器市場份額也不低,官方最新版本是,內(nèi)核版本是,為之一驚。上面代碼的和分別是什么含義呢如果是下面的配置有何不可呢首先來明確一個(gè)概念是一系列的集合。比如做移動(dòng)端開發(fā)不需要考慮之類的端產(chǎn)品線只考慮指定的瀏覽器等。 因babel的版本從5升級(jí)到6有很多改動(dòng),比如babel本身不再提供任何transform的工作,都需要借助插件來完成,本文的所有討論都是建立在babel 6...
閱讀 1951·2023-04-26 01:56
閱讀 3122·2021-11-18 10:02
閱讀 3074·2021-09-09 11:35
閱讀 1305·2021-09-03 10:28
閱讀 3429·2019-08-29 18:36
閱讀 2859·2019-08-29 17:14
閱讀 841·2019-08-29 16:10
閱讀 1624·2019-08-26 13:45