問(wèn)題描述: 這樣的問(wèn)題發(fā)生于兩個(gè)頁(yè)面通過(guò)iframe互相值碴巾,子頁(yè)面把對(duì)象傳遞給了父頁(yè)面溯捆,同時(shí)子頁(yè)面關(guān)閉,之后厦瓢,父頁(yè)面依舊使用了保存了子頁(yè)面的對(duì)象的變量现使。
注意: 這時(shí),父頁(yè)面上保存的其實(shí)是子頁(yè)面的變量的指針旷痕,并不是實(shí)際數(shù)據(jù),所以顽冶,由于子頁(yè)面的關(guān)閉欺抗,從而導(dǎo)致了指針的缺失,拋出異常强重。
解決方法: 對(duì)傳值對(duì)象進(jìn)行拷貝绞呈,類(lèi)似于Java中的clone
代碼
function deepClone(source) {
var clone = {};
if(typeof source == 'object') {
if (Object.prototype.toString.call(source) === '[object Array]') {
clone = new Array();
for(var i = 0; i < source.length; i++) {
clone.push(deepClone(source[i]));
}
} else {
for (var key in source) {
if (typeof source[key] == 'object') {
if (Object.prototype.toString.call(source) === '[object Array]') {
clone[key] = new Array();
for(var i = 0; i < source[key].length; i++) {
clone[key].push(deepClone(source[key][i]));
}
} else {
clone[key] = deepClone(source[key]);
}
} else {
clone[key] = source[key];
}
}
}
} else {
clone = source;
}
return clone;
}
是否為數(shù)組,有以下方法判斷:
- instanceof
var arr = new Array();
arr instanceof Array; // true
- constructor
var arr = new Array();
arr.constructor === Array; // true
3.特性判斷法
var arr = new Array();
arr. propertyIsEnumerable('length'); // true
4.最簡(jiǎn)單粗暴的方法
var arr = new Array();
arr.prototype.toString.call(o) === '[object Array]'; // true
需要注意的是 在判斷是否是數(shù)組類(lèi)型的時(shí)候
使用instaceof和construcor,被判斷的array必須是在當(dāng)前頁(yè)面聲明的间景!比如佃声,一個(gè)頁(yè)面(父頁(yè)面)有一個(gè)框架,框架中引用了一個(gè)頁(yè)面(子頁(yè)面)倘要,在子頁(yè)面中聲明了一個(gè)array圾亏,并將其賦值給父頁(yè)面的一個(gè)變量十拣,這時(shí)判斷該變量,Array == object.constructor;會(huì)返回false志鹃;
原因:
1夭问、array屬于引用型數(shù)據(jù),在傳遞過(guò)程中曹铃,僅僅是引用地址的傳遞缰趋。
2、每個(gè)頁(yè)面的Array原生對(duì)象所引用的地址是不一樣的陕见,在子頁(yè)面聲明的array秘血,所對(duì)應(yīng)的構(gòu)造函數(shù),是子頁(yè)面的Array對(duì)象评甜;父頁(yè)面來(lái)進(jìn)行判斷灰粮,使用的Array并不等于子頁(yè)面的Array;切記蜕着,不然很難跟蹤問(wèn)題谋竖!