創建方法:
- var obj = {} 對象字面量/對象直接量
- 構造函數
- 系統自帶的函數
- 自定義(要加上new操作符)大駝峯式命名規則
構造函數的內部原理:
- 在函數體最前面隱式的加上this = {};
- 執行this.xxx = xxx
- 隱式的返回this(返回的只能是對象)
包裝類
原始值是肯定沒有屬性和方法的,隱式的創建包裝類,然後delete。再次訪問時返回undefined
var num = 4
num.len = 3
// new Number(4).len = 3 delete
// new Number(4).len
- new String()
- new Boolean()
- new Number()
判斷數據類型
- typeof()
侷限性:如果是數組、對象、方法都是返回object
- 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]);
}
}
- instanceof 運算符用於檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。
侷限性:iframe上的 [] instanceof Array // false
- 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]
}
}
}
}