创建方法:
- 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]
}
}
}
}