基本数据类型与引用数据类型、深拷贝与浅拷贝

一、基本数据类型

1. Number 数字类型

  • 包括整数和浮点数
  • 特殊值NaN:即Not a Number , 不是一个数字。在类型转换失败时,通常会得到一个NaN,NaN与任何值都不相等,包括NaN本身
    Number("aaa")  // NaN
    NaN != NaN
    
  • 数值类型转换
    • Number() 将非数值转换为数值类型
    • parseInt() 将数字取整
    • parseFloat() 转换为浮点数
    • toFixed() 方法可把 Number 四舍五入为指定小数位数的数字
      var num = 4.12345;
      console.log(num.toFixed())   // 4
      
  • isNaN 判断是否是数字类型,如果 num 是一个空串或是一个空格,isNaN 是作为数字0处理的
  • ES 6 增加了以下两个 Number 对象的方法:
    • Number.isInteger(): 用来判断给定的参数是否为整数,整数返回true
    • Number.isSafeInteger(): 判断传入的参数值是否是一个"安全整数"。
      安全整数范围为 -(253 - 1)到 253 - 1 之间的整数,包含 -(253 - 1)和 253 - 1

2. String 字符串类型

  • 字符串必须包含在单引号或双引号中
  • 字符串必须在一行内表示,换行表示是不允许的,会报错 在这里插入图片描述
  • 如果要换行显示字符串,可以在字符串中添加换行符\n
    在这里插入图片描述

3. Boolean 布尔类型

  • 布尔值只有两个值:true 或 false
  • 使用 Boolean() 函数可以强制转换值为布尔值。
  • undefined、null、""、0、NaN 和 false 这 6 个转换为布尔值时为 false,其他任何类型的数据转换为布尔值时都是 true。
console.log(Boolean(0));   //false
console.log(Boolean(NaN));  //false
console.log(Boolean(null));  //false
console.log(Boolean(""));  //false
console.log(Boolean(undefined));  //false
console.log(Boolean(1));  //true

4. Undefined

  • 当声明变量未赋值时,或者定义属性未设置值时,默认值都为 undefined

5. Null 空对象

  • Null 类型只有一个值,即 null,它表示空值,定义一个空对象指针
  • 使用 typeof 运算符检测 null 值,返回 Object
    在这里插入图片描述

6. Symbol类型:es6新增

  • 通过Symbol函数生成,表示独一无二的值
  • 用于设置对象的属性名,可以避免与其他的属性名冲突
let s = Symbol();
typeof s
// "symbol"

二、引用数据类型:Object

1. Object 对象

2. Array 数组

3. Function 函数

三、基本数据类型与引用数据类型的区别

1. javascript的变量的存储方式:栈(stack)和堆(heap)

  • 栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址
  • 堆:动态分配的内存,大小不定,也不会自动释放,里面存放引用类型的值。

2.基本数据类型,复制变量,栈内存会新开辟一个内存

3.引用数据类型,复制变量,指向同一个堆内存,引用地址相同

四、深拷贝与浅拷贝

1. 递归复制对象属性

function deepClone(obj){
    let objClone = Array.isArray(obj) ? [] : {};
    if(obj && typeof obj === "object"){
        for(let key in obj) {
        //判断obj[key]是否为对象,若为对象,递归复制属性,若否,直接复制属性
        if(obj.hasOwnProperty(key)) {
                if(obj[key] && typeof obj[key] === "object") {
                    objClone[key] = deepClone(obj[key]);
                } else {
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}

2. 通过JSON的方式进行拷贝

 let newObj = JSON.parse(JSON.stringify(obj))

注意:用法简单,然而使用这种方法会有一些隐藏的坑:因为在序列化JavaScript对象时,所有函数和原型成员会被有意忽略。
具体隐藏的坑参考:

  • 如果json里面有时间对象,则序列化结果:时间对象=>字符串的形式;
  • 如果json里有RegExp、Error对象,则序列化的结果将只得到空对象 RegExp、Error => {};
  • 如果json里有 function,undefined,则序列化的结果会把 function,undefined 丢失;
  • 如果json里有NaN、Infinity和-Infinity,则序列化的结果会变成null;
  • 如果json里有对象是由构造函数生成的,则序列化的结果会丢弃对象的 constructor;
  • 如果对象中存在循环引用的情况也无法实现深拷贝;

3. Object.assign()拷贝

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

猜你喜欢

转载自blog.csdn.net/qq_41839808/article/details/115895266