最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Javascript數(shù)組索引

 更新時間:2015年07月29日 10:39:11   投稿:hebedich  
這篇文章主要介紹了淺談Javascript數(shù)組索引,都是個人的一些經(jīng)驗總結,需要的朋友可以參考下

從題目說起,之所以是不完全,是因為有些東西比如數(shù)組的方法怎么用這個我都不打算講,因為那個看一下都會,下面講的都是我覺得重要的,只關于數(shù)組對象本身。另外,由于我的Javascript實戰(zhàn)經(jīng)驗不多,所以可能有些東西沒涉及到,有些內容說的有誤,請發(fā)現(xiàn)問題的同學不吝指教。

首先,Javascript(下稱js)的數(shù)組定義,這不是重點,簡單說下,下面兩句都是創(chuàng)建一個空的數(shù)組:

  var arr = [];
  var arr2 = new Array(); // 不寫new也可以。

在創(chuàng)建之后,你就可以隨時往數(shù)組里添加元素。數(shù)組的大小是不固定的,可以像a[0] = 1這樣隨意添加。

然后到重點了,關于往數(shù)組里添加元素這件事。首先,你要知道數(shù)組是一個對象,而對象是一個鍵值對的集合(類似于java里面的map,python里面的dict,c#里面的Dictionary),對象可以有屬性,對象的函數(shù)叫方法,對象的屬性或方法可以使用方括號或點號的方式訪問,其中使用方括號引用要加引號,點號的使用只有在屬性名稱是一個合法的變量名稱的時候才可以使用,也就是屬性不包含任何空格連字符并且不以數(shù)字開頭時才可以,看個例子:

  var person = {};
  person.age = 22;
  person.sayhi = function(){console.log('hi');};

  person.age; // 22
  person['age']; // 22

  person.sayhi(); // hi
  person['sayhi'](); // hi

嗯,這就是對象,好像也沒什么特別的(除了用方括號取值外),不過對象說些就夠了,后面開始說數(shù)組。

對于上面的這些,數(shù)組全可以做到,也就是說,下面這段代碼也可以正常運行(只有第一行跟上面的不一樣):

  var person = [];
  person.age = 22;
  person.sayhi = function(){console.log('hi');};

  person.age; // 22
  person['age']; // 22

  person.sayhi(); // hi
  person['sayhi'](); // hi

因為數(shù)組就是對象,這里不要把方括號的字符串索引和通常講的數(shù)字索引弄混了,還沒開始說(馬上說)數(shù)字索引呢。

和普通的對象不同,數(shù)組對象的元素有數(shù)字索引,或者說特殊的鍵(前面說了對象是鍵值對),這和我們在其他語言比如java、c#等語言中的見到的數(shù)組是一樣的。在js中,這個鍵有一些特殊的要求,它可以是數(shù)字,也可以是能轉換成數(shù)字的字符串,而合理的數(shù)字,需要是范圍在0到4294967295(2^32-1)的整數(shù)(事實上,這個索引在詞法分析的時候都是當做字符串的,js把這個字符串轉換成32位的整數(shù),然后再把32位的整數(shù)轉換成字符串跟原字符串比較,如果相同的話,則說明這個索引值是合法的數(shù)字,否則就是一個普通的字符串鍵)。簡單舉個例子:

  a = [1, 3, 5, 7];
  console.log(a[0]); // 1
  console.log(a['0']); // 1

  a['2'] = 12;
  console.log(a[2]); // 12

上面的代碼都是可以在瀏覽器里運行的,注釋是輸出值。這和我們在其他語言中見到的數(shù)組好像沒啥區(qū)別。這個a['2'] = 12;因為'2'被轉換成整數(shù)再轉換成字符串還是'2',所以跟a[2]一樣。不過其他語言里,我們使用數(shù)組都是定義一個固定大小數(shù)組的對不對?這里好像不是哈,而且這里還說了數(shù)組的索引范圍。所以,為什么?簡單點回答就是這里的數(shù)組是對象,是js中的對象。這一點和其他語言(python等函數(shù)式的除外)不同,具體哪里不同,我沒深入研究,也說不太清楚,我理解的是,c/java等語言定義數(shù)組的時候,是在內存中劃分了一塊固定大小的區(qū)域,有一個指針存儲著這塊區(qū)域的首地址。而js中好像不是這樣的,就像前面說的一樣,數(shù)組是對象,鍵值對結構,所以我覺得js中的數(shù)組都是用hash的方式存儲元素的,元素之間的內存不一定是連續(xù)的。不過我現(xiàn)在沒找到查看js變量內存地址的方法,所以沒法確定這件事。不過這不是本文要講的重點。

我們把重點放到索引上,前面說了索引的范圍,不過有同學可能試了,就是a[-1] = 2;或是a[4294967296] = 10;這種語句也沒有問題。對的,這并不是錯誤,這是正常的語句,當然不會有問題。但是問題是前面不是說了索引必須是0到4294967295的整數(shù)么?對,是的,這也沒錯。那疑問出在哪里呢?

先貼兩張firefox控制臺的截圖:


你有沒有發(fā)現(xiàn)什么問題呢?當我們使用正常的索引添加元素,在打印數(shù)組的時候,添加的元素會被打印出來,而使用非正常的“索引”添加元素時,打印的數(shù)組里面卻沒有添加的元素,但是你看右側的Array對象,所有添加的元素卻一個不少。再看一張圖,這次多添加幾個元素,再給數(shù)組添加一個屬性(注意看右側Array對象的元素索引):

不知道你有沒有發(fā)現(xiàn)。在右側,上面幾個是數(shù)字索引,打印數(shù)組的時候能被打印的,而下面幾個是屬性,打印數(shù)組不會打印屬性!也就是說,a[-2] = 2;這種語句,這個-2是屬性的鍵,而不是特殊的數(shù)字索引的鍵,-2在被強制轉換成正整數(shù)的時候,被認為是一個字符串,所以這個-2和4294967296和'name'一樣,都是數(shù)組的一個屬性的鍵!所以前面說的負索引或是超出范圍的索引(應該說是屬性的鍵)都是合法的,它們都是普通的字符串鍵。

這里一個問題,就是既然說-2這種鍵是普通的屬性鍵,那有人可能會說為什么使用a.-2或是a.'-2'訪問-2這個鍵的值會報錯,而a[-2]就不會報錯?對呀,為什么?前面在講對象的時候,有一句加粗的話:對象的屬性或方法可以使用方括號或點號的方式訪問,其中使用方括號引用要加引號,點號的使用只有在屬性名稱是一個合法的變量名稱的時候才可以使用,也就是屬性不包含任何空格連字符并且不以數(shù)字開頭時才可以。所以,-2這種鍵的屬性,是不能用點號的方式訪問的!

另外還有一個小問題,就是方括號,當我們想訪問數(shù)組的name屬性的時候,需要這樣:a['name'],也就是name被引號包起來了,而-2是和name一樣的屬性的鍵,為何-2可以不用(也可以用)引號包起來?其實,方括號內的所有字符會被當成一個表達式,單純的一個數(shù)字-2,是個合法的表達式,但name如果沒有被定義成變量名,name就不是合法的表達式,同樣x^b&c這種也不是合法的,因為它會被當成變量x、b、c組成的某種表達式,但是x、b、c是不是變量還不確定,而且里面的符號不一定是被js所支持的,所以a[name]的問題出在name上,而不是[]上。如果還不好理解,你可以把name想象成x+y,在x、y沒有被定義成變量的時候,x+y這個表達式肯定有問題對不對?那a[x+y]也會有問題對不對?而a['x+y']就沒有問題,因為'x+y'是個字符串。

后面補充一點,js中,變量名字是可以由數(shù)字、字母、下劃線任意組合的,其中數(shù)字不能放在開始位置。而對象的屬性鍵的命名要寬松一些,合法的可以不用引號,不合法的用引號包起來就可以。

好了,說的差不多了,總結一下:文章首先簡單介紹了下對象,然后說了數(shù)組也是對象,最后解釋了下一些疑問,然后總結。

寫這篇文章的原因是我昨天在微博里看了一條js的教程,對數(shù)組的講解產生了一個疑問,然后評論的字數(shù)超出了140,所以我就查資料單獨寫出來了。目的是讓自己弄明白,也愿能幫助到學js的同學。數(shù)組范圍和索引轉換那里是參考的《Speaking Javascript》,其他地方都是自己的理解和看法。

最后,感謝觀看,因為是分兩次寫的,可能語句有些亂,有的地方不亂但是上下文也完整,有的上下文完整但是廢話太多,總之,就這樣吧。下篇見。

相關文章

  • js將控件隱藏的方法及display屬性介紹

    js將控件隱藏的方法及display屬性介紹

    這篇文章主要介紹了,js中將控件隱藏的方法,以及display的屬性,有需要的朋友可以參考一下
    2013-07-07
  • javascript 仿QQ滑動菜單效果代碼

    javascript 仿QQ滑動菜單效果代碼

    javascript 仿QQ滑動菜單效果代碼,非常漂亮的代碼,學習js的朋友可以參考下代碼風格。
    2010-09-09
  • 用JavaScript實現(xiàn)使用鼠標畫線的示例代碼

    用JavaScript實現(xiàn)使用鼠標畫線的示例代碼

    用JavaScript實現(xiàn)用鼠標畫線,具體步驟是首先是畫點,在根據(jù)兩點坐標畫直線,最后是獲取鼠標位置,需要的朋友可以參考下
    2014-08-08
  • TypeScript學習之強制類型的轉換

    TypeScript學習之強制類型的轉換

    眾所周知TypeScript是一種由微軟開發(fā)的自由和開源的編程語言。它是JavaScript的一個超集,而且本質上向這個語言添加了可選的靜態(tài)類型和基于類的面向對象編程,下面這篇文章主要介紹了TypeScript中強制類型的轉換,需要的朋友可以參考借鑒下。
    2016-12-12
  • JS中產生20位隨機數(shù)以0-9為例也可以是a-z A-Z

    JS中產生20位隨機數(shù)以0-9為例也可以是a-z A-Z

    本節(jié)主要介紹了JS如何產生隨機數(shù),本例產生20位隨機數(shù)以0-9為例也可以是a-z A-Z,需要的朋友可以參考下
    2014-08-08
  • JavaScript中在光標處插入添加文本標簽節(jié)點的詳細方法

    JavaScript中在光標處插入添加文本標簽節(jié)點的詳細方法

    本文主要介紹了JavaScript中在光標處插入添加文本標簽節(jié)點的詳細方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • JS返回頂部實例代碼

    JS返回頂部實例代碼

    這篇文章主要為大家詳細介紹了JS返回頂部實例代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 淺談JavaScript原型鏈

    淺談JavaScript原型鏈

    這篇文章主要為大家詳細介紹了JavaScript原型鏈,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2023-04-04
  • 詳解微信小程序開發(fā)用戶授權登陸

    詳解微信小程序開發(fā)用戶授權登陸

    這篇文章主要介紹了微信小程序開發(fā)用戶授權登陸,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 原JS實現(xiàn)banner圖的常用功能

    原JS實現(xiàn)banner圖的常用功能

    這篇文章主要為大家詳細介紹了原JS實現(xiàn)banner圖的常用功能,,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

牟定县| 大邑县| 花垣县| 镇宁| 北流市| 精河县| 太谷县| 时尚| 大厂| 白沙| 洞口县| 福贡县| 安国市| 奉新县| 泾川县| 芒康县| 南充市| 洪江市| 襄城县| 鹤岗市| 武邑县| 浦东新区| 胶南市| 富宁县| 朝阳区| 环江| 马山县| 梧州市| 嫩江县| 通辽市| 柯坪县| 汶上县| 南阳市| 大连市| 吴旗县| 龙州县| 金门县| 疏附县| 海伦市| 华亭县| 宁化县|