有的時候總犯糊塗,不理解對象和數組的關係,轉載一篇文章,深入記憶一下javascript
http://hi.baidu.com/samdan/item/05179313d1ee4b9e99ce3371php
好比有一個數組a=[1,2,3,4],還有一個對象a={0:1,1:2,2:3,3:4},而後你運行alert(a[1]),兩種狀況下的運行結果是相同的!這就是說,數據集合既能夠用數組表示,也能夠用對象表示,那麼我到底該用哪種呢?java
數組表示有序數據的集合,而對象表示無序數據的集合。若是數據的順序很重要,就用數組,不然就用對象。編程
固然,數組和對象的另外一個區別是,數組中的數據沒有「名稱」(name),對象中的數據有「名稱」(name)。可是問題是,不少編程語言中,都有一種叫作「關聯數組」(associative array)的東西。這種數組中的數據是有名稱的。數組
好比在javascript中,能夠這樣定義一個對象:編程語言
var a={"城市":"北京","面積":16800,"人口":1600};ide
可是,也能夠定義成一個關聯數組:函數
a["城市"]="北京";ui
a["面積"]=16800;prototype
a["人口"]=1600;
在Javascript語言中,關聯數組就是對象,對象就是關聯數組。這一點與php語言徹底不一樣,在php中,關聯數組也是數組。
好比運行下面這段javascript:
var a=[1,2,3,4];
a['foo']='Hello World';
alert(a.length);
最後的結果是4,也就是說,數組a的元素個數是4個。
可是,運行一樣內容的php代碼就不同了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最後的結果是5,也就是說,數組a的元素個數是5個。
JS數組」(array)和「對象」(object)
2009-12-30 16:15:45| 分類:JS技術|字號 訂閱
好比有一個數組a=[1,2,3,4],還有一個對象a={0:1,1:2,2:3,3:4},而後你運行alert(a[1]),兩種狀況下的運行結果是相同的!這就是說,數據集合既能夠用數組表示,也能夠用對象表示,那麼我到底該用哪種呢?
數組表示有序數據的集合,而對象表示無序數據的集合。若是數據的順序很重要,就用數組,不然就用對象。
固然,數組和對象的另外一個區別是,數組中的數據沒有「名稱」(name),對象中的數據有「名稱」(name)。可是問題是,不少編程語言中,都有一種叫作「關聯數組」(associative array)的東西。這種數組中的數據是有名稱的。
好比在javascript中,能夠這樣定義一個對象:
var a={"城市":"北京","面積":16800,"人口":1600};
可是,也能夠定義成一個關聯數組:
a["城市"]="北京";
a["面積"]=16800;
a["人口"]=1600;
在Javascript語言中,關聯數組就是對象,對象就是關聯數組。這一點與php語言徹底不一樣,在php中,關聯數組也是數組。
好比運行下面這段javascript:
var a=[1,2,3,4];
a['foo']='Hello World';
alert(a.length);
最後的結果是4,也就是說,數組a的元素個數是4個。
可是,運行一樣內容的php代碼就不同了:
$a=array(1,2,3,4);
$a["foo"]="Hello world";
echo count($a);
最後的結果是5,也就是說,數組a的元素個數是5個。
遍歷方法:
一:
var news = { id:'101', title:'這是標題', content:'這裏是內容'}
for(var n in news){
document.write(n+'---'+news[n]+'<br>')
}
二:
var news = {
0:{id:'101', title:'這是標題111', content:'這裏是內容111'},
1:{id:'101', title:'這是標題222', content:'這裏是內容222'},
2:{id:'101', title:'這是標題333', content:'這裏是內容333'}
}
for(var n in news){
document.write(n+'---'+news[n].title+'<br>')
}
/////調用值的方法 news.id 或 news['id']
字符轉成對象
s = '{"address":"","email":"123@123.com","name":"test5","id":"6"};';
eval('o='+s);
alert(o.name);
或:
data=eval('(' +s+ ')');
-------------------------------------------------------------
對象是一種複合數據類型.
建立對象最簡單的方法是你的javascript代碼中包含對象直接量,也能夠經過運算符new建立。
var empty = {}; // An object with no properties
var point = { x:0, y:0 };
var circle = { x:point.x, y:point.y+1, radius:2 };
var homer = {
"name": "Homer Simpson",
"age": 34,
"married": true,
"occupation": "plant operator",
'email':
};
var a = new Array(); // Create an empty array
var d = new Date(); // Create an object representing the current date and time
var r = new RegExp("javascript", "i"); // Create a pattern-matching object
建立對象後,咱們能夠經過"."運算符,在對象中建立新屬性、引用已有屬性、設置屬性值等。
var book = new Object(); //建立對象
book.title="JavaScript: The Definitive Guide";
book.chapter1=new Object(); //做爲對象屬性的,嵌套對象
book.chapter1.title = "Introduction to JavaScript";
book.chapter1.pages = 11;
book.chapter2 = { title: "Lexical Structure", pages: 6 };
alert("Outline: " + book.title + "\n\t" +
"Chapter 1 " + book.chapter1.title + "\n\t" +
"Chapter 2 " + book.chapter2.title); // 從對象中讀取一些屬性.
在上例中,需注意,能夠經過把一個值賦給對象的一個新屬性來建立它.
在JavaScript語句中提到過用for/in語句能夠遍歷對象的屬性和方法。
用in運算符檢查屬性是否存在.如:
if ("x" in o) o.x = 1;//若是存在就設置其屬性值爲1.
若是這樣寫:o.x=undefined //屬性x是存在的,可是沒有值.我經常會這樣寫:if (o.x !== undefined) o.x = 1;
另外,!= =常代替!=.!= =和= = = 區別在於undefined和null,不用區分時能夠省略,如:if (o.doSomething) o.doSomething();
刪除屬性:delete book.chapter2;
做爲關聯數組的對象:object.property 和object["property"]是等價的.
通用對象的屬性和方法
constructor屬性:var d = new Date();d.constructor == Date; // true
因爲構造函數定義了一個對象的類,因此屬性constructor在有助於肯定給定對象的類型.如,可使用以下代碼來肯定一個未知對象的類型:if ((typeof o == "object") && (o.constructor == Date)),也能夠用instanceof運算符:if ((typeof o == "object") && (o instanceof Date))
toString()方法:返回一個字符串,該字符串表明了調用它的對象的類型或值.當javascript須要將一個對象轉換成字符串時就調用這個對象的toString()方法.例如當用"+"鏈接一個字符和一個對象時,或者把一個對象傳遞給alert()或document.write()方法時,就會調用toString().
默認的toString()方法提供的信息並很少.例以下面的代碼只能獲得字符串"[object Object]":var s = { x:1, y:1 }.toString();因此許多類都定義了本身的toString()方法,例如,當一個數組被轉換成一個字符串時,就獲得一個數組元素列表,其中每一個元素都被轉換成了字符串,當一個函數被轉換成字符串時,就會得到該函數的源代碼.第九章將詳細講述.
toLocaleString()方法:返回該對象局部化的字符串表示.Oject類定義的默認toLocaleString()方法自身不作任何局部化,返回的結果與toString()方法返回的徹底相同,可是Object 類的子類則可能定義本身的toLocaleString()方法.
valueOf()方法:與toString()類似,當javascript須要將一個對象轉換成字符串以外的原始類型(一般是數字)時,就須要調用它.
hasOwnProperty方法:若是對象局部定義一個非繼承的屬性,屬性名是由一個字符串實際參數指定的,那麼該方法將返回true,不然,它將返回false.如:
var o = {};
o.hasOwnProperty("undef"); // false: 沒有定義該屬性
o.hasOwnProperty("toString"); // false: toString是一個繼承屬性
Math.hasOwnProperty("cos"); // true: Math對象有cos屬性
propertyIsEnumerable()方法:若是對象定義了一個屬性,屬性名是由一個字符串實際參數指定的,並且該屬性能夠用for/in循環枚舉出來,那麼該方法返回true,不然,返回false.例如:
var o = { x:1 };
o.propertyIsEnumerable("x"); // true: property exists and is enumerable
o.propertyIsEnumerable("y"); // false: property doesn't exist
o.propertyIsEnumerable("valueOf"); // false: property is inherited
isPrototypeOf()方法:若是調用對象是實際參數指定的對象的原型對象,該方法返回true,不然返回false.該方法的用途和對象的constructor屬性類似.例如:
var o = {}
Object.prototype.isPrototypeOf(o); // true: o.constructor == Object
Object.isPrototypeOf(o); // false
o.isPrototypeOf(Object.prototype); // false
Function.prototype.isPrototypeOf(Object); // true: Object.constructor==Function
數組方法:
join():能夠把一個數組的全部元素都轉換成字符串,而後再把它們鏈接起來,你能夠指定一個可選字符串來分隔結果字符串中的元素.若是沒有指定分隔字符串,那麼可使用逗號分隔元素.
reverse():將顛倒數組元素的順序並返回顛倒後的數組.它在原數組上執行這一操做,也就是說,它並不 建立一個重排了元素的新數組,而是在已經存在的數組中對數組元素進行重排.
sort():是在原數組上對數組元素進行排序,返回排序後的數組.若是調用sort()時不傳遞給它參數,那麼它將按照字母順序對數組元素進行排序(若是必要的話,能夠暫時將元素轉成字符串以執行比較操做)
concat():能建立並返回一個數組.這個數組包含了調用concat()的原始數組的元素,其後跟隨的是concat()的參數.若是其中有些參數是數組,那麼它就將被展開,其元素將被添加到返回的數組中.可是要注意,concat()並不能遞歸地展開一個元素爲數組.
slice():返回的是指定數組是一個片斷.
splice():插入或刪除數組元素的通用方法.它在原數組上修改數組.
push()和pop():使咱們能夠像使用棧那樣來使用數組.方法push()能夠將一個或多個新元素附加到數組的尾部.而後返回數組的新長度.方法pop()偏偏相反.
unshift()和shift():與push()和pop() 很是類似,只不過它們是在數組的頭部進行元素的插入和刪除,而不是在尾部進行元素的插入和刪除.
toString()和toLocaleString():注意,在輸出的結果中,數組值的周圍沒有方括號或者其餘定界符.
數組附加:indexof()和lastIndexof(),forEach(),map(),filter()
///////////////////
對象實例:
<script>
var news ={
1:{id:101,title:'這是標題1',content:'這裏是內容1'},
2:{id:102,title:'這是標題2',content:'這裏是內容2'},
3:{id:103,title:'這是標題3',content:'這裏是內容3'},
4:{id:104,title:'這是標題4',content:'這裏是內容4'},
jingdian:{101:'AAA',102:'BBB',103:'CCC',104:'DDD'}
}
var jingdian ={
101:{1101:'天安門',1102:'地安門',1103:'東安門'},
102:{2101:'天安門2',2102:'地安門2',2103:'東安門2'},
103:{3101:'天安門3',3102:'地安門3',3103:'東安門3'}
}
for (var n in news){
if(n!='jingdian'){
document.write(n+"--"+news[n].id+"--"+news[n].title+'----'+news[n].content+'======'+get_jingdian(news[n].id)+'=========<br>');
}
}
document.write('<hr>');
document.write(news[1]['title']+'--');
document.write(news[1].title);
document.write('<hr>');
for (var J in news['jingdian']){
document.write(news['jingdian'][J]+'<br>');
}
document.write('<hr>');
function get_jingdian(id){
//document.write(id);
//alert('id:'+id);
var str='';
for (var j in jingdian){
if(j==id){
//alert(j+'----'+id);
for (j2 in jingdian[id]){
str+='<a href='+j2+'>'+jingdian[id][j2]+'('+j2+')</a> ';
}
}
}
return str;
}
</script>