内置类型
JS一共有七种内置类型,又可以分类为基本类型和对象两大类型。
基本类型
包括string,number,boolean,null,undefined,symbol。基本类型的变量存储于栈内存中。
特性:
1.JS的number类型为浮点型,没有整型,浮点计算有可能出现bug。
2.NaN属于number类型,NaN不等于自身。
3.基本类型如果使用字面量的方式定义或赋值,那这个变量只会是个字面量,只有在必要的时候才会转换为对应的类型
let str = 'string' // 此时str只是字面量
str.toString() // 使用到string类型的内置方法时,才会转换为对象类型
对象(Object)
对象是引用类型,涉及到浅拷贝和深拷贝。对象变量的指针存储于栈内存中,对象中的数据存储与堆内存中。
浅拷贝:拷贝后的对象改变属性会导致原对象的属性改变
let objA = { name: '小明', age: 20 }
let objB = objA // 此时仅将objA的指针赋值给objB,并未在堆内存中重新开辟存储对应属性的空间,称为浅拷贝
console.log(objB.name) // 小明
objB.name = '大明'
console.log(objA.name) // 大明
深拷贝:拷贝后的对象改变属性不影响原对象
let objA = { name: '小明', age: 20 }
let objB = {} // 此时在栈内存中创建了objB的指针变量,并在堆内存中开辟了一个objB指针指向的内存空间
objB.name = objA.name // objB堆内存中增加name属性并赋值为objA.name
objB.age = objA.age
console.log(objB.name) // 小明
objB.name = '大明'
console.log(objB.name) // 大明
console.log(objA.name) // 小明
// 深拷贝方法
function deepClone(source) {
if (!source && typeof source !== 'object') {
// 非对象抛出错误
throw new Error('error arguments', 'shallowClone')
}
const targetObj = source.constructor === Array ? [] : {}
for (const keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = source[keys].constructor === Array ? [] : {}
targetObj[keys] = deepClone(source[keys])
} else {
targetObj[keys] = source[keys]
}
}
}
return targetObj
}
typeof
typeof 对于基本类型,除了 null 都可以显示正确的类型
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof b // b 没有声明,但是还会显示 undefined
未完待续…