克隆,深拷贝,浅拷贝
克隆/拷貝/復(fù)制
- 它們是同個(gè)東西
- 拷貝對(duì)象/克隆對(duì)象
淺拷貝
- 只拷貝對(duì)象表層的屬性,引用值還是指向同個(gè)地址
- 修改引用值會(huì)相互影響
深拷貝的常用方法:
1.原生遞歸遍歷拷貝
2.用JSON對(duì)象轉(zhuǎn)換的方法來拷貝, 缺點(diǎn)是不能拷貝方法。
3.jQuery的方法
深拷貝實(shí)現(xiàn)
- 向下遞歸拷貝,完全拷貝出一個(gè)新的對(duì)象
對(duì)象屬性遍歷,this, caller, callee
鏈?zhǔn)讲僮?#xff1a;
sche.wakeup().morning().noon().afternoon();
實(shí)現(xiàn):每個(gè)方法的最后 return this。
對(duì)象屬性遍歷:
obj.name //用.語法語法訪問obj //實(shí)際上js引擎還是會(huì)給轉(zhuǎn)成obj[‘name’]的形式,再訪問
obj[‘name’] //用中括號(hào)可訪問對(duì)象,屬性名用字符串’’ //最早的JS引擎都是括號(hào)形式訪問
字符串拼接的方式訪問對(duì)象
obj[‘No’ + num] //訪問形如No1, No2, No3此類的內(nèi)容;
對(duì)象枚舉方法:
數(shù)組遍歷: for循環(huán)方法 //for(var i = 0; i < arr.length; i++){arr[i]}
(數(shù)組用for in 方法也可以)
對(duì)象遍歷: for in 方法 //for(var key in obj){car[key]}
(for in 方法會(huì)遍歷出原型鏈上的所有自定義屬性,)
為什么for in里面,car.key訪問不到?
car.key -> car[‘key’] -> 這個(gè)東西找不著,所以會(huì)返回undefined
判斷是否是對(duì)象自身屬性:只打印對(duì)象自身屬性,排除原型鏈上屬性的方法。一般使用obj.hasOwnProperty(key)來判斷。
obj.hasOwnProperty(key) //方法返回true或false,放在if(xx)里面判斷,返回true為自身的屬性,才打印。
‘displacement’ in car
//返回true或false,隱式地找car[‘displacement’]存不存在
//前面一定要字符串括起來,直接寫會(huì)報(bào)錯(cuò)
A instanceof B //判斷A是否是B構(gòu)造出來的
// 訪問對(duì)象不存在的屬性,返回的是undefiend// 數(shù)組是特殊的對(duì)象,數(shù)組和對(duì)象都是引用值;// 枚舉就是有一組有共同特性的數(shù)據(jù),就是枚舉;在js中實(shí)際是對(duì)象// 枚舉 -> 遍歷;遍歷就是按順序一個(gè)個(gè)獲取信息的過程;// JavaScript中,有枚舉就一定有遍歷;三種判斷數(shù)組的方法:
Object.prototype.toString.call(arr); //盡可能用這種方法判斷
arr instanceof Array //是否數(shù)組構(gòu)造方法構(gòu)造出來的 //會(huì)有一些小問題
arr.constructor
微信qq等第三方接口返回錯(cuò)誤信息的方式
完整的AO
this指向問題
//全局this指向window
//預(yù)編譯函數(shù)this -> window //普通函數(shù)(沒有return this的過程)
//apply/call改變了this的指向
//構(gòu)造函數(shù)的this指向?qū)嵗瘜?duì)象
構(gòu)造函數(shù)的AO
call/apply
callee/caller
arguments.callee - 返回當(dāng)前函數(shù)本身 //返回正在執(zhí)行的函數(shù)本身,在哪個(gè)函數(shù)里面返回哪個(gè)函數(shù) // 它是實(shí)參列表上的一個(gè)屬性
test2.caller - 返回調(diào)用當(dāng)前函數(shù)的函數(shù) //返回調(diào)用了test2的那個(gè)函數(shù)的函數(shù)體,這兩個(gè)嚴(yán)格模式下會(huì)報(bào)錯(cuò)
立即執(zhí)行函數(shù)調(diào)用自身 - arguments.callee
函數(shù)本身的屬性.length - 形參長度
– 例子:用遞歸的方式累加n
筆試題
默認(rèn)傳參
bar.call() -> bar() -> bar.call(arguments) -> bar(arguments);
JS的typeof能夠返回哪些值
number, boolean, string, object(null), undefined, function
淺拷貝,深拷貝,對(duì)象克隆,三目運(yùn)算:
模塊化開發(fā)作業(yè) (團(tuán)隊(duì)協(xié)作開發(fā))模塊化開發(fā)window.onload = fucntion(){init();}function init(){initFb();}var initFb = (function(){// 模塊化 - 普通函數(shù), 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;})();插件開發(fā);(function(){// 插件化 - 自啟動(dòng),構(gòu)造函數(shù),原型,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拋出去})();三目運(yùn)算? : //每種語言都有 三種寫法一般: a > 0 ? console.log('大于0') //;x 三目運(yùn)算是一條語句,中間不能加分號(hào): console.log('小于0');return寫法: str = a > 0 ? '大于0' //三目運(yùn)算帶有return 功能的:'小于0'; //return嵌套寫法:str = a > 0 ? (a > 3 ? '大于3': '小于等于3'): '小于等于0'; 引用值的克隆/拷貝/復(fù)制 --真正的說法是叫克隆clone指向同個(gè)存儲(chǔ)空間的克隆 //引用值var person1 = {name:'張三'};var person2 = person1; //p1把存儲(chǔ)地址的值給了p2,兩者指向的是同個(gè)存儲(chǔ)空間person2.name = '李四';// person1的值也會(huì)變成李四,因?yàn)?淺拷貝 //拷貝兩個(gè)獨(dú)立的對(duì)象,第一層屬性互不影響//但如果屬性里有引用值,那么修改時(shí)還是會(huì)相互影響;var person1 = {name:'張三'};var person2 = {}for(var key in person1){person2[key] = person1[key];}//此時(shí)修改p2的屬性值,p1不變;因?yàn)槎呤遣煌膶?duì)象,只是把一層的屬性和值拷貝以一份; 寫個(gè)淺拷貝函數(shù); -- 53min深拷貝 寫個(gè)深拷貝函數(shù)function deepClone(origin, target){var tar = target || {}, //做一下用戶體驗(yàn)toStr = Object.prototype.toString,arrType = '[object Array]';for(var key in origin){if(origin.hasOwnProperty(key)){if}}}用JSON方法來深拷貝,缺點(diǎn)是不能拷貝方法var p1 = {name:'張三'} var str = JSON.stringify(p1); //先轉(zhuǎn)成JSON字符串var p2 = JSON.parse(str); //再把JSON字符串轉(zhuǎn)成json對(duì)象 深拷貝有哪幾種方法? - 3種JQ深拷貝方法JS原生遞歸的方法JSON的方法作業(yè):(把答案寫出來,并寫上是什么原因)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();測(cè)試題:
用prompt接受用戶輸入年份
判斷是否是閏年? 用三目運(yùn)算來做;
總結(jié)
以上是生活随笔為你收集整理的克隆,深拷贝,浅拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的浅克隆与深克隆
- 下一篇: 怎么发外链效果好