對象的基本問題和一些引用場景

創建方法:

  1. var obj = {} 對象字面量/對象直接量
  2. 構造函數
  • 系統自帶的函數
  • 自定義(要加上new操作符)大駝峯式命名規則
構造函數的內部原理:
  1. 在函數體最前面隱式的加上this = {};
  2. 執行this.xxx = xxx
  3. 隱式的返回this(返回的只能是對象)

包裝類

原始值是肯定沒有屬性和方法的,隱式的創建包裝類,然後delete。再次訪問時返回undefined

var num = 4
num.len = 3
// new Number(4).len = 3  delete

// new Number(4).len
  1. new String()
  2. new Boolean()
  3. new Number()

判斷數據類型

  1. typeof()
侷限性:如果是數組、對象、方法都是返回object
  1. hasOwnProperty(沒有原型鏈上的屬性)
 var obj = {
        	name : 'chen',
        	age : '20',
        	sex : 'male',
        	height : 180,
        	__proto__ : {lastName:'deng'}
        }
        
        for(var prop in obj) {
        	if(obj.hasOwnProperty(prop)){
        		console.log(obj[prop]);
        	}
        }
  1. instanceof 運算符用於檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。
侷限性:iframe上的 [] instanceof Array // false
  1. Object.prototype.toString.call()
[“object Array”] [“object Object”]

淺拷貝

淺克隆就是將棧內存中的引用複製一份,賦給一個新的變量,本質上兩個指向堆內存中的同一地址,內容也相同,其中一個變化另一個內容也會變化(根本上改變的是同一個對象)。

// 方案1
let company = {
	name: 'duyi',
	age: 18
}
let teachDepartment = {
	leader: {
		name: 'cg',
		age: 20
	},
	personNum: 26
}

let obj = {
	...company,
	...teachDepartment
}
// 方案2
let company = {
	name: 'duyi',
	age: 18
}
let teachDepartment = {
	leader: {
		name: 'cg',
		age: 20
	},
	personNum: 26
}

let obj = Object.assign({}, company, teachDepartment)

深拷貝

// 此時適用於數據結構簡單的
let company = {
	name: 'duyi',
	age: 18
}

let leader = {
		name: 'cg',
		age: 20
}
let teachDepartment  = {
	leader: {
		...leader
	},
	personNum: 26
}

let obj = {
	...company,
	...teachDepartment
}
console.log(obj)

// 不適用reg, function 利用JSON.這時候你再修改b的值,就和a無關了。
// JSON.stringify(a)是將a轉爲json對象(json字符串)。然後JSON.parse()是將這個json對象轉爲object對象,在這個過程中會複製所有的值。並且是一個全新對象
var a = {1};
var b= JSON.parse(JSON.stringify(a));



// 第三種

function deepClone(origin, target) {
		var target = target || {},
		    toStr = object.prototype.toString,
		    arrStr = "[object Array]"
	    for (var prop in origin) {
	    	if (origin.hasOwnProperty(prop)) {
	         	// 1.判斷是否爲原始值
	    		if (typeof(origin[prop] ='object')) {
	    	     	// 2.判斷是數組還是對象
	    	     	// 3.建立相應數組或對象
    				if (toStr.call(origin[prop]) === arrStr) {
    					target[prop] = []
    				} else {
    					target[prop] = {}
    				}
    				deepClone(origin[prop], target[prop])
	    		} else {
	    			target[prop] = origin[prop]
	    		}
	    	}
	    }
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章