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