javascript中的對象和數(shù)組的應(yīng)用技巧
更新時間:2007年01月07日 00:00:00 作者:
javascript已經(jīng)用了有三年多了,但是對一些細(xì)節(jié)的東西還是一知半解,比如對象和數(shù)組,一直都在用一些最基本的操作。這是我學(xué)習(xí)的一個壞習(xí)慣--懶,很多東西都是了解而已,看到稍微復(fù)雜點的邏輯就沒有耐心。就像學(xué)asp時不知道asp跟腳本的關(guān)系,學(xué)html不知道什么是DOM...結(jié)果是學(xué)得慢且不扎實,碰到稍復(fù)雜的問題就歇菜(扯遠(yuǎn)了)。
今天繼續(xù)優(yōu)化腳本,嘗試著合并一些數(shù)組時碰到問題,才算去仔細(xì)看了手冊,做了一些測試。
javascript1.2之后允許使用[]創(chuàng)建數(shù)組:
var firstArray = [];
var secondArray = ["red", "green", "blue"];
var thirdArray = [,,,,];
可以在數(shù)組創(chuàng)建后添加元素:
secondArray[4] = 28;
這樣的結(jié)果是第4個元素和第2個元素之間有1個空元素。
結(jié)果類似這樣:["red", "green", "blue",,28]
需要注意的是,數(shù)組必須初始化,我測試了數(shù)組作為數(shù)組元素的定義:
var arrArray = [[]];
本來設(shè)想實現(xiàn)二維數(shù)組,結(jié)果是使用arrArray[i][0]當(dāng)i>0時無效!
仔細(xì)看一下才明白,其實是定義了arrArray[0]為一個空數(shù)組,而其他元素都未定義,相當(dāng)于
var arrArray=[];
arrArray[0]=[];
所以arrArray[1]沒有定義,所以如果將它作為數(shù)組進(jìn)行操作會出錯。
刪除一個數(shù)組元素:delete
var myColors = ["red", "green", "blue"];
delete myColors[1];
alert("The value of myColors[1] is: " + myColors[1]);
delete的結(jié)果是myColors[1]=undefined,但是myColors.length不變,myColors變成這樣:["red",, "blue"]
替換或絕對刪除數(shù)組元素用slice():
var myArray = [1, 2, 3, 4, 5];
myArray.slice(2); // returns [3, 4, 5]
myArray.slice(1, 3); // returns [2, 3]
myArray.slice(-3); // returns [3, 4, 5]
myArray.slice(-3, -1); // returns [3, 4]
myArray.slice(-4, 3); // returns [2, 3]
myArray.slice(3, 1); // returns []
var myArray = [1, 2, 3, 4, 5];
myArray.splice(3,2,''a'',''b'');
// returns 4,5 [1,2,3,''a'',''b'']
myArray.splice(1,1,"in","the","middle");
// returns 2 [1,"in","the","middle",3,''a'',''b'']
看了文檔才知道,數(shù)組是傳遞引用的!
var x = [10, 9, 8];
var y = x;
x[0] = 2;
alert("The value of y's first element is: " + y[0]);
你猜結(jié)果是多少呢?
再看這個:
// Declare a reference type (array)
var refType = ["first ", " second", " third"];
// Declare a primitive type (number)
var primType = 10;
// Declare a function taking two arguments, which it will modify
function modifyValues(ref, prim)
{
ref[0] = "changed"; // modify the first argument, an array
prim = prim - 8; // modify the second, a number
}
// Invoke the function
modifyValues(refType, primType);
// Print the value of the reference type
document.writeln("The value of refType is: ", refType+"<
>");
// Print the value of the primitive type
document.writeln("The value of primType is: ", primType);
測試時發(fā)現(xiàn)一個問題:
var arr=[];
arr['a']=1;
arr['b']=2;
alert(arr.length);
彈出的數(shù)字是0!
看了文檔后知道,這樣的數(shù)組叫做聯(lián)合數(shù)組(Associative Arrays),arr['a']等同于arr.a,arr.length也就等同于arr['length'],而arr.length在我們初始化arr(var arr=[];)的時候自動賦值為0。
有人把這種聯(lián)合數(shù)組叫做javascript的hash table。嚴(yán)格上講,聯(lián)合數(shù)組和普通數(shù)組本身都是對象(廢話,javascript中的一切都是對象- -),意義和用法都是相同的??聪旅娴睦樱?
var arr=[];
arr=[1,2,3];
arr.test='test';
alert(arr);
alert(arr[1]);
alert(arr['test']);
var arr={}; arr=[2,3,4]; alert(arr[0]);
var arr={};和var arr=[]都可以寫成var arr=function(){};
從上面的代碼可以看出,下標(biāo)數(shù)組跟聯(lián)合數(shù)組分別獨立,下標(biāo)只作用于下標(biāo)數(shù)組,不能訪問聯(lián)合數(shù)組,相應(yīng)的,聯(lián)合數(shù)組不對length屬性產(chǎn)生影響。聯(lián)合數(shù)組的標(biāo)簽就是屬性,但是下標(biāo)數(shù)組的下標(biāo)并不是屬性,arr[0]!=arr.0,訪問arr.0會出錯。
在某些時候,用arr['a']代替arr.a作為方法調(diào)用會更有效,因為arr['a']中的'a'可以用變量傳入,比如將方法賦給變量:
var d=document,l=links;
這時候用直接d.l就會出錯,而用d[l]就可以正確執(zhí)行,alert一下就知道了:)
alert(d.l);//腳本錯誤
alert(d[l]);//顯示object
既然數(shù)組是由lenght屬性的對象,那么是不是所有具有l(wèi)ength屬性的對象都是數(shù)組呢?比如String。測試之后發(fā)現(xiàn),firefox是可以把String當(dāng)作數(shù)組處理的,但是ie不行:
var myString = "Hello world";
alert(myString.length);
alert(myString[0]);
數(shù)組的對象應(yīng)該比較獨特,用戶對象不能完全模擬:
function myarray(size){
this.length=size;
var x=0;
}
var arr=new myarray(5);
arr[9]=1;
alert(arr);
alert(arr[9]);
alert(arr.length);
本以為Array的length屬性就是普通的對象屬性,結(jié)果經(jīng)過上面的例子發(fā)現(xiàn),arr的length不再是數(shù)組length,arr的結(jié)構(gòu)也不是普通數(shù)組結(jié)構(gòu)。
定義一個函數(shù)/類的方法有好幾種:
function fName(arguments){
//function body
};
var fName = function(arguments){
//function body
}
var fName = new Function("arguments","/*function body*/");
第三種方法比較好玩,看下面的例子:
var arr=new Function("var total=0; for (var i=0; i
用這個方法可以解析ajax返回的JSON,這樣就不用低效的eval了(沒有測試是否比eval快):
假設(shè){b:{c:2}}為返回的json字符串:
var arr=new Function("this.a={b:{c:2}};");
var aa =new arr();
alert(aa.a.b.c);
今天繼續(xù)優(yōu)化腳本,嘗試著合并一些數(shù)組時碰到問題,才算去仔細(xì)看了手冊,做了一些測試。
javascript1.2之后允許使用[]創(chuàng)建數(shù)組:
var firstArray = [];
var secondArray = ["red", "green", "blue"];
var thirdArray = [,,,,];
可以在數(shù)組創(chuàng)建后添加元素:
secondArray[4] = 28;
這樣的結(jié)果是第4個元素和第2個元素之間有1個空元素。
結(jié)果類似這樣:["red", "green", "blue",,28]
需要注意的是,數(shù)組必須初始化,我測試了數(shù)組作為數(shù)組元素的定義:
var arrArray = [[]];
本來設(shè)想實現(xiàn)二維數(shù)組,結(jié)果是使用arrArray[i][0]當(dāng)i>0時無效!
仔細(xì)看一下才明白,其實是定義了arrArray[0]為一個空數(shù)組,而其他元素都未定義,相當(dāng)于
var arrArray=[];
arrArray[0]=[];
所以arrArray[1]沒有定義,所以如果將它作為數(shù)組進(jìn)行操作會出錯。
刪除一個數(shù)組元素:delete
var myColors = ["red", "green", "blue"];
delete myColors[1];
alert("The value of myColors[1] is: " + myColors[1]);
delete的結(jié)果是myColors[1]=undefined,但是myColors.length不變,myColors變成這樣:["red",, "blue"]
替換或絕對刪除數(shù)組元素用slice():
var myArray = [1, 2, 3, 4, 5];
myArray.slice(2); // returns [3, 4, 5]
myArray.slice(1, 3); // returns [2, 3]
myArray.slice(-3); // returns [3, 4, 5]
myArray.slice(-3, -1); // returns [3, 4]
myArray.slice(-4, 3); // returns [2, 3]
myArray.slice(3, 1); // returns []
var myArray = [1, 2, 3, 4, 5];
myArray.splice(3,2,''a'',''b'');
// returns 4,5 [1,2,3,''a'',''b'']
myArray.splice(1,1,"in","the","middle");
// returns 2 [1,"in","the","middle",3,''a'',''b'']
看了文檔才知道,數(shù)組是傳遞引用的!
var x = [10, 9, 8];
var y = x;
x[0] = 2;
alert("The value of y's first element is: " + y[0]);
你猜結(jié)果是多少呢?
再看這個:
// Declare a reference type (array)
var refType = ["first ", " second", " third"];
// Declare a primitive type (number)
var primType = 10;
// Declare a function taking two arguments, which it will modify
function modifyValues(ref, prim)
{
ref[0] = "changed"; // modify the first argument, an array
prim = prim - 8; // modify the second, a number
}
// Invoke the function
modifyValues(refType, primType);
// Print the value of the reference type
document.writeln("The value of refType is: ", refType+"<
>");
// Print the value of the primitive type
document.writeln("The value of primType is: ", primType);
測試時發(fā)現(xiàn)一個問題:
var arr=[];
arr['a']=1;
arr['b']=2;
alert(arr.length);
彈出的數(shù)字是0!
看了文檔后知道,這樣的數(shù)組叫做聯(lián)合數(shù)組(Associative Arrays),arr['a']等同于arr.a,arr.length也就等同于arr['length'],而arr.length在我們初始化arr(var arr=[];)的時候自動賦值為0。
有人把這種聯(lián)合數(shù)組叫做javascript的hash table。嚴(yán)格上講,聯(lián)合數(shù)組和普通數(shù)組本身都是對象(廢話,javascript中的一切都是對象- -),意義和用法都是相同的??聪旅娴睦樱?
var arr=[];
arr=[1,2,3];
arr.test='test';
alert(arr);
alert(arr[1]);
alert(arr['test']);
var arr={}; arr=[2,3,4]; alert(arr[0]);
var arr={};和var arr=[]都可以寫成var arr=function(){};
從上面的代碼可以看出,下標(biāo)數(shù)組跟聯(lián)合數(shù)組分別獨立,下標(biāo)只作用于下標(biāo)數(shù)組,不能訪問聯(lián)合數(shù)組,相應(yīng)的,聯(lián)合數(shù)組不對length屬性產(chǎn)生影響。聯(lián)合數(shù)組的標(biāo)簽就是屬性,但是下標(biāo)數(shù)組的下標(biāo)并不是屬性,arr[0]!=arr.0,訪問arr.0會出錯。
在某些時候,用arr['a']代替arr.a作為方法調(diào)用會更有效,因為arr['a']中的'a'可以用變量傳入,比如將方法賦給變量:
var d=document,l=links;
這時候用直接d.l就會出錯,而用d[l]就可以正確執(zhí)行,alert一下就知道了:)
alert(d.l);//腳本錯誤
alert(d[l]);//顯示object
既然數(shù)組是由lenght屬性的對象,那么是不是所有具有l(wèi)ength屬性的對象都是數(shù)組呢?比如String。測試之后發(fā)現(xiàn),firefox是可以把String當(dāng)作數(shù)組處理的,但是ie不行:
var myString = "Hello world";
alert(myString.length);
alert(myString[0]);
數(shù)組的對象應(yīng)該比較獨特,用戶對象不能完全模擬:
function myarray(size){
this.length=size;
var x=0;
}
var arr=new myarray(5);
arr[9]=1;
alert(arr);
alert(arr[9]);
alert(arr.length);
本以為Array的length屬性就是普通的對象屬性,結(jié)果經(jīng)過上面的例子發(fā)現(xiàn),arr的length不再是數(shù)組length,arr的結(jié)構(gòu)也不是普通數(shù)組結(jié)構(gòu)。
定義一個函數(shù)/類的方法有好幾種:
function fName(arguments){
//function body
};
var fName = function(arguments){
//function body
}
var fName = new Function("arguments","/*function body*/");
第三種方法比較好玩,看下面的例子:
var arr=new Function("var total=0; for (var i=0; i
用這個方法可以解析ajax返回的JSON,這樣就不用低效的eval了(沒有測試是否比eval快):
假設(shè){b:{c:2}}為返回的json字符串:
var arr=new Function("this.a={b:{c:2}};");
var aa =new arr();
alert(aa.a.b.c);
相關(guān)文章
Document.location.href和.replace的區(qū)別示例介紹
document.location.href和document.location.replace都可以實現(xiàn)從A頁面切換到B頁面,下面為大家介紹下它們的區(qū)別2014-03-03JavaScript中g(shù)etUTCMinutes()方法的使用詳解
這篇文章主要介紹了JavaScript中g(shù)etUTCMinutes()方法的使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-06-06