JavaScript - 引用類型 Object 和 Array

引用類型與傳統面向對象程序設計中的類相似,但實現不同。

對象在 JavaScript 中被稱為引用類型的值,而且有一些內置的引用類型可以用來創建特定的對象。

Object

Object 是一個基礎類型,其他所有類型都從 Object 繼承了基礎行為。

var person = new Person();
person.name = "Bert";
person.age = 29;

var person = {
  name: "Bert",
  age: 29
}

兩種創建對象的方式是等價的。

var person = {
  name: "Bert",
  age: 29,
  5: true
}

這段代碼創建的對象:person 中含有三個屬性:name、age和5.這里的5會被自動轉換為字符串。

// 下面兩種訪問對象屬性的方法沒有任何區別
alert(person["name"]);  // Bert
alert(person.name); // Bert

// 使用括號語法的有點是可以通過變量來訪問屬性
var propertyName = "name";
alert(person[propertyName]);  // Bert

// 屬性名中包含特殊字符時無法使用 '.' 訪問,這時候可以使用 '[]' 來訪問或賦值
person["first name"] = "Bert"

Array

Array 類型是一組值的有序列表,同時還提供了操作和轉換這些值的功能。

// 創建一個數組,長度為0
var colors = new Array();
var colors = [];

// 創建一個數組,長度為2
var colors = new Array(2);
var colors = [, ,]; // 這種方式會有兼容問題

// 創建一個數組,內容為 ["red", "blue", "green"]
var colors = new Array("red", "blue", "green");
var colors = ["red", "blue", "green"];

length 使用小技巧

length 表示數組的長度,會始終返回0或更大的值。

數據的 length 屬性不是只讀的。因此,通過設置這個屬性,可以從數組的末尾移除或想數組末尾添加新項:

var colors = ["red", "blue", "green"];
colors.length = 2;
alert(colors[2]); // undefined

colors 數組一開始有三個值,將 length 的長度設為2會移除最后一項,再訪問 colors[2] 時,原本的 'green' 被移除了,輸出 undefined。

var colors = ["red", "blue", "green"];
colors.length = 4;
alert(colors[4]); // undefined

同理將數組的長度設置為4,超出的位置的值默認會設置為 undefined。

var colors = ["red", "blue", "green"];
colors[colors.length] = "black";
colors[colors.length] = "brown";
alert(colors); // ["red", "blue", "green", "black", "brown"]

數組的最后一項的下標為 length-1 ,因此對 length 下標賦值數組會在最后一個位置新增對應值。

Array 的常用方法

  • toLocaleString(): 默認情況下會以逗號分隔的字符串的形式返回數組項,需要特別處理數組表現形式時使用。

  • toString(): 默認情況下會以逗號分隔的字符串的形式返回數組項,使用輸出語句時會默認調用 toString 方法。

  • valueOf(): 默認情況下會以逗號分隔的字符串的形式返回數組項,使用判斷語句時會默認調用 valueOf 方法。

  • join(Str):不傳參數或傳入 undefined 會默認使用逗號作為分隔符輸出,傳入參數則以參數作為分隔符輸出。

    var colors = ["red", "black"];
    alert(colors.join()); // red,black
    alert(colors.join("-")); // red-black
    
  • push():接受任意數量的參數,把他們逐個添加到數組末尾,并返回修改后的數組的長度。

    var colors = new Array();
    var count = colors.push("red", "black");
    alert(count); // 2
    
  • pop():從數組末尾移除最后一項,并返回移除的項。

    var colors = ["red", "black", "blue"];
    var item = colors.pop();
    alert(item); // "blue"
    alert(colors.length); // 2
    
  • shift():移除數組中的第一項并返回該項。

    var colors = ["red", "black", "blue"];
    var item = colors.shift();
    alert(item); // "red"
    alert(colors.length); // 2
    
  • unshift():在數組前端添加任意個項并返回新數組的長度。

    var colors = new Array("red", "black");
    var count = colors.unshift("blue", "green");
    alert(count); // 4
    
  • reverse():反轉數組項的順序。

    var values = [1, 2, 3, 4, 5];
    values.reverse();
    alert(values); // 5,4,3,2,1
    
  • sort():默認按字符串升序排列,該方法可以接收一個比較函數作為參數,以便我們指定哪個值位于哪個值的前面。

    • 比較函數接收兩個參數。

      • 如果第一個參數應該位于第二個之前則返回一個負數。
      • 如果兩個參數相等則返回0。
      • 如果第一個參數應該位于第二個之后則返回一個正數。
    var values = [0, 1, 5, 10, 15];
    values.sort()
    alert(values); // 0,1,10,15,5
    

    sort 方法默認是已字符串進行比較

    function compare(value1, value2) {
      if (value1 < value2) {
        return -1;
      } else if (value1 > value2) {
        return 1;
      } else {
        return 0;
      }
    }
    
    var values = [0, 1, 5, 10, 15];
    values.sort(compare);
    alert(values); // 0,1,5,10,15
    
  • concat():可以基于當前數組中的所有項創建一個新數組,這個方法會先創建一個副本,然后將接受到的參數添加到這個副本的末尾,最后返回新構建的數組。

    • 參數是一個或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。
    • 如果傳遞的值不是數組,這些值就會被簡單的添加到結果數組的末尾。
    var colors = ["red", "blue", "green"];
    var colors2 = colors.concat("yellow", ["black"], "brown")
    alert(colors); // red,blue,green
    alert(colors2); // red,blue,green,yellow,black,brown
    
  • slice():基于當前數組中的一或多個項創建一個新數組(不會影響到原數組)。

    • 該方法可以接受一個或兩個參數,即要返回項的起始和結束為止。

      • 在只有一個參數的情況下,slice()方法返回從該參數指定為止開始到當前數組末尾的所有項。
      • 如果有兩個參數,該方法返回起始和結束位置之間的項 ---- 但不包括結束位置的項。
    var color = ["red", "green", "blue", "yellow", "purple"];
    var color2 = colors.slice(1);
    var color3 = colors.slice(1, 4);
    alert(colors2); // green,blue,yellow,purple
    alert(colors3); // green,blue,yellow
    

    如果 slice() 方法的參數中有一個負數,則用數組長度加上該數來確定相應的位置。例如,在一個包含5項的數組上調用 slice(-2, -1) 與調用 slice(3, 4) 的到的結果相同。如果結束位置小于起始位置,則返回空數組。

  • splice():數組中最牛逼的方法,他的主要用途是向數組的中部插入項。

    • 刪除:可以刪除任意數量的項,只需要指定兩個參數:需要刪除的第一項的位置和要刪除的項數。例如:splice(0, 2)會刪除數組中的前兩個項。

    • 插入:可以向制定位置插入任意數量的項,只需要提供3個參數:起始位置、0(要刪除的項數)和要插入的項。如果要插入多個項,可以再傳入第四、第五,以至任意多個項。

      • 例如:splice(2, 0, "red", "green") 會從當前數組的位置2開始插入字符串 "red" 和 "green"。
    • 替換:可以向指定位置插入任意數量的項,且同時刪除任意數量的項,只需要指定3個參數:其實位置、要刪除的項數和要插入的任意數量的項。插入的項數不必與刪除的項數相等。

      • 例如:splice(2, 1, "red", "green")會刪除單簽數組位置2的項,然后再從位置2開始插入字符串"red", "green"。
    • splice() 方法始終會返回一個數組,該數組中包含從原始數組中刪除的項(如果沒有刪除任何項,則返回一個空數組)。

    var color = ["red", "green", "blue"];
    
    // 刪除第一項
    var removed = colors.splice(0, 1);
    alert(colors); // green, blue
    alert(removed); // red, 返回的數組中只包含一項
    
    removed = colors.splice(1, 0, "yellow", "orange"); // 從位置1開始插入兩項
    alert(colors); // green, yellow, orange, blue
    alert(removed); // []
    
    removed = colors.splice((1, 1, "red", "purple"))
    alert(colors); // green, red, purple, orange, blue
    alert(removed); // yellow
    
  • indexOf():從頭開始向末尾查找,接受兩個參數:要查找的項和(可選的)表示查找啟動位置的索引。

    • 沒有找到返回 -1。
    • 找到返回數組的下標。
    • 查找的項必須嚴格相等(===)。
  • lastIndexOf():從末尾開始向前查找,接受兩個參數:要查找的項和(可選的)表示查找啟動位置的索引。

    • 沒有找到返回 -1。
    • 找到返回數組的下標。
    • 查找的項必須嚴格相等(===)。
var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];

// 傳入一個參數,表示查找的項
alert(numbers.indexOf(4)) // 3
alert(numbers.lastIndexOf(4)) // 5

// 傳入兩個參數
alert(numbers.indexOf(4, 4)) // 5
alert(numbers.lastIndexOf(4, 4)) // 3

// 查詢對象
var person = {name: "Bert"};
var people = [{name: "Bert"}];
var morePeople = [person];
alert(people.indexOf(person)) // -1
alert(morePeople.indexOf(person)) // 0
  • every():遍歷數組,如果傳入的函數每一項都返回 true 該方法會返回true,如果有一項返回false,則該方法返回 false(數組每項的 && 的關系)。

  • some():遍歷數組,如果傳入的函數每一項都返回 false 該方法會返回 false,如果有一項返回 true,則該方法返回 true (數組每項的 || 的關系)。

    var numbers = [1,2,3,4,5,4,3,2,1];
    var everyResult = numbers.every(function(item. index, array) {
      return (item > 2);
    })
    alert(everyResult) // false
    
    var someResult = numbers.some(function(item, index, array) {
      return (item > 2);
    })
    alert(someResult); // true
    
  • filter():遍歷數組,將傳入的函數的返回 true 的項值重新生成新數組,過濾返回 false 的項(數組的過濾器,用于搜索)。

    var numbers = [1,2,3,4,5,4,3,2,1];
    var filterResult = numbers.filter(function(item, index, array) {
      return (item > 2);
    })
    alert(filterResult); // [3,4,5,4,3]
    
  • forEach():針對數組的每一項運算傳入的函數,沒有返回值。

  • map():遍歷數組,將傳入的函數的返回值作為新的數組的值。

    var numbers = [1,2,3,4,5,4,3,2,1];
    var mapResult = numbers.map(function(item, index, array) {
      return item * 2;
    })
    
    alert(mapResult); // [2,4,6,8,10,8,6,4,2]
    
  • reducer():方法可以執行求數組中所有值之和的操作,會將前一次返回的結果作為下一次運算的第一個參數(數組的遞歸運算)。

    var values = [1,2,3,4,5];
    var sum = values.reduce(function(prev, cur, index, array) {
      return prev + cur;
    })
    alert(sum); //15
    
  • reducerRight():與 reducer 作用類似,只不過方向相反(數組的反向遞歸)。

    var values = [1,2,3,4,5];
    var sum = values.reduceRight(function(prev, cur, index, array) {
      return prev + cur;
    })
    alert(sum); //15
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內容

  • Chapter 5 引用類型 Object類型 創建Object實例new Object()var person ...
    云之外閱讀 393評論 0 0
  • 第一章: JS簡介 從當初簡單的語言,變成了現在能夠處理復雜計算和交互,擁有閉包、匿名函數, 甚至元編程等...
    LaBaby_閱讀 1,685評論 0 6
  • 第三章 基本概念 3.1 語法 ECMAScript標識符一般采用駝峰大小寫格式,也就是第一個字母小寫,剩下的每個...
    小雄子閱讀 567評論 0 1
  • 窺探于《JavaScript高級程序設計.第3版》第5章“引用類型”。 夾雜了自我的愚解,然后經過自我的蹂躪,...
    哲己名了戴草帽閱讀 220評論 0 1
  • 離別的車站 如果愛,如果想見,就一定可以與友人再次重逢,就好像捉迷藏一樣,不管藏在哪里,就算知道他不在眼前,也知道...
    咚_閱讀 559評論 0 0