JS 变量类型

变量类型

1.1 值类型与引用类型的区别

值类型:string,number,boolean,symbol,undefined,null,symbol
引用类型:object,array,function
 
值类型:值保存在栈中,保存与复制的是值本身

let value1 = 100;
let value2 = value1;
value2 = 200;
console.log(value1, value2);	// 100  200

可以看到,将 value1 赋值给 value2 时,即使再次修改 value2 的值,也不会影响 value1 的值
 
引用类型:值保存在堆中,堆的地址保存在栈中,保存与复制的是栈中指向值的一个地址

let value1 = { a: 1, b: 2 };
let value2 = value1;
value2.a = 100;
value2.b = 200;
console.log(value1, value2); // {a: 100, b: 200} {a: 100, b: 200}

可以看到,将 value1 赋值给 value2 时,再次修改 value2 的值,value1 的值也一起改变。
 

1.2 使用 typeof 来判断类型
console.log(typeof 'string');      // string
console.log(typeof 100);           // number
console.log(typeof true);          // boolean
console.log(typeof Symbol('s'))    // symbol
console.log(typeof undefined);     // undefined
console.log(typeof null);          // object
console.log(typeof {a: 1});        // object
console.log(typeof [1,2,3]);       // object
console.log(typeof function() {}); // function

 

1.3 instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
 

从 1.2 中可以看到,使用 typeof 判断 null,对象,数组都返回了 object,这样就没办法细分这三种类型,因此需要一个新的方式来进一步判断

console.log(null instanceof Object, null === null);				  // false true
console.log({a: 1} instanceof Object);                            // true
console.log([1,2,3] instanceof Array, Array.isArray([1,2,3]));    // true

使用 instanceof 判断 null,仍然会返回 false,判断 null 可以直接使用 === 即可;
使用 instanceof 判断对象,返回true;
使用 instanceof 判断数组,返回true,使用 Array.isArray 判断返回 true,建议使用后者;
 

注:“1” 和 new String(“1”)的区别

console.log("1", new String("1"), "1" === new String("1"));// 1 String{"1"} false
console.log(typeof "1", typeof new String("1"));// string object
console.log(typeof String(1));	// string

可以看到,“1”是基本类型 string ,而 new String(“1”) 是对象,且二者不相等
并且只有使用 new 才是封装对象,仅仅使用 String() 仅仅是基本类型转换

其他基础类型一样的:Number,Boolean

1.4 手写深拷贝

从 1.1 中看到,引用类型的赋值仅仅是复制其地址,这只是一种浅拷贝,那么如何做到真正复制引用类型的值呢。
下面给出示例供参考:

const deepClone = (value) => {
  // 非数组和非对象直接返回值即可
  if (value == null || typeof value !== 'object') {
    return value;
  }
  // 初始化
  let result = Array.isArray(value) ? [] : {};
  for (let key in value) {
    if (value.hasOwnProperty(key)) {
      result[key] =  deepClone(value[key]);
    }
  }
  return result;
}

欢迎大家点赞,收藏,关注!!!

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值