JavaScript數組的一些奇葩行為


今天,復習了一下JavaScript的數組,然后,把他的一些奇葩行為總結了一下,在這里和大家share一下,如果有不對的地方,歡迎指出!
奇葩1:Array()構造器函數可以不使用new關鍵字進行調用:
Array()構造器使用傳遞給他的參數作為數組的元素,從而創建數組,一般的,我們是如下調用的:
var a = new Array(1, 2, "bom!");
a.length; //3
console.log(a); //[1, 2, "bom!"]
 
但是,省略掉new也是可以的,如下:
var a = Array(1, 2, "bom!");
a.length; //3
console.log(a); //[1, 2, "bom!"]

雖然,我不知道他的內部實現機制是什么,但是,猜想他的構造器函數可能是如下定義的:

function Array(args) {
    //如果,this不是Array的實例的話,
    //說明不是通過new調用的,則在這里再重新調用
    if( !this instanceof Array) {
        return new Array(args);
    }

    //后面是正常調用時的實現代碼
    //...
}

 

奇葩2:當只傳一個參數給構造函數時,行為莫測

如果只傳一個參數,並且這個參數是一個整數,將會得到一個數組,並且length等於這個參數
var a = new Array(12);
console.log(a.length); //12
console.log(a); //[]
 
如果只傳一個浮點數,就會報錯:
var a = new Array(1.1); //Uncaught RangeError: Invalid array length(…)

傳遞一個字符串就會正常工作,並且該字符串作為數組的第一個元素:
var a = new Array("1.1");
console.log(a.length); //
console.log(a); //["1.1"]
 
但是為了避免二義性,我建議最好是是直接使用字面量的形式創建數組:
var a = []; //空數組
var a = [1, 1, "bom"]; //三個元素
var a = [12]; //一個元素,並且元素是12

 

  奇葩3:數組的length屬性可以被修改(可寫)
如下,我們直接把本來是2的length改成了100,而且還修改成功了!!!
var a = [1, 2, 3, 4];
console.log(a.length); //4
a.length = 100; 
console.log(a.length); //100
雖然length等於100, 但是,元素a[4]-a[99]是不存在的,並且如果你請求他們的值的話,例如,從0到a.length做一個循環中做的話,那么會得到undefined。
接下來再看:
var a = [1, 2, 3, 4];
a.length = 100;
console.log(a[10]); //undefined
console.log(99 in a); //false
與下面的例子有點相似:
var a = [1, 2, 3, 4];
a[99] = undefined;
console.log(a.length); //100
不同之處在於,這里的a[99]存在了,因為我們創建了它,即使他擁有的是undefined的值。 但是從a[4]到a[98]的所有元素則是不存在的,如下:
var a = [1, 2, 3, 4];
a[99] = undefined;
console.log(99 in a); //true;
console.log(98 in a); //false
console.log(a.length); //100


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM