問題講述:用js 實現乙個clone()轉殖函式,該函式會把輸入進去的不同型別值number,string,undefined,boolean,function,null,object,array,regexp,轉殖乙份出來
直接貼**,
function clone(obj)
else if(tostring.call(obj) === '[object regexp]')
else
;for(var j in obj)
copy[j]= clone(obj[j]);}}
return copy;
}var a=undefined;
var b=1;
var c="hello";
var d=true;
var add=function(a,b)
var e=null;
var f=[1,2,3];
var g=/^\s+/;
var h=
console.log(typeof clone(a));
console.log(typeof clone(b));
console.log(typeof clone(c));
console.log(typeof clone(d));
console.log(clone(add)(1,2));
console.log(object.prototype.tostring.call(clone(e)));
console.log(object.prototype.tostring.call(clone(f)));
console.log(object.prototype.tostring.call(clone(g)));
console.log(object.prototype.tostring.call(clone(h)));
結果:
一開始看到這個問題的時候,就想到typeof [1,2,3]的結果是
那為什麼不直接用obj.tostring()呢?我們先來看看obj.tostring()會輸出什麼?
null和undefined居然出錯了,這是肯定的,因為tostring()不可完成null和undefined的轉型,用string()才可以
若string()轉換的不是null或者undefined,則自動轉換為tostring().扯遠了。。我們說回正題
那麼用object.prototype.tostring.call(obj)的結果是什麼呢?
居然不一樣,這是怎麼回事?
原來,雖然array,null等型別雖然是object的例項,但是他們各自都重寫了tostring()方法,我們試著來驗證一下:
var arr=[1,2,3];
console.log(array.prototype.hasownproperty("tostring"));//判斷原型中是否有tostring()方法
console.log(arr.tostring());
delete array.prototype.tostring;//刪除array原型裡面重寫的tostring
console.log(array.prototype.hasownproperty("tostring"));
console.log(arr.tostring());
結果:
很明顯真的被改寫了。
其實有人會說可以用arr instanceof array來判斷是否為陣列,其實instanceof在跨frame物件構建的場景下會失效。
關於JS的clone 函式編寫的一些問題
問題講述 用js 實現乙個clone 轉殖函式,該函式會把輸入進去的不同型別值number,string,undefined,boolean,function,null,object,array,regexp,轉殖乙份出來 直接貼 function clone obj else if tostrin...
關於ArrayList的clone方法隨筆
arraylist有淺clone與深clone之分 一,淺clone 其還是和clone的物件一樣,指向同乙個記憶體,如果被clone的物件內的值發生了變化,那麼clone的物件內的值也會隨之發生變化,因為,他們是共享乙個堆記憶體 淺clone示例如下 原始物件 arraylistlist new ...
關於JS 函式this的用法
在js中寫函式時,很多用到this.this究竟是什麼,this是個關鍵字,是個指標,指向執行環境作用域,也稱之為上下文。先說下函式吧,個人理解是函式是在語言中重複呼叫的 塊.在js裡,把函式賦值給物件的屬性時,稱之為方法 如 var m m.title title m.show function ...