最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用js實(shí)現(xiàn)復(fù)制功能

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

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

復(fù)制

1.遍歷復(fù)制(for in)

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

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

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

3.{…obj}解構(gòu)賦值復(fù)制

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

4.Object.assign()對(duì)象復(fù)制

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

深復(fù)制**

1.使用defineProperty***

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


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

2.使用JSON對(duì)象實(shí)現(xiàn)深復(fù)制

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

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

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

var obj={
? ? a:1,
? ? b:3,?? ?//ab復(fù)制不會(huì)隨其中一個(gè)的變化而變化
? ? c:{?? ??? ?//c復(fù)制會(huì)隨其中一個(gè)的變化而變化,因?yàn)閏屬于對(duì)象的地址引用關(guān)系
? ? ? ? d:10,
? ? ? ? e:20
? ? }
};
var o1 = JSON.parse(JSON.stringify(obj)); //將obj復(fù)制給o1

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

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

var obj = {
a:1,
b:2,
c:{
?? ??? ?a:1,
? b:2,
? c:{
?? ??? ??? ?a:1,
? ? ? b:2,
? ? ? }
}
}
//函數(shù)定義參數(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;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • JavaScript 開發(fā)工具webstrom使用指南

    JavaScript 開發(fā)工具webstrom使用指南

    本文給大家推薦了一款非常熱門的javascript開發(fā)工具webstrom,著重介紹了webstrom的特色功能、設(shè)置技巧、使用心得以及快捷鍵匯總,非常的全面。
    2014-12-12
  • js代碼實(shí)現(xiàn)輪播圖

    js代碼實(shí)現(xiàn)輪播圖

    這篇文章主要為大家詳細(xì)介紹了js代碼實(shí)現(xiàn)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 基于JS快速實(shí)現(xiàn)導(dǎo)航下拉菜單動(dòng)畫效果附源碼下載

    基于JS快速實(shí)現(xiàn)導(dǎo)航下拉菜單動(dòng)畫效果附源碼下載

    這是一個(gè)帶變形動(dòng)畫特效的下拉導(dǎo)航菜單特效。該導(dǎo)航菜單在菜單項(xiàng)之間切換時(shí),下拉菜單會(huì)快速的根據(jù)菜單內(nèi)容的大小來動(dòng)態(tài)變形,顯示合適的下拉菜單大小,效果非常棒,對(duì)導(dǎo)航下拉菜單效果感興趣的朋友一起通過本文學(xué)習(xí)吧
    2016-10-10
  • CSS(js)限制頁面顯示的文本字符長(zhǎng)度

    CSS(js)限制頁面顯示的文本字符長(zhǎng)度

    限制頁面顯示的字符長(zhǎng)度,一直被眾多網(wǎng)友傾睬,本人也是一fans利用閑暇時(shí)間搜集整理了一些實(shí)用技巧,需要了解的朋友可以參考下
    2012-12-12
  • Mint-UI時(shí)間組件起始時(shí)間問題及時(shí)間插件使用

    Mint-UI時(shí)間組件起始時(shí)間問題及時(shí)間插件使用

    這篇文章主要介紹了Mint-UI時(shí)間組件起始時(shí)間問題的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • JavaScript生成二維數(shù)組的多種方法小結(jié)

    JavaScript生成二維數(shù)組的多種方法小結(jié)

    我經(jīng)常在面試中問候:你能用?JavaScript?生成一個(gè)二維數(shù)組嗎?這個(gè)問題看似簡(jiǎn)單,實(shí)際上卻能揭示出面試者對(duì)?JavaScript?的熟練程度,天,就讓我們一起來探索這個(gè)問題背后的答案,揭開生成二維數(shù)組的多種秘密,需要的朋友可以參考下
    2024-04-04
  • 詳解JavaScript運(yùn)算符中==和===的區(qū)別

    詳解JavaScript運(yùn)算符中==和===的區(qū)別

    在JavaScript中==運(yùn)算符和===運(yùn)算符是經(jīng)常遇到的,那么二者有哪些區(qū)別呢,本文就來和大家進(jìn)行簡(jiǎn)單的討論,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2023-05-05
  • 真見識(shí)了-全代碼編寫的圖片

    真見識(shí)了-全代碼編寫的圖片

    真見識(shí)了-全代碼編寫的圖片...
    2007-08-08
  • 微信小程序?qū)崿F(xiàn)底部彈出框

    微信小程序?qū)崿F(xiàn)底部彈出框

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)底部彈出框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 按鈕JS復(fù)制文本框和表格的代碼

    按鈕JS復(fù)制文本框和表格的代碼

    有時(shí)候我們需要復(fù)制一個(gè)框的內(nèi)容或者整個(gè)表格,一般的操作很可能造成一些不方便,一是操作步驟較為復(fù)制,一是復(fù)制表格的時(shí)候容易復(fù)制不完整或者格式出錯(cuò)。
    2011-04-04

最新評(píng)論

崇仁县| 双柏县| 寿阳县| 金湖县| 营口市| 钟山县| 珠海市| 永昌县| 乌兰县| 老河口市| 随州市| 普格县| 黔江区| 花莲县| 明光市| 嘉峪关市| 黄冈市| 汝城县| 额敏县| 永靖县| 普兰店市| 鹿邑县| 合作市| 驻马店市| 北安市| 安新县| 永和县| 镇赉县| 舟山市| 庐江县| 巴林左旗| 平武县| 家居| 彭水| 昆明市| 千阳县| 宜良县| 通道| 宾川县| 永定县| 满洲里市|