一、基本数据类型
基本数据类型:String、Number、Boolean、Null、Undefined、Symbol
基本数据类型存储在栈内,存储结构如下:
- String 字符串(String)是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。字符串的索引从零开始:第一个字符的位置是0,第二个字符的位置是1,以此类推。空字符串长度为0.
- Number Js中不区分整数值和浮点数值,所有数字均用浮点数值表示。
- Boolean 布尔值(Boolean)指代真或假、开或关、是或否。这个类型只有两个值,保留字true和false.
- Null null表示一个特殊值,常用来描述”空值“。对Null执行typeof运算,结果返回字符串“object”,可以将null认为是一个特殊的对象值,含义是“非对象”,它可以表示数字、字符串和对象是“无值”的。
- Undefined 表明变量没有初始化,如果要查询对象属性或数组元素的值时返回Undefined则说明这个属性或元素不存在。如果函数没有retrun任何值,则返回undefined。undefined时预定义的全局变量.
- Symbol
二、引用类型
引用类型:Object、Function、Array、Date
引用类型存储在栈和堆内,存储结构如下:
三、typeof判断数据类型
let a;//undefined
const b=100;//number
const c="javascript";//string
const d=true;//boolean
const e=Symbol("symbol");//Symbol
const f={"name":"xm","age":24};//object
const g=[1,2,3,4,5];//array
const h=function(){};//function
const i=null;//null
console.log(typeof(a));//undefined --> undefined
console.log(typeof(b));//number --> number
console.log(typeof(c));//string --> string
console.log(typeof(d));//boolean --> boolean
console.log(typeof(e));//symbol --> symbol
console.log(typeof(f));//object --> object
console.log(typeof(g));//array --> object
console.log(typeof(h));//function --> function
console.log(typeof(i));//null --> object
四、浅拷贝与深拷贝
4.1 浅拷贝
浅拷贝时obj2指向与obj1同样的堆内存地址,因此obj2的属性改变时,obj1同样也会改变。
const obj1 = {
age: 20,
name: 'xiaomin',
address: {
city: 'haerbin'
},
arr: ['a', 'b', 'c']
}
const obj2 = obj1;
obj2.address.city = 'chengdu';
console.log(obj1.address.city);//chengdu
console.log(obj2.address.city);//chengdu
4.2 深拷贝
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
//obj 不是对象或数组,不需要深拷贝,直接返回
return obj;
}
//初始化返回结果
let result;
if (obj instanceof Array) {
result = [];
} else {
result = {};
}
for (let key in obj){
//保证 Key 不是原型的属性
if(obj.hasOwnProperty(key)){
//递归调用
result[key]=deepClone(obj[key])
}
}
return result;
}
const obj1 = {
age: 20,
name: 'xiaomin',
address: {
city: 'haerbin'
},
arr: ['a', 'b', 'c']
}
const obj2 = obj1;
obj2.address.city = 'chengdu';
const obj3 = deepClone(obj1);
obj3.address.city='beijing';
console.log(obj1.address.city);//chengdu
console.log(obj2.address.city);//chengdu
console.log(obj3.address.city);//beijing
五、数据类型转换
5.1== 和 ===
//除了 == null之外,其他都一律用===,例如:
const obj={x:100};
if(obj.a == null){ }
//相当于:
//if (obj.a === null || obj.a === undefined){ }