數(shù)組、深淺拷貝

如何判斷數(shù)組類型

  1. typeof ?
    對Array不起作用,會將結(jié)果判斷為object,同理null
  2. instanceof操作符:檢測對象的原型鏈是否指向構(gòu)造函數(shù)的prototype對象的,【不完美】
  3. 對象的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 
  1. Object.prototype.toString??
    Object.prototype.toString.call(o) === '[object Array]';
  2. 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),直到排序完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 4,112評論 0 6
  • 第五章******************************************************...
    fastwe閱讀 812評論 0 0
  • 什么是ES6? ECMAScript 6.0 是繼ECMAScript 5.1 之后 JavaScript 語...
    多多醬_DuoDuo_閱讀 1,242評論 0 4
  • # 數(shù)組部分 # 1.## array_chunk($arr, $size [, $preserve_key = ...
    clothTiger閱讀 1,326評論 0 1
  • ““人無信而不立,寡信而難成”,“一言為重百金輕”……《誠信故事》這套叢書讓我如引甘霖,獲益匪淺,他以榜樣的無窮力...
    妞妞靚媽閱讀 216評論 0 1

友情鏈接更多精彩內(nèi)容