成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS淬煉: Array進(jìn)階

jimhs / 429人閱讀

摘要:的這種實(shí)現(xiàn)方式導(dǎo)致了一些尷尬問題,比如刪除元素元素遍歷。后面的參數(shù)被忽略掉了,表示并沒有要插入的元素。其實(shí),的本質(zhì)是跟蹤中的,并始終保持值是。這時(shí)候,雖然不大可能,可能會(huì)在中間某個(gè)中被用戶重新定義。但是在上進(jìn)行這種操作是很糟糕的。

在Javascript中,array是一個(gè)類數(shù)組的object。顧名思義,它能夠在一個(gè)變量上存儲多個(gè)值。

數(shù)組是值的有序集合。每個(gè)值叫做一個(gè)元素,而每個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示,稱為索引。JavaScript數(shù)組是無類型:數(shù)組元素可以是任意類型,并且同一個(gè)數(shù)組中的不同元素也可能有不同的類型。 --《JavaScript權(quán)威指南(第六版)》

array在一般Javascript object基礎(chǔ)上,有自己額外的屬性。它采用numbered index作為的key,有一個(gè)length property跟蹤數(shù)組長度,還有如push/pop、shift/unshift等數(shù)組特有操作。

本質(zhì)是object

作為一個(gè)object,我們可以在array上面進(jìn)行所有object的合法操作,比如設(shè)置一個(gè)named key。

var test = [];
test.fruit = "APPLE";
console.log(test.fruit); // APPLE

上面僅僅把a(bǔ)rray作為一個(gè)普通的Javascript object使用,等價(jià)于var test = {}。在這種場合,我們應(yīng)該選擇普通的Javascirpt object,而非array。

Numbered index

Javascript中的 array object 采用了一個(gè)很樸素的思想來實(shí)現(xiàn)數(shù)組 —— 用數(shù)字來充當(dāng)object的keys。這樣在表面上延續(xù)了我們在C++/Java上使用數(shù)組的編程體驗(yàn)。

{ 
    0 : item0, 
    1 : item1, 
    2 : item2
}

array的這種實(shí)現(xiàn)方式導(dǎo)致了一些尷尬問題,比如刪除元素、元素遍歷。我們會(huì)在后面談到這些問題。

刪除元素 delete operator(不推薦)

和一般Javascript object一樣,我們可以使用delete來刪除object中的property。

var arr = ["a", "b", "c", "d"];
delete arr[1];
console.log(arr);
console.log(arr[1]);
// [ "a", , "c", "d" ]
// undefined

當(dāng)我們使用delete來刪除某一個(gè)元素arr[1]時(shí),arr中key 1 和value b之間的連接被切斷,key 1對應(yīng)的值被重置為undefined。注意,這時(shí)候,array中其他元素并沒有改變自身的index來填補(bǔ)這key 1這個(gè)空洞,而是保持原值。這樣,key 1就變成了arr中的一個(gè)洞了!

除非有特殊需求,比如需要用到sparse array,一般情況下并不推薦使用delete operator來刪除array中的元素。

splice() (推薦)
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(0, 1); // Removes the first element of fruits

第一個(gè)參數(shù) (0) 定義新元素要從哪個(gè)位置插入。第二個(gè)參數(shù) (1) 定義新元素插入位置開始有多少元素要被刪除。后面的參數(shù)被忽略掉了,表示并沒有要插入的元素。

filter()(推薦)
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var toDelete = "Apple";
fruits = fruits.filter(function(value) { 
    return value != toDelete;
});
// [ "Banana", "Orange", "Mango" ]
理解length

length是array object的一個(gè)property, 根據(jù)名字來看,似乎是記錄array的長度。其實(shí),length的本質(zhì)是跟蹤array中的max_index,并始終保持值是max_index + 1。

這和記錄長度有什么區(qū)別呢?

還記得使用delete來刪除元素的情形吧?中間元素被刪了,但是其他元素沒有改變自身的index來填補(bǔ)空間。這時(shí)候即使delete了多個(gè)元素,數(shù)組的length可能并沒有發(fā)生變化。

var array_object = [1, 2, 3];
console.log(array_object.length); // 3
delete array_object[1];
console.log(array_object.length); // 3!
Array 遍歷

如果array中沒有“洞”, for loop和forEach兩種遍歷方式區(qū)別不大。在array有洞的情況下,兩者略有不同,其中forEach會(huì)跳過這些洞,而傳統(tǒng)的for loop并不會(huì)。

var array_object = [1, 2, 3];
delete array_object[1];

// 不跳過洞
for(var i=0; i

遍歷array的方法還有其他,更多方法可以參考這篇StackOverflow問答。

[] vs. new Array( )

當(dāng)新建一個(gè)array時(shí)候,我們有下面兩種方式: array literal [] 或 array constructor new Array(arg)

var arrayA = [];
var arrayB = new Array();

當(dāng)使用[]時(shí)候, JS engine會(huì)直接調(diào)用global Array的constructor新建一個(gè)array變量并返回。當(dāng)使用new Array()時(shí)候, JS engine會(huì)沿著Execution Context往上追溯到名為Array的constructor function,并據(jù)此生成一個(gè)object。這時(shí)候,雖然不大可能,Array可能會(huì)在中間某個(gè)Execution Context中被用戶重新定義。下面是coderjoe在StackOverflow中提出的例子。在例子中,我們最后得到的并不是我們期待的原生Array。

function Array() { 
    this.is = "SPARTA";
}
var a = new Array();
var b = [];
alert(a.is); 
// => "SPARTA"
alert(b.is); 
// => undefineda.push("Woa"); 
// => TypeError: a.push is not a functionb.push("Woa"); 
// => 1 (OK)

大部分Javascirpt社區(qū)推薦使用[]來新建array。

You never need to use new Object() in JavaScript. Use the object literal {} instead. Similarly, don’t use new Array(), use the array literal [] instead. Arrays in JavaScript work nothing like the arrays in Java, and use of the Java-like syntax will confuse you. LINK

Array 復(fù)制 淺度復(fù)制
var arr1 = ["a", "b", "c"];
var arr2 = arr1; 
arr2[0] = 1; // 對數(shù)組arr2的元素進(jìn)行修改
console.log(arr1); // [1, "b", "c"]
深度復(fù)制
var arr1 = ["a", "b", "c", "d", "e"];
var arr2 = arr1.concat(); // 使用concat()方法,返回新的數(shù)組
arr2[0] = 1; 
console.log(arr1); // => ["a", "b", "c", "d", "e"]:數(shù)組arr1的元素沒變更
console.log(arr2); // => [ 1, "b", "c", "d", "e"]:數(shù)組arr2的元素發(fā)生了變更
Associate Array

在計(jì)算機(jī)科學(xué)中,采用named index而非numbered index的數(shù)組被稱為Associative Array。

var associative_array = new Array();
associative_array["one"] = "Lorem";
associative_array["two"] = "Ipsum";
associative_array["three"] = "dolor";

for (i in associative_array) { 
    console.log(i);
};
// one two three 

上面操作可以應(yīng)用在任何Javascript object上,array object也不例外。但是在Javascript array上進(jìn)行這種操作是很糟糕的。當(dāng)需要使用named string作為key時(shí)候,我們應(yīng)該使用一般的object,而非array。

Javascript里面并不支持named index的array。

If you use a named index, JavaScript will redefine the array to a standard object. After that, all array methods and properties will produce incorrect results... In JavaScript, arrays always use numbered indexes. LINK

Reference

Iterating over an array with “holes” in JavaScript

Create an empty object in JavaScript with {} or new Object()?

What’s the difference between “Array and “[]” while declaring a JavaScript array?

JavaScript Array對象

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91198.html

相關(guān)文章

  • JS淬煉: Syntax Parser

    摘要:語法分析利用詞法分析的結(jié)果建立上下文關(guān)系語法樹。一般情況下,我們不會(huì)直接和語法樹打交道,但會(huì)在進(jìn)行代碼壓縮語法高亮重編譯關(guān)鍵字匹配和作用域判斷時(shí)間接涉及到。傳統(tǒng)的引擎直接根據(jù)語法樹的的結(jié)果進(jìn)行解釋執(zhí)行,導(dǎo)致效率比較為低下。 一門語言的執(zhí)行,大致經(jīng)歷下面這些過程:詞法分析 -- 語法分析 -- 語義分析 -- 中間代碼生成 -- 優(yōu)化代碼 -- 代碼生成。 在Javascript中,Sy...

    wuaiqiu 評論0 收藏0
  • JS淬煉: Primitive vs. Object

    摘要:值傳遞引用傳遞是值傳遞,是引用傳遞。但這影響會(huì)根據(jù)父類是屬于還是而有微妙差別。我們設(shè)想有一個(gè)父類,和兩個(gè)繼承了他的子類和。這時(shí),子類修改該不會(huì)影響到父類本身,更不會(huì)傳遞到其他子類上。 Javascript有兩種基本數(shù)據(jù)類型,Primitive和Object。Object是properties的聚合,其property可以是Object也可以是Primitive。Primitive只有v...

    Hancock_Xu 評論0 收藏0
  • 進(jìn)階3-3期】深度解析 call 和 apply 原理、使用場景及實(shí)現(xiàn)

    摘要:之前文章詳細(xì)介紹了的使用,不了解的查看進(jìn)階期。不同的引擎有不同的限制,核心限制在,有些引擎會(huì)拋出異常,有些不拋出異常但丟失多余參數(shù)。存儲的對象能動(dòng)態(tài)增多和減少,并且可以存儲任何值。這邊采用方法來實(shí)現(xiàn),拼成一個(gè)函數(shù)。 之前文章詳細(xì)介紹了 this 的使用,不了解的查看【進(jìn)階3-1期】。 call() 和 apply() call() 方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的 this 值和分...

    godlong_X 評論0 收藏0
  • js基礎(chǔ)進(jìn)階--編碼實(shí)用技巧(一)

    摘要:我的個(gè)人博客前言在平時(shí)的開發(fā)中,編碼技巧很重要,會(huì)讓你少寫很多代碼,起到事倍功半的效果。下面總結(jié)幾種簡單的技巧,大家共同學(xué)習(xí)一下利用將字符串轉(zhuǎn)換為整數(shù)型這個(gè)方法試用于將字符串類型的數(shù)字轉(zhuǎn)換為整數(shù)型,如果帶字母就會(huì)返回。 我的個(gè)人博客:http://www.xiaolongwu.cn 前言 在平時(shí)的開發(fā)中,編碼技巧很重要,會(huì)讓你少寫很多代碼,起到事倍功半的效果。 下面總結(jié)幾種簡單的技巧,...

    U2FsdGVkX1x 評論0 收藏0
  • JS進(jìn)階篇5---JS數(shù)組去重的n種方式

    1、利用 indexOf() 方法之一 Array.prototype.unique = function(){ var temp = []; for (var i = 0;i < this.length;i++){ // 如果當(dāng)前數(shù)組的第 i 項(xiàng)已經(jīng)保存到了臨時(shí)數(shù)組,那么跳過 if(temp.indexOf( this[i] ) == -1){ ...

    baihe 評論0 收藏0

發(fā)表評論

0條評論

jimhs

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<