1. 程式人生 > >JS 用字串做陣列下標

JS 用字串做陣列下標

今天學習中竟然發現JS可以用字串做陣列下標,當時也是把我震驚到了。於是決定好好研究一下。查了半天資料, 找到一個部落格分析的很詳細。轉貼到這裡,方便以後複習學習。

跪謝原博主。  原文http://www.cnblogs.com/ZJAJS/archive/2013/01/19/2867847.html

考完試後閒來無事,想起好多天沒寫js了,於是打算實踐一下最近看到的一些好玩的點子。結果寫著寫著,發現了一點有趣的小問題。出現問題的程式碼如下:

1 var array = [];
2 array["a"] = "hello";
3 array["b"] = "world";
4 array["c"] = "yes";
5 console.log("length: " + array.length);

  因為在之前看多的許多javascript書籍中,都宣稱js是可以使用字串作為陣列下標的,因此我在用的時候也沒覺得有什麼不妥。但是在檢視最後一句的控制檯輸出結果的時候,始料未及的情況出現了:

  顯示的陣列的length值居然是零,接著測試一下之前的步驟是否成功對陣列進行了操作,console.log("array[b]: " + array["b"]); 的控制檯輸出結果如下:

  證明了之前的操作是成功的,那麼既然陣列的下標可以是字串,為什麼插入元素之後陣列的長度顯示仍然為零呢?為了進一步探索這其中的問題,我將上面的程式碼做了一點改動:

複製程式碼
1 var array = [];
2 array["a"] = "hello";
3 array["b"] = "world";
4 array["c"] = "yes";
5 array["10"] = "no";
6 console.log("length: " + array.length);
7 console.log(array);
複製程式碼

此時控制檯中顯示的結果為:

  唔,現在length的值變成了11。為了一探究竟,我把最後一行賦值語句的陣列下標從10加到了100,並在控制檯列印整個array陣列的資訊,輸出結果如下:

   這下可以看到我們之前往陣列中新增的所有元素的資訊了,但是等等。。。這樣的顯示方式有點眼熟,看起來不像一般陣列的顯示方式,反而像是個物件!(表打我。。我知道陣列也是物件::><::)我們知道Array物件是從Object物件繼承得到的,那麼莫非這些“看不見”的“陣列元素”都變成了當前這個Array例項物件的屬性?

  Javascript的陣列其實不像PHP或者其他一些語言一樣擁有真正的字串下標,當我們試圖為一個js陣列新增字串下標的時候,其實就相當於為該陣列物件添加了一個屬性,屬性名稱就是我們所謂的“字串下標”。由於為陣列物件新增屬性不會影響到同為該物件屬性的length的值,因此該值將始終為零。同樣地,.pop()和.shift()等作用於陣列元素的方法也不能夠作用於這些物件屬性。因此,如果要使用的是一個完全由“字串下標”組成的陣列,那還是將其宣告為一個Object型別的物件要更好一些。

 但是到了這裡新的問題又冒出來了,既然具有字串下標的元素會被作為該陣列物件的屬性,那麼為什麼array["10"]這一項會導致length的值變成11呢?我找到了以下這篇文章:《JS陣列下標的總結http://www.phper.org.cn/?post=65,在該文章的第一句中就回答了這個問題。根據經過一系列討論之後得到的結果,將上述問題的答案整理如下:

  Javascript陣列下標值的範圍為0到2的32次方。對於任意給定的數字下標值,如果不在此範圍內,js會將它轉換為一個字串,並將該下標對應的值作為該陣列物件的一個屬性值而不是陣列元素,例如array[-1] = "yes" 其實就相當於給array物件添加了一個名為-1的屬性,屬性值為yes。如果該下標值在合法範圍內,則無論該下標值是數字還是數字字串,都一律會被轉化為數字使用,即 array["100"] = 0 和 array[100] = 0 執行的是相同的操作。


相關推薦

JS 字串陣列

今天學習中竟然發現JS可以用字串做陣列下標,當時也是把我震驚到了。於是決定好好研究一下。查了半天資料, 找到一個部落格分析的很詳細。轉貼到這裡,方便以後複習學習。 跪謝原博主。  原文http://www.cnblogs.com/ZJAJS/archive/2013/01/

js陣列使用字串索引

var arr = [] //等同於 arr=new Array(); arr[0] = "下標索引是數字"; arr[1] = "下標索引是數字1"; arr["z"] = "下標索引是字母"; arr["下標"] = "下標索引是中文!"

js數組使用字符串

blog http size () ons for arr 是不是 字符串 var x;var arr=new Array();//=new Object()或=[]或={}這幾個效果都一樣arr["a"]="我在這裏!";arr["c"]=233;arr["下標"]=f

(C++)陣列形式對一維陣列進行排序

用另一個數組下標的形式記錄一個一維陣列中下標所對應的元素出現在個數,並對此一維陣列進行排序。 例如:一個一維陣列中的元素為:a[4] = { 2,3,2,5 };此陣列為一個長度為4的陣列,另一個空陣列x[6]={ 0 };x[0] = 0,因為使用下標的形式記錄a陣列中的元素,此時x[]的

列舉型別作為陣列

  在開發中,經常會用到一些陣列,它裡面存放一定數量(已知,不是太多)的特定元素。在使用數字表示的陣列下標訪問陣列中元素的時候,根本不知道該元素是否是需要的那個元素,而且使程式碼可讀性降低,甚至還會出現下標越界的危險。    比如,現在有如下的繼承體系: class CSh

關聯陣列陣列索引不僅僅為數字還可以是字串等)

最近遇上的奇怪的陣列下標,查閱資料瞭解了一下,原來是關聯陣列,後期有詳細瞭解到關聯陣列的使用情況的話再和大家分享。 關聯陣列  “關聯陣列”是一種具有特殊索引方式的陣列。不僅可以通過整數來索引它,還

C#for迴圈設定二維陣列和元素

https://blog.csdn.net/number1killer/article/details/80021129遍歷陣列          https://blog.csdn.net/numbe

原生js圖片時間

har 分享圖片 minutes ets nload span minute color 效果 今天寫一個時間例子,用圖片組成時分秒。具體來看代碼,當然今天的寫法只是一種,還有很多種實現方法,來看布局: <p id="times"></p> <

array_map 等php回撥函式使用問題(關聯陣列獲取)

前言:我自己用此類回撥函式,來替代 foreach 純粹是用為程式碼的簡潔性,讓程式碼更好看。(我有點程式碼小潔癖~) 1、array_reduce 當迭代處理一個一維索引陣列時,在回撥函式內是無法獲取到當時元素索引的。所以想要獲取時,需得藉助一個外部變數。 目的:把 $arr 遍歷到 <sele

JS字串陣列常用函式

目錄 字串(String) String物件常用的方法: 字串迴圈 陣列(Array) Array物件常用的方法: 陣列迴圈 forEach迴圈 形式

陣列的由來和為什麼陣列從0開始?

本文索引: 1.陣列的由來: a.字面引申: b.通俗解釋: 陣列的特點: 2.陣列下標為什麼從0開始: a.初步理解: b.加深理解: 1.陣列的由來: // 變數

陣列為什麼是從0開始的,而不是1?

依稀記得大一開始學習C語言的時候,對於陣列下標從0開始這一點是非常彆扭難以適應的,感覺這就是反人類的設計。直到今天才瞭解這背後為什麼這樣設計的原理。 為了解釋清楚這個原因,我們來認識陣列的相關特性,據此來探索它底層的一些東西。 隨機訪問 為什麼陣列能支援隨機訪問呢,我們先來看看陣列專業定義。陣列( Arr

python迴圈陣列

http://outofmemory.cn/code-snippet/3741/accessing-the-index-in-python-for-loops 但是有時候我們會需要在便利陣列的同時訪問下標,這時候可以藉助於enumerate函式來實現,例如: l = [1,2,3]for

陣列越界的避免方法

為什麼會出現陣列下標越界? C語言不檢查陣列下標的合法性 陣列下標越界的危害 陣列下標越界時,結果隨機。可能導致程式功能不正常,也可能導致程式崩潰。 如何防止陣列下標越界? 1、在使用迴圈遍歷陣列元素時,注意防範off-by-one的錯誤。 2、對於作為函式引數傳入的陣列下標

(pyhon)給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列

方法一:使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可能的數字進行相加

[work] shell中陣列訪問

shell中陣列的下標預設是從0開始的 1。將字串放在陣列中,獲取其長度 #!/bin/bash str="a b --n d" array=($str) length=${#array[@]} echo $length for ((i=0; i<$length;

利用陣列,將n以內的數進行排序

巧用陣列下標 陣列的下標是一個隱含的很有用的陣列,特別是在統計一些數字,或者判斷一些整型數是否出現過的時候。例如,給你一串字母,讓你判斷這些字母出現的次數時,我們就可以把這些字母作為下標,在遍歷的時候,如果字母a遍歷到,則arr[a]就可以加1了,即  arr[a]++;

Python字串二進位制乘法和Python呼叫內建進位制轉換我踩的坑

注意本文加法的思想來源於 https://blog.csdn.net/qiubingcsdn/article/details/82263114 其餘為我自己做的 字串str的末位是實際上計算的首位,所以第一步是翻轉字串 首先弄清楚python的字串列表

word 2013 文件目錄與正文不同的頁面方法

1. 在目錄頁的前一頁尾部,點選單上“頁面佈局”-》“分隔符”, 插入分節符。 2. 在目錄頁的頁首處雙擊,使其為可編輯態,點選單上的“設計”-》“連結到前一條頁首”, 去掉其選中態。      再在其頁尾處雙擊,使其為可編輯態,同樣點選單上的“設計”-》“連結到前一

Java學習筆記33:陣列越界

陣列下標越界 :在引用陣列元素時,使用的下標超過了該陣列下標的應有範圍。 但應注意的是: C/C++不對陣列做邊界檢查。 可以重寫陣列的每一端,並寫入一些其他變數的陣列或者甚至是寫入程式的程式碼。不檢查下標是否越界可以有效提高程式執行的效率,因為如果你檢查,那麼編譯器必須在生成的目的碼中