如何判斷數(shù)組類型
- typeof ?
對Array不起作用,會將結(jié)果判斷為object,同理null - instanceof操作符:檢測對象的原型鏈是否指向構(gòu)造函數(shù)的prototype對象的,【不完美】
- 對象的constructor屬性 :
alert(arr.constructor === Array); // true
方法2、3不完美,在iframe中不共享原型鏈,會失敗
var iframe = document.createElement('iframe'); //創(chuàng)建iframe
document.body.appendChild(iframe); //添加到body中
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // 聲明數(shù)組[1,2,3]
alert(arr instanceof Array); // false
alert(arr.constructor === Array); // false
- Object.prototype.toString??
Object.prototype.toString.call(o) === '[object Array]'; - Array.isArray() ??
ES5加入,為了檢測對象是否是數(shù)組
Array.isArray(arr);
數(shù)組復制方法
- var arr2 = Object.assign([], arr); 或 var arr2 = []; Object.assgin(arr2, arr);
- var arr2 = arr.map(item => item);
- 擴展運算符:var arr2 = [...arr];
- 從原數(shù)組中截取,組成新數(shù)組:var arr4 = arr.slice(0);
- concat[] 接上一個空數(shù)組,返回新數(shù)組: var arr4 = arr.concat([]);
- for 循環(huán)遍歷一個個賦值
數(shù)組去重
- indexOf方法:新建一個數(shù)組,遍歷去要重的數(shù)組,當值不在新數(shù)組的時候(indexOf為-1)就加入該新數(shù)組中;
- 排序后去除相鄰:給傳入的數(shù)組排序,排序后相同的值會相鄰,然后遍歷排序后數(shù)組時,新數(shù)組只加入不與前一值重復的值。
- ES6 set數(shù)據(jù)結(jié)構(gòu):它類似于數(shù)組,但是成員的值都是唯一的,沒有重復的值。Set函數(shù)可以接受一個數(shù)組(或類似數(shù)組的對象)作為參數(shù),用來初始化。
function unique5(arr){
var x = new Set(arr);
return [...x];
}
深拷貝 淺拷貝
基本數(shù)據(jù)類型:undefined、null、boolean、number、string,直接存在棧(stack)中,單獨存在,互相之間沒有聯(lián)系。
引用類型:復雜數(shù)據(jù)類型Object,存儲的是該對象在棧中引用,真實的數(shù)據(jù)存在堆內(nèi)存中。引用類型的賦值只是給了堆內(nèi)存對象中的引用指針,當一個改變后,另一個也會改變
淺拷貝:淺拷貝只復制對象的第一層屬性,第二層甚至更多層只拷貝其引用
深拷貝:把一個對象中所有屬性和方法一個個找到,并且在另一個對象中開辟相應空間,一個個存儲到另一個對象中
- 不完美深拷貝1:Object.assign(target, source):用于將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。 當我們不涉及到第二層或者更深層的包含復雜數(shù)據(jù)類型,可見Object.assign()方法是基本可行的,但是如果對象中包含另一層Object或者Array這樣的引用類型,他們還是保存的指針,而不是真的復制出一個新的Object或者Array
- 不完美深拷貝2:JSON.stringify()和JSON.parse()他無法實現(xiàn)對函數(shù) 、RegExp等特殊對象的克隆 2. 會拋棄對象的constructor,所有的構(gòu)造函數(shù)會指向Object 3. 對象有循環(huán)引用,會報錯
- 手動實現(xiàn)(不成熟):
function extend(source,targrt){
for(var key in source){
var item = source[key]
if(item instanceof Array){
targrt[key] = []
extend(item,targrt[key])
}else if(item instanceof Object){
b[key] = {}
extend(item,b[key])
}else{
b[key] = item
}
}
}
- 最佳深拷貝:Lodash的_.cloneDeep,Lodash是一個一致性、模塊化、高性能的JavaScript實用工具庫 ,判斷的項目測20來項,不僅有數(shù)據(jù)類型的判斷,還有浮點數(shù)的判斷,多少位的浮點數(shù)的判斷,反正就是很多判斷,以及邊界考慮。
var deep = _.cloneDeep(objects);
數(shù)組sort方法使用、排序方式、V8為什么這樣排序(22以下歸并,以上快排)
根據(jù)MDN上對Array.sort()的解釋,默認的排序方法會將數(shù)組元素轉(zhuǎn)換為字符串,然后比較字符串中字符的UTF-16編碼順序來進行排序。
V8 引擎 sort 函數(shù)只給出了兩種排序 歸并 和 快排,數(shù)量小于10的數(shù)組使用 InsertionSort,比10大的數(shù)組則使用 QuickSort。v8引擎Array源碼連接
10以下舉例:
var arr=[1,3,10,4,2,5];
function compare(value1,value2) {
console.log(value1,value2,arr);
if(value1<value2){return -1;}
else if(value1>value2){return 1;}
else {return 0}
}
arr.sort(compare);
alert(arr); //1,2,3,4,5,10</pre>
結(jié)果:image
首先兩兩比較,若返回-1,位置不變繼續(xù)下一組比較;返回+1則調(diào)換位置,此時不是接著下一組比較,而是與前一組比較,判斷為-1或+1,如此循環(huán),直到排序完成。