欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用js實現(xiàn)復制功能

 更新時間:2022年08月23日 10:38:42   作者:@Junean  
這篇文章主要為大家詳細介紹了使用js實現(xiàn)復制功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了使用js實現(xiàn)復制功能的具體代碼,供大家參考,具體內(nèi)容如下

復制

1.遍歷復制(for in)

特征:不修改引用關系(原來的屬性還在),僅能復制字符屬性,Symbol不能復制,不可枚舉屬性不能復制,原型鏈不能復制。淺復制

2.JOSN.parse(JSON.stringify(obj)) 轉(zhuǎn)換復制

特征:修改引用關系(相當于創(chuàng)建一個新的對象,不再擁有原來的屬性),僅能復制字符屬性,Symbol不能復制,不可枚舉屬性不能復制,原型鏈不能復制,函數(shù)和其他類型不能復制。深復制

3.{…obj}解構賦值復制

特征:修改引用關系,Symbol和函數(shù)都能復制,不可枚舉屬性和原型鏈都不能復制。淺復制

4.Object.assign()對象復制

特征:不修改引用關系,可以復制屬性、方法、Symbol類型,不可枚舉屬性和原型鏈都不能復制。淺復制

深復制**

1.使用defineProperty***

function cloneObject(source,target){
? ? if(source === null||source === undefined) return source;
? ? if(source===document) return;
? ? //判斷target是不是繼承對象的實例,是不是引用類型(null,undefined,Boolean,string,number都不是引用類型)
? ? if(!Object.prototype.isPrototypeOf(target)){
? ? ? ? //判斷源對象是不是dom元素
? ? ? ? if(HTMLElement.prototype.isPrototypeOf(source)){
? ? ? ? ? ? //創(chuàng)建dom元素
? ? ? ? ? ? ?target = document.createElement(source.nodeName);
? ? ? ? }else if(source.constructor === RegExp){
? ? ? ? ? ? // 任何正則表達式都有source和flags,source是正則內(nèi)容,flags是正則修飾符
? ? ? ? ? ? // 因為這兩個屬性都是只讀屬性,不能寫入,必須通過構造函數(shù)創(chuàng)建時帶入
? ? ? ? ? ? target = new RegExp(source.source,source.flags);
? ? ? ? }else if(source.constructor === Date){
? ? ? ? ? ? // 日期對象在創(chuàng)建的對象中將原有的日期對象放入,可以讓當前日期對象變?yōu)樵腥掌趯ο蟮闹?,但是沒有引用關系
? ? ? ? ? ? targer = new Date(source);
? ? ? ? }else if(source.constructor === Function){
? ? ? ? ? ? // 復制函數(shù),通過正則表達式將函數(shù)中的參數(shù)以及函數(shù)體內(nèi)容提取到數(shù)組中,然后通過new Function()創(chuàng)建
? ? ? ? ? ? var arr = source.toString().replace(/\n|\r/g,"").trim().match(/\((.*?)\)\s*\{(.*)\}/).slice(1);
? ? ? ? ? ? target = new Function(arr[0].trim(),arr[1]);
? ? ? ? }else if(source.constructor === Set){
? ? ? ? ? ? // set類型,在處理時,new Set時可以帶入數(shù)組,因此我們將原有set的列表強轉(zhuǎn)為數(shù)組,并且將這個強轉(zhuǎn)后的數(shù)組復制給新數(shù)組
? ? ? ? ? ? target = new Set(cloneObject(Array.from(source.values())));
? ? ? ? }else if(source.constructor === Map){
? ? ? ? ? ? target = new Map();
? ? ? ? ? ? // 如果是map類型,遍歷map中每個元素
? ? ? ? ? ? for(var [key,value] of source.entries()){
? ? ? ? ? ? ? ? // 如果key是引用類型,
? ? ? ? ? ? ? ? if(Object.prototype.isPrototypeOf(key)){
? ? ? ? ? ? ? ? ? ? ?// 如果value引用類型,則將key和value分別做復制,并且將返回的結(jié)果放在map中
? ? ? ? ? ? ? ? ? ? if(Object.prototype.isPrototypeOf(value)){
? ? ? ? ? ? ? ? ? ? ? ? target.set(cloneObject(key),cloneObject(value));
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? ?//如果value不是引用類型,只將key復制,并且放入map
? ? ? ? ? ? ? ? ? ? ? ? target.set(cloneObject(key),value);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? // 這是key不是引用類型時
? ? ? ? ? ? ? ? ? ? if(Object.prototype.isPrototyeOf(value)){
? ? ? ? ? ? ? ? ? ? ? ? target.set(key,cloneObject(value));
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? target.set(key,value);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else{
? ? ? ? //除了null和undefined,其他類型都有constructor。任何對象的constructor都是它的類型,利用其constructor創(chuàng)建對象
? ? ? ? //通過對象類型的反射創(chuàng)建新的同類型對象
? ? ? ? ? ? target = new source.constructor();
? ? ? ? }
? ? ? ??
? ? }
? ? //獲取對象的所有字符屬性名和Symbol屬性名的數(shù)組
? ? var names = Object.getOwnPropertyName(source).concat(Object.getOwnPropertySymbols(source));
? ? for(var i = 0;i < names.lenght; i++){
? ? ? ? // 如果當前復制的是函數(shù),并且這個函數(shù)的屬性是prototype,那么這個屬性不復制,否則會死循環(huán)
? ? ? ? if(source.constructor === Function&&names[i] === "prototype")
? ? ? ? ? ? continue;
? ? ? ? // 獲取當前屬性名的描述對象
? ? ? ? var desc = Object.getOwnPropertyDescriptor(source,names[i]);
? ? ? ? // ? 這個描述對象的值如果是引用類型
? ? ? ? if(Object.prototype.isPrototypeOf(desc.value)){
? ? ? ? ? ? ?// 根據(jù)需要將源對象的描述內(nèi)容設置給當前目標對象相同屬性名的描述內(nèi)容,及值付為剛才創(chuàng)建相同類型的對象
? ? ? ? ? ? Object.defineProperty(target,names[i],{
? ? ? ? ? ? ? ? enumerable:desc.enumerable,
? ? ? ? ? ? ? ? configurable:desc.configurable,
? ? ? ? ? ? ? ? writable:desc.writable,
? ? ? ? ? ? ? ? value:cloneObject(desc.value)
? ? ? ? ? ? });
? ? ? ? }else{
? ? ? ? ? ? ?//如果描述的對象的值不是引用類型,直接將描述對象設置給目標對象的這個屬性
? ? ? ? ? ? Object.defineProperty(target,names.desc);
? ? ? ? }
? ? }
? ? return target;
}


//原型.isPrototypeOf(對象)。對象里面是不是擁有xx的原型
//反射:通過對象

2.使用JSON對象實現(xiàn)深復制

使用**JSON.parse(str)**可以將字符串轉(zhuǎn)換成對象;

使用**JSON.stringify(obj)**將對象轉(zhuǎn)換成對象形式的字符串,其中無法轉(zhuǎn)換對象中的方法,可以考慮先將對象中的方法使用toString()轉(zhuǎn)為字符串,然后再轉(zhuǎn)換使用JSON.stringify(obj);

*使用**JSON.parse(str)**可以將字符串轉(zhuǎn)換成對象

var obj={
? ? a:1,
? ? b:3,?? ?//ab復制不會隨其中一個的變化而變化
? ? c:{?? ??? ?//c復制會隨其中一個的變化而變化,因為c屬于對象的地址引用關系
? ? ? ? d:10,
? ? ? ? e:20
? ? }
};
var o1 = JSON.parse(JSON.stringify(obj)); //將obj復制給o1

3.使用遞歸實現(xiàn)深復制

結(jié)構僅限于對象。如果存在數(shù)組、正則、日期對象、dom對象則不能使用。

var obj = {
a:1,
b:2,
c:{
?? ??? ?a:1,
? b:2,
? c:{
?? ??? ??? ?a:1,
? ? ? b:2,
? ? ? }
}
}
//函數(shù)定義參數(shù)時,注意必要參數(shù)寫在前面,非必要參數(shù)寫在后面
function cloneObj(source,target){
?? ?if(target === undefined) target = {};
for(var prop in source){
? //如果
?? ??? ?if(typeof source[prop] === "object" && source[prop] != null){
? ? ? target[prop] = {};
? ? ? cloneObj(source[prop],target[prop]);
? }else{
?? ??? ??? ?target[prop] = source[prop];
? }
}
return target;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • localResizeIMG先壓縮后使用ajax無刷新上傳(移動端)

    localResizeIMG先壓縮后使用ajax無刷新上傳(移動端)

    隨著技術的發(fā)展,移動設備像素越來越高,但是這么大的圖片怎么上傳呢?下面小編就給大家一起學習移動端圖片上傳的方法之localResizeIMG先壓縮后使用ajax無刷新上傳,需要的朋友可以參考下
    2015-08-08
  • 使用JS實現(xiàn)圖片輪播的實例(前后首尾相接)

    使用JS實現(xiàn)圖片輪播的實例(前后首尾相接)

    下面小編就為大家?guī)硪黄褂肑S實現(xiàn)圖片輪播的實例(前后首尾相接)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 整理Javascript基礎語法學習筆記

    整理Javascript基礎語法學習筆記

    整理Javascript基礎語法學習筆記,之前一系列的文章是跟我學習Javascript,本文就是進一步學習javascript基礎語法,希望大家繼續(xù)關注
    2015-11-11
  • javascript使用appendChild追加節(jié)點實例

    javascript使用appendChild追加節(jié)點實例

    這篇文章主要介紹了javascript使用appendChild追加節(jié)點的方法,實例分析了appendChild()函數(shù)增加結(jié)點的使用技巧,需要的朋友可以參考下
    2015-01-01
  • JavaScript前后端JSON使用方法教程

    JavaScript前后端JSON使用方法教程

    這篇文章主要給大家介紹了關于JavaScript前后端JSON使用方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Javascript 數(shù)組添加 shuffle 方法的實現(xiàn)代碼

    Javascript 數(shù)組添加 shuffle 方法的實現(xiàn)代碼

    PHP 里面有個非常方便的打亂數(shù)組的函數(shù) shuffle() ,這個功能在許多情況下都會用到,但 javascript 的數(shù)組卻沒有這個方法,沒有不要緊,可以擴展一個,自己動手,豐衣足食嘛。
    2009-09-09
  • javascript實現(xiàn)編寫網(wǎng)頁版計算器

    javascript實現(xiàn)編寫網(wǎng)頁版計算器

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)編寫網(wǎng)頁版計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JavaScript實現(xiàn)單擊網(wǎng)頁任意位置打開新窗口與關閉窗口的方法

    JavaScript實現(xiàn)單擊網(wǎng)頁任意位置打開新窗口與關閉窗口的方法

    這篇文章主要介紹了JavaScript實現(xiàn)單擊網(wǎng)頁任意位置打開新窗口與關閉窗口的方法,涉及javascript窗口的相關操作函數(shù)與使用技巧,需要的朋友可以參考下
    2017-09-09
  • PixiJS學習之如何實現(xiàn)文字的繪制

    PixiJS學習之如何實現(xiàn)文字的繪制

    PixiJS是一個開源的基于web的渲染系統(tǒng),為游戲、數(shù)據(jù)可視化和其他圖形密集型項目提供了極快的性能。這篇文章主要帶大家學習一下PixiJS是如何實現(xiàn)文字繪制的,希望對大家有所幫助
    2023-02-02
  • 關于數(shù)據(jù)與后端進行交流匹配(點亮星星)

    關于數(shù)據(jù)與后端進行交流匹配(點亮星星)

    這篇文章主要介紹了關于數(shù)據(jù)與后端進行交流匹配(點亮星星) 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08

最新評論