摘要:目的相信在網(wǎng)上都有很多的的介紹,這里就應(yīng)用場(chǎng)景舉例說明前提了解和一句話概括用別人的方法,完成自己的功能。總結(jié)介紹了和的用法正文部分根據(jù)需求列舉的應(yīng)用場(chǎng)景注意事項(xiàng)優(yōu)化方案
目的
前提相信在網(wǎng)上都有很多的Array的api介紹 , 這里就應(yīng)用場(chǎng)景舉例說明
了解apply和call
一句話概括:用別人的方法,完成自己的功能。
function Student(name,gender,age){ this.name = name; this.gender = gender; this.age = age; this.introduce = function () { console.log("name : " + this.name + ", gender : " + this.gender + ", age : " +this.age); } } function Empolyee(name,gender,age,work){ Student.apply(this,arguments); //apply方法 //Student.call(this,name,gender,age); //call方法 this.work = work; } var e = new Empolyee("lee","male","26","programmer"); console.log(e) e.introduce();
用Student構(gòu)造函數(shù)的屬性和方法,來為自己所用!
你可能發(fā)現(xiàn)apply和call很相似,apply接受一個(gè)數(shù)組,call接受多個(gè)值。
應(yīng)用:得到一組數(shù)的最大值
var array = [1,5,2,3]; console.log(Math.max.apply(this,array)); // 全局寫法 function getMax(){ return Math.max.apply(this,Array.prototype.slice.apply(arguments)); } // 不指定函數(shù)參數(shù)寫法 console.log(getMax(1,2,3,45,3)); function getMax(array){ return Math.max.apply(this,array); } // 指定參數(shù)寫法 console.log(getMax(array));正文 扁平化規(guī)則數(shù)組
有這樣的數(shù)組,需要將其扁平化
var array = [[1,2],[3,4],[5,6]]; var result = array.reduce(function (p, c) { return p.concat(c); }); console.log(result); // [ 1, 2, 3, 4, 5, 6 ] 注解:reduce的callback中,p指代上一個(gè)元素,c指代當(dāng)前元素。 第一次迭代:p -- > [1,2] c -- > [3,4] 第二次迭代:p -- > [1,2,3,4] c -- > [5,6]扁平化隨機(jī)數(shù)組
既然有規(guī)則數(shù)組,那么就肯定有不規(guī)則數(shù)組,這就需要遞歸操作
var array = [1,[2,[3,4],[1,9,8],[" ",3]],1]; // 隨機(jī)嵌套數(shù)組 function flatten(array){ var result = []; array.map(function(ele){ if(!Array.isArray(ele)){ //判斷是否為數(shù)組 result.push(ele); }else{ result = result.concat(flatten(ele)); // 由于result是函數(shù)內(nèi)部定義的,及每次遞歸result都會(huì)重置; // 如果不將result保存,則到遞歸完成后,之前的數(shù)據(jù)將會(huì)被覆蓋 } }); return result; } console.log(flatten(array)); // [ 1, 2, 3, 4, 1, 9, 8, " ", 3, 1 ] 注解:map會(huì)迭代數(shù)組里每一個(gè)元素,并應(yīng)用callback函數(shù)對(duì)其操作,在這里就是判斷是否繼續(xù)遞歸。檢查數(shù)組是否通過給定函數(shù)檢查
有一個(gè)成績(jī)數(shù)組,需要檢查通過和未通過的情況
var score = [56,90,40,80,76,88,94,27,83,66]; // 成績(jī) function isPassExam(ele,index,array){ return ele >= 60; } // 通過規(guī)則 var isAllPass = score.every(isPassExam); console.log("is all pass the exam : " + isAllPass); // is all pass the exam : false var isSomeonePass = score.some(isPassExam); console.log("is someone pass the exam : " + isSomeonePass); // is someone pass the exam : true var passedScore = score.filter(isPassExam); console.log("score : " + passedScore); // score : 90,80,76,88,94,83,66 注解: - every會(huì)遍歷所有元素,直到有不能通過函數(shù)檢查的元素為止,返回 false - some會(huì)遍歷所有元素,直到有能通過函數(shù)檢查的元素為止,返回true - filter會(huì)遍歷所有元素,并將能通過函數(shù)檢查的元素返回過濾函數(shù)參數(shù)
有時(shí)我們可能需要過濾我們接受的函數(shù)參數(shù),如:只需要number類型
function filter(){ var array = []; Array.prototype.slice.apply(arguments).map(function (ele) { if(typeof ele == "number"){ array.push(ele); } }); return array; // do something // .... } var result = filter(1,"123",4,"qianjiahao",2,false,[]); console.log(result); // [ 1, 4, 2 ] 注解:由于函數(shù)參數(shù)arguments并不是真正意義上的"數(shù)組",只是"類數(shù)組" 通過 console.log(arguments); 我們可以看到 { "0": 1, "1": "123", "2": 4, "3": "qianjiahao", "4": 2, "5": false, "6": [] } arguments是個(gè)"類數(shù)組",在使用"map"方法之前我們需要將其"slice"后轉(zhuǎn)化為"數(shù)組",但是因?yàn)?類數(shù)組"沒有"slice"方法,所以我們使用了"apply",讓Array幫我們完成這個(gè)工作。亂序字符串/數(shù)組
var str = "6ab3c5de1f4g7"; var array = str.split(""); var result = str.split("").sort(function () { return Math.random() > 0.5; }).join(""); console.log(result); // d7gfc51a34be7 result = array.sort(function () { return Math.random() > 0.5; }); console.log(result); // [ "d", "6", "b", "4", "e", "a", "c", "1", "f", "5", "7", "3", "g" ] 注解:通過在sort中隨機(jī)返回一個(gè)數(shù)并與0.5比較,會(huì)得到隨機(jī)的true或false,然后會(huì)隨機(jī)數(shù)組中的前后兩個(gè)元素。從數(shù)組a中去除數(shù)組b的元素
var a = [1,5,2,6,4,7,9,0]; var b = [1,0,6,4,10]; var result = a.filter(function(ele){ return b.indexOf(ele) < 0; }); console.log(result); 注解:通過下標(biāo),判斷a中元素是否在b中,然后用filter過濾
持續(xù)收集ing
注意 for..in..效率
for..in..迭代效率較低,建議使用for循環(huán)迭代或Array的原生迭代方法。
缺陷 :for..in..會(huì)帶上原型屬性或方法 :
var array = [1,2,3,4]; Array.prototype.newVariable = 100; Array.prototype.newFunction = function () {}; var result = []; for(var i in array){ result.push(array[i]); } console.log(result); // [ 1, 2, 3, 4, 100, [Function] ]
這會(huì)很麻煩,如果需要使用for..in..,需要使用hasOwnProperty()過濾
for(var i in array){ if(array.hasOwnProperty(i)){ result.push(array[i]); } } // [ 1, 2, 3, 4 ]
但是,有個(gè)很蛋疼的事,就是hasOwnProperty()沒有保護(hù)機(jī)制,可以被重寫
var array = [1,2,3,4]; Array.prototype.newVariable = 100; Array.prototype.newFunction = function () {}; Array.prototype.hasOwnProperty = function (i) { return i; }; // 重寫 hasOwnProperty() 方法 var result = []; for(var i in array){ if(array.hasOwnProperty(i)){ result.push(array[i]); } } console.log(result); // [ 1, 2, 3, 4, 100, [Function], [Function] ] // 又悲劇了。。。
持續(xù)收集ing
優(yōu)化數(shù)組迭代是可以優(yōu)化的,比如
var array = [1,2,3,4,5,3,7,8]; for(var i = 0;i這樣的循環(huán),每次都要去獲取array.length,我們可以將array.length存起來
for(var i = 0,len = array.length;i這樣整個(gè)循環(huán)只需要求一次length。雖然數(shù)據(jù)量小的時(shí)候效果不明顯,但是當(dāng)數(shù)據(jù)量很大時(shí),提升效果就很顯著了。
總結(jié)- 介紹了apply和call的用法 - 正文部分根據(jù)需求列舉Array的應(yīng)用場(chǎng)景 - 注意事項(xiàng) - 優(yōu)化方案
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85637.html
摘要:如上圖,一看就懂,就是一片公眾號(hào)文章,點(diǎn)進(jìn)去顯示標(biāo)題,作者,時(shí)間,公眾號(hào)名稱和部分內(nèi)容,要想閱讀所有內(nèi)容,那就支付元就可以閱讀所有的內(nèi)容,這就是付費(fèi)閱讀當(dāng)然金額可以自定義其實(shí)這個(gè)開發(fā)原理很簡(jiǎn)單,無非就是在文章頁(yè)面加一個(gè)微信支付的按鈕,點(diǎn)擊支 showImg(https://segmentfault.com/img/bV2ZIZ?w=1502&h=1334); 如上圖,一看就懂,就是一片...
摘要:如上圖,一看就懂,就是一片公眾號(hào)文章,點(diǎn)進(jìn)去顯示標(biāo)題,作者,時(shí)間,公眾號(hào)名稱和部分內(nèi)容,要想閱讀所有內(nèi)容,那就支付元就可以閱讀所有的內(nèi)容,這就是付費(fèi)閱讀當(dāng)然金額可以自定義其實(shí)這個(gè)開發(fā)原理很簡(jiǎn)單,無非就是在文章頁(yè)面加一個(gè)微信支付的按鈕,點(diǎn)擊支 showImg(https://segmentfault.com/img/bV2ZIZ?w=1502&h=1334); 如上圖,一看就懂,就是一片...
摘要:最寒冷,面試跳槽不能等馬上就月份了,所謂的金三銀四招聘季。在中有兩種模式,分別是線程池和信號(hào)量,說到這里大家明白了吧,信號(hào)量的作用。感興趣的同學(xué)可以去了解下,講了線程,線程池,鎖,,等內(nèi)容。 2019最寒冷,面試跳槽不能等 馬上就3月份了,所謂的金三銀四招聘季。2019年也許是互聯(lián)網(wǎng)最冷清的一年,很多知名的大型互聯(lián)網(wǎng)公司都裁員過冬。當(dāng)然也有一些公司還在持續(xù)招人的,比如阿里就宣稱不裁員,...
摘要:在腳本中,默認(rèn)指向一個(gè)空對(duì)象,并不是指向,也不是指向。舉個(gè)栗子,在函數(shù)執(zhí)行后,覆蓋原先的值我們?cè)谕獠慷x了一個(gè)名為的全局變量,它會(huì)被默認(rèn)添加到全局的屬性上。總結(jié)在不同的執(zhí)行環(huán)境中的默認(rèn)指代通過省略聲明變量導(dǎo)致變量提升現(xiàn)象的發(fā)生及預(yù)防 侃侃JavaScript中的this this為何如此多變? this總是跟它的執(zhí)行上下文有關(guān),而在JavaScript總會(huì)有開辟新的執(zhí)行上...
摘要:系統(tǒng),扎實(shí)的語言基礎(chǔ)是一個(gè)優(yōu)秀的前端工程師必須具備的。第一個(gè)參數(shù)為調(diào)用函數(shù)時(shí)的指向,隨后的參數(shù)則作為函數(shù)的參數(shù)并調(diào)用,也就是。和的區(qū)別只有一個(gè),就是它只有兩個(gè)參數(shù),而且第二個(gè)參數(shù)為調(diào)用函數(shù)時(shí)的參數(shù)構(gòu)成的數(shù)組。 系統(tǒng),扎實(shí)的 javascript 語言基礎(chǔ)是一個(gè)優(yōu)秀的前端工程師必須具備的。在看了一些關(guān)于 call,apply,bind 的文章后,我還是打算寫下這篇總結(jié),原因其實(shí)有好幾個(gè)。...
閱讀 2009·2021-11-24 09:39
閱讀 1878·2019-08-30 15:55
閱讀 2168·2019-08-30 15:53
閱讀 565·2019-08-29 13:16
閱讀 984·2019-08-26 12:20
閱讀 2379·2019-08-26 11:58
閱讀 3129·2019-08-26 10:19
閱讀 3296·2019-08-23 18:31