關於JS的clone 函式編寫的一些問題

2021-08-17 05:37:11 字數 2157 閱讀 8377

問題講述:用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 ...