日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

克隆,深拷贝,浅拷贝

發布時間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 克隆,深拷贝,浅拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

克隆/拷貝/復制

  • 它們是同個東西
  • 拷貝對象/克隆對象

淺拷貝

  • 只拷貝對象表層的屬性,引用值還是指向同個地址
  • 修改引用值會相互影響
var person1 = {name:'張三'}function clone(origin, target){var tar = target || {};for(var key in origin){if(origin.hasOwnProperty(key)){tar[key] = origin[key];}}return tar;}

深拷貝的常用方法:

1.原生遞歸遍歷拷貝
2.用JSON對象轉換的方法來拷貝, 缺點是不能拷貝方法。

var str = JSON.stringfy(obj); var obj2 = JSON.parse(str);

3.jQuery的方法

深拷貝實現

  • 向下遞歸拷貝,完全拷貝出一個新的對象
var person1 = {name:'張三',children:{first:{name:'張小一',age:18 },second:{name:'張小二',age:17}}} //深拷貝思路://首先遍歷的時候剔除prototype上面的東西//然后判斷每項是不是引用值//1. 用typeof判斷,函數類型function可直接賦值//2. 剔除null原始值打印為object的bug//引用值下,判斷是數組還是對象//如果下層還有引用對象,賦值target[key]為數組或對象,遞歸調用拷貝函數,直到都為原始值function deepClone(origin, target){var target = target || {},objStr = Object.prototype.toString,arrType = '[object Array]';for(var key in origin){if(origin.hasOwnProperty(key)){if(typeof(origin[key]) == 'object' && origin[key] != null){if(objStr.call(origin[key]) === arrType){target[key] = [];}else{target[key] = {};}deepClone(origin[key], target[key]);}else{target[key] = origin[key];}}}return target;}var person2 = deepClone(person1);person2.children.third = {name:'張小三',age:16};console.log(person2);console.log(person1);

對象屬性遍歷,this, caller, callee

鏈式操作:
sche.wakeup().morning().noon().afternoon();
實現:每個方法的最后 return this。

對象屬性遍歷:
obj.name //用.語法語法訪問obj //實際上js引擎還是會給轉成obj[‘name’]的形式,再訪問
obj[‘name’] //用中括號可訪問對象,屬性名用字符串’’ //最早的JS引擎都是括號形式訪問
字符串拼接的方式訪問對象
obj[‘No’ + num] //訪問形如No1, No2, No3此類的內容;

對象枚舉方法:
數組遍歷: for循環方法 //for(var i = 0; i < arr.length; i++){arr[i]}
(數組用for in 方法也可以)
對象遍歷: for in 方法 //for(var key in obj){car[key]}
(for in 方法會遍歷出原型鏈上的所有自定義屬性,)

為什么for in里面,car.key訪問不到?
car.key -> car[‘key’] -> 這個東西找不著,所以會返回undefined

判斷是否是對象自身屬性:只打印對象自身屬性,排除原型鏈上屬性的方法。一般使用obj.hasOwnProperty(key)來判斷。

obj.hasOwnProperty(key) //方法返回true或false,放在if(xx)里面判斷,返回true為自身的屬性,才打印。

‘displacement’ in car
//返回true或false,隱式地找car[‘displacement’]存不存在
//前面一定要字符串括起來,直接寫會報錯

A instanceof B //判斷A是否是B構造出來的

// 訪問對象不存在的屬性,返回的是undefiend// 數組是特殊的對象,數組和對象都是引用值;// 枚舉就是有一組有共同特性的數據,就是枚舉;在js中實際是對象// 枚舉 -> 遍歷;遍歷就是按順序一個個獲取信息的過程;// JavaScript中,有枚舉就一定有遍歷;

三種判斷數組的方法:
Object.prototype.toString.call(arr); //盡可能用這種方法判斷
arr instanceof Array //是否數組構造方法構造出來的 //會有一些小問題
arr.constructor
微信qq等第三方接口返回錯誤信息的方式
完整的AO
this指向問題
//全局this指向window
//預編譯函數this -> window //普通函數(沒有return this的過程)
//apply/call改變了this的指向
//構造函數的this指向實例化對象
構造函數的AO
call/apply
callee/caller
arguments.callee - 返回當前函數本身 //返回正在執行的函數本身,在哪個函數里面返回哪個函數 // 它是實參列表上的一個屬性
test2.caller - 返回調用當前函數的函數 //返回調用了test2的那個函數的函數體,這兩個嚴格模式下會報錯
立即執行函數調用自身 - arguments.callee
函數本身的屬性.length - 形參長度
– 例子:用遞歸的方式累加n
筆試題
默認傳參
bar.call() -> bar() -> bar.call(arguments) -> bar(arguments);
JS的typeof能夠返回哪些值
number, boolean, string, object(null), undefined, function

NaN考題 NaN == NaN ? 寫一個判斷NaN的函數, 實現isNaN的功能;判斷那里要轉為 res == 'NaN' {} == {}? 為什么? 怎么相等?不等于; 因為引用值對比的是地址;引用值賦值,obj1 = obj;

淺拷貝,深拷貝,對象克隆,三目運算:

模塊化開發作業 (團隊協作開發)模塊化開發window.onload = fucntion(){init();}function init(){initFb();}var initFb = (function(){// 模塊化 - 普通函數, return fun,initFb, init, onload,模塊化直接用function fb(n){if(n <= 0){return 0;}if(n <= 2){return 1;}return fb(n - 1) + fb(n - 2);}return fb;})();插件開發;(function(){// 插件化 - 自啟動,構造函數,原型,window, 插件要new一下用的var Fb = function(){}Fb.prototype.fb = function(n){if(n <= 0){return 0;}if(n <= 2){return 1;}return arguments.callee(n - 1) + arguments.callee(n -2);}window拋出去})();三目運算? : //每種語言都有 三種寫法一般: a > 0 ? console.log('大于0') //;x 三目運算是一條語句,中間不能加分號: console.log('小于0');return寫法: str = a > 0 ? '大于0' //三目運算帶有return 功能的:'小于0'; //return嵌套寫法:str = a > 0 ? (a > 3 ? '大于3': '小于等于3'): '小于等于0'; 引用值的克隆/拷貝/復制 --真正的說法是叫克隆clone指向同個存儲空間的克隆 //引用值var person1 = {name:'張三'};var person2 = person1; //p1把存儲地址的值給了p2,兩者指向的是同個存儲空間person2.name = '李四';// person1的值也會變成李四,因為 淺拷貝 //拷貝兩個獨立的對象,第一層屬性互不影響//但如果屬性里有引用值,那么修改時還是會相互影響;var person1 = {name:'張三'};var person2 = {}for(var key in person1){person2[key] = person1[key];}//此時修改p2的屬性值,p1不變;因為二者是不同的對象,只是把一層的屬性和值拷貝以一份; 寫個淺拷貝函數; -- 53min深拷貝 寫個深拷貝函數function deepClone(origin, target){var tar = target || {}, //做一下用戶體驗toStr = Object.prototype.toString,arrType = '[object Array]';for(var key in origin){if(origin.hasOwnProperty(key)){if}}}用JSON方法來深拷貝,缺點是不能拷貝方法var p1 = {name:'張三'} var str = JSON.stringify(p1); //先轉成JSON字符串var p2 = JSON.parse(str); //再把JSON字符串轉成json對象 深拷貝有哪幾種方法? - 3種JQ深拷貝方法JS原生遞歸的方法JSON的方法作業:(把答案寫出來,并寫上是什么原因)function Foo(){getName = function(){console.log(1);}return this;}Foo.getName = function(){console.log(2);}Foo.prototype.getName = function(){console.log(3);}var getName = function(){console.log(4);}function getName(){console.log(5);}Foo.getName();getName();Foo().getName();new Foo.getName();new Foo().getName();new new Foo().getName();

測試題:
用prompt接受用戶輸入年份
判斷是否是閏年? 用三目運算來做;

總結

以上是生活随笔為你收集整理的克隆,深拷贝,浅拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。