一. 基礎
1.for in,for of和forEach
遍歷的是對象的屬性,因為數組也是對象,其內部的元素的索引就是其屬性值。用該方式遍歷數組就是獲取了數組中的每一個元素的索引值(從0開始)。
而for of 則是直接遍歷集合中的元素值本身。map、set和array都屬於iterable類型的數據。都能夠用for of來遍歷:
var oMap = new Map([['anna',1],['mike',2],['betty',3]]);
for(var x of oMap){
alert(x); //輸出每一個鍵值對
}
此外,最好的方式是使用forEach,iterable類型的數據有內置的方法forEach,該方法接收一個參數。每遍歷一個元素就調用該方法一次:
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向當前元素的值
// index: 指向當前索引
// array: 指向Array對象本身
alert(element);
});
以該種方式遍歷在map類型數據中,ele相應值。index相應鍵。
注意:forEach()方法是ES5.1標准引入的,你須要測試瀏覽器是否支持。
二. 函數
1.變量聲明提升
注意提升的是聲明。也就是說通過var 聲明的變量在運行到聲明語句之前使用了該變量是不會報錯的。可是此時無法獲取該變量的值。提升的時候並沒有把賦值也提升了,該值為undefined,直到運行到該語句為這個變量賦值為止。
2.解決命名沖突的辦法
將變量和函數都放到一個命名空間中。實際上就是定義了一個空對象,全部的變量和方法都作為該對象的屬性和方法:
// 唯一的全局變量MYAPP:
var MYAPP = {};
// 其它變量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其它函數:
MYAPP.foo = function () {
return 'foo';
};
3.ES6引入了let用來聲明塊級作用域內的變量,const來聲明常量.
4.apply的使用方法
除了改動函數的作用域外(指定this值),還能夠改變已有函數的行為,即為已經提供了的函數添加新的定義,比如統計調用了多少次parseInt:
var count = 0;
var oldParseInt = parseInt; // 保存原函數
window.parseInt = function () {
count += 1;
return oldParseInt.apply(null, arguments); // 調用原函數,null表示當做普通調用,不指定this值
};
// 測試:
parseInt('10');
parseInt('20');
parseInt('30');
count; // 3
5.Array.map(function(arg){})
對數組中每一個元素調用function方法,將結果作為新的數組返回。不會改變原來的數組。
參數構成和forEach方法相似。
6.閉包
一個函數中包括了閉包,每次調用外部函數,都會生成一個新的內部函數。也就是說閉包在外部函數調用時都是新生成的。
返回閉包時牢記的一點就是:返回函數不要引用不論什么循環變量,或者興許會發生變化的變量。
假設一定要引用循環變量怎么辦?方法是再創建一個函數,用該函數的參數綁定循環變量當前的值,不管該循環變量興許怎樣更改。已綁定到函數參數的值不變:
例如以下代碼中。參數n綁定了每一個i(思考活動對象中存儲的內容包括了形參及其值,內部閉包會沿着作用域鏈找到外部馬上運行的匿名函數活動對象中存儲的變量值):
function count(){
var f_arr=[];
for(var i=1;i<=3;i++){
var rs=(function(n){
return function(){
return n*n;
}
})(i); //創建匿名函數並馬上運行
f_arr.push(rs);
}
return f_arr;
}
閉包能夠延遲運行,或者提供了一個能夠訪問到函數私有變量的入口(閉包攜帶了狀態)。
三. 標准對象
1.JSON
- 把一個JavaScript對象轉換成JSON對象:
JSON.stringify(JSobj,replacer,spliter)
replacer(key,value)能夠是數組,數組中的元素是轉換時要保留的JS對象的屬性。也能夠是一個函數,該函數對JS對象中的鍵值做了某些處理后返回。spliter是轉換后的縮進等切割。
比如:
function convert(key, value) {
if (typeof value === 'string') {
return value.toUpperCase();
}
return value;
}
var xiaoJson=JSON.stringify(xiaoming, convert, ' ');
JSON對象反序列化為JS對象:
function addClassmate(key, value){
if(key=="name"){
return value+"同學";
}
return value;
}
var xiaoObj=JSON.parse(xiaoJson,addClassmate);
2.Date對象
data對象中月份是從0開始的,也就是0表示一月。
