[Javascript 高階程式設計]學習心得記錄7 引用型別(上)
js引用型別的值(物件)是引用型別的例項,引用型別和類很像但是又不是同一個東西,引用型別被稱為対象定義,描述一類物件所具有的屬性和方法。
一,object型別
object型別是js基礎原生型別,建立該型別例項有兩種方法:new和物件字面量表示法。
var person = new Object(); // var person = {}; 一個效果
person.name = "Nicholas";
person.age = 29;
物件字面量是向函式傳遞大量可選引數的首選方式。var person = { name : "Nicholas", age : 29 };
訪問也有兩種方式:person.name和person['name']。建議使用後種,可以使用變數來訪問屬性。
二,Array型別
建立方式也有兩種
var colors = new Array(3); //create an array with three items var names = new Array("Greg"); //create an array with one item, the string "Greg" alert(colors.length); alert(names.length);
而array的方法也是特別特別多,這對我們處理資料提供了很大的方便。值得注意的一點是,length屬性不是隻讀的,修改length屬性可以修改陣列長度。var colors = ["red", "blue", "green"]; //creates an array with three strings var names = []; //creates an empty array var values = [1,2,]; //AVOID! Creates an array with 2 or 3 items var options = [,,,,,]; //AVOID! creates an array with 5 or 6 items alert(colors.length); //3 alert(names.length); //0 alert(values.length); //2 (FF, Safari, Opera) or 3 (IE) alert(options.length); //5 (FF, Safari, Opera) or 6 (IE)
1.檢測陣列方法
Array.isarray()方法。雖然instanceof()方法也可以,但是有不同執行環境下,可能存在不同的Array建構函式,這個具體會在後面提到。所以推薦使用isarray()方法
2.轉換方法
所有物件都有的toLocaleString(),toString()和valueOf()方法就不說了。值得注意的是,alert()會自動調toString()方法。
有一個很實用的方法,join()。可以使用不同的分隔符來構建這個字串。這個我在日常開發的時候經常用到,非常實用。
var colors = ["red", "green", "blue"];
alert(colors.join(",")); //red,green,blue
alert(colors.join("||")); //red||green||blue
3.棧和堆方法
push(),pop(),shift()三個方法,沒什麼特別的。主要是平時要記得靈活使用,很多時候都忘了這幾個方法。
var colors = ["red", "blue"];
colors.push("brown"); //add another item
colors[3] = "black"; //add an item
alert(colors.length); //4
var item = colors.pop(); //get the last item
alert(item); //"black"
var item = colors.shift(); //get the first item
alert(item); //"red"
alert(colors.length); //1
4.重排序方法
有reverse ()翻轉陣列順序的方法,還有sort()排序方法。值得注意的一點是,sort()方法可以加一個比較函式作為引數,這樣可以自定義排序規則,其實在前面的心得3就是這個方法http://blog.csdn.net/m0_37645820/article/details/77867965,有興趣可以看看,給物件陣列排序。
function compare(value1, value2) {
if (value1 < value2) {
return 1;
} else if (value1 > value2) {
return -1;
} else {
return 0;
}
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //15,10,5,1,0
5.操作方法
主要有三個,concat()方法會建立一個當前陣列的副本,然後將接收到的引數新增到這個副本的末尾,最後返回新構建的陣列。和push()的區別就是,push操作的是陣列的本體,而concat是構成一個新的陣列,這點是值得注意的。
var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
alert(colors); //red,green,blue
alert(colors2); //red,green,blue,yellow,black,brown
slice()方法,可以基於當前陣列中的一個或者多個項,建立一個新的陣列。而不會影響原來的陣列,和concat一樣。
var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);
alert(colors2); //green,blue,yellow,purple
alert(colors3); //green,blue,yellow
splice()方法是運算元組本體的,可以刪除,插入和替換陣列的元素。返回從原始陣列中刪除的項。
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1); //remove the first item
alert(colors); //green,blue
alert(removed); //red - one item array
removed = colors.splice(1, 0, "yellow", "orange"); //insert two items at position 1
alert(colors); //green,yellow,orange,blue
alert(removed); //empty array
removed = colors.splice(1, 1, "red", "purple"); //insert two values, remove one
alert(colors); //green,red,purple,orange,blue
alert(removed); //yellow - one item array
熟練掌握這三個方法和前面的棧堆方法,基本上就可以對陣列為所欲為了。
6.位置方法
一個很簡單而且實用的方法,indexOf(),返回查詢值在陣列中的位置,找不到返回-1。值得注意的是,是按全等匹配的。
var numbers = [1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4)); //3
alert(numbers.lastIndexOf(4)); //5
alert(numbers.indexOf(4, 4)); //5
alert(numbers.lastIndexOf(4, 4)); //3
var person = { name: "Nicholas" };
var people = [{ name: "Nicholas" }];
var morePeople = [person];
alert(people.indexOf(person)); //-1
alert(morePeople.indexOf(person)); //0
7,迭代方法
js陣列有5個迭代方法,接收兩個引數:要在每一項執行的函式和執行該函式的作用域(可選)。傳入的這個函式有三個引數:陣列項的值(intem),該項在陣列的位置(index)和陣列(array)本身。
1、every(): 對陣列中的每一項執行給定的函式,如果該函式對每一項都返回true,則結果返回true。
2、filter(): 對陣列中的每一項執行給定函式,返回該函式會返回true的項組成的陣列。
3、forEach(): 對陣列中的每一項執行給定函式,這個方法沒有返回值。
4、map(): 對陣列中的每一項執行給定函式,返回每次函式呼叫的結果組成的陣列。
5、some(): 對陣列中的每一項執行給定函式,如果該函式任意一項返回true,則返回true。
根據應用場景,可以分為三種。
首先是檢驗用的every和some方法,every是陣列每項都通過才返回true,some是隻要有通過的就返回true。
var numbers = [1,2,3,4,5,4,3,2,1];
var everyResult = numbers.every(function(item, index, array){
return (item > 2);
});
alert(everyResult); //false
var someResult = numbers.some(function(item, index, array){
return (item > 2);
});
alert(someResult); //true
然後是篩選用的filter方法,返回通過的陣列元素組成的陣列。
var numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(item, index, array){
return (item > 2);
});
alert(filterResult); //[3,4,5,4,3]
最後是迴圈操作的方法,map和forEach。forEach和for迴圈的效果其實是一樣的,沒有返回值。
array.forEach(function(item, index, array)){
//執行某些操作
}
而map的區別是,map是返回一個新的陣列,不會影響原來的陣列。
var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item, index, array){
return item * 2;
});
alert(mapResult); //[2,4,6,8,10,8,6,4,2]
8. 歸併方法
js陣列提供了歸併方法,reduce()。兩個引數:一個在每一項上都呼叫的函式和作為歸併基礎的初始值(可選)。這個函式有四個引數:前一個值,當前值,項的索引和陣列本身。所以歸併實際上是從陣列的第二項開始的。對於算累加,累乘等操作很方便。
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum);//15
後面還有RegExp型別,函式型別和基本包裝型別,下次再寫。