克隆,深拷贝,浅拷贝
克隆/拷貝/復制
- 它們是同個東西
- 拷貝對象/克隆對象
淺拷貝
- 只拷貝對象表層的屬性,引用值還是指向同個地址
- 修改引用值會相互影響
深拷貝的常用方法:
1.原生遞歸遍歷拷貝
2.用JSON對象轉換的方法來拷貝, 缺點是不能拷貝方法。
3.jQuery的方法
深拷貝實現
- 向下遞歸拷貝,完全拷貝出一個新的對象
對象屬性遍歷,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
淺拷貝,深拷貝,對象克隆,三目運算:
模塊化開發作業 (團隊協作開發)模塊化開發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接受用戶輸入年份
判斷是否是閏年? 用三目運算來做;
總結
以上是生活随笔為你收集整理的克隆,深拷贝,浅拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的浅克隆与深克隆
- 下一篇: 怎么发外链效果好