JS基本类型和引用类型

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。

基本类型值指的是简单数据类型的值,比如:Undefined, Null, Number, Boolean, String类型。

引用类型值指那些可能由多个值构成的对象,比如:Object类型。

如何判断一个变量是否为引用类型呢?

可以通过instanceof方法:

//instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
if (object instanceof constructor== true) {
//object   某个实例对象
//constructor   某个构造函数
}
//instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
    let obj = {name:'try'}

    if (obj instanceof Object == true) {
        //obj 是实例
        console.log('obj is Object!')
    }
    //控制台输出obj is Object!

下面从三个方面说明基本类型及引用类型的用法及区别。

  1. 动态属性
    不能给基本类型的值动态添加属性,例如:
var name = "Jack";
name.age = 27;
console.log(name.age); // undefined

可以给引用类型的值动态添加属性,例如:

var person = {};
person.name = "Jack";
console.log(person.name); // "Jack"
  1. 复制变量值
    基本类型的复制会创建一个新的值,例如:
var str1 = "a";
var str2 = str1;
str1 = "b";
console.log(str2); // "a"

由此可见,str2只是str1的一个副本,两个变量之间可以参与任何操作而不会互相影响。

**引用类型变量是一个指针。**引用类型的复制则不同,新的变量与原来的变量指向内存中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。

因此,改变其中一个变量的值,将影响另一个变量。例如:

var obj1 = {};
var obj2 = obj1;
obj1.name = "Jack";
console.log(obj2.name); // "Jack"
  1. 传递参数
    可以将函数的参数理解为局部变量。基本类型值的传递如同基本类型变量的复制一样,引用类型值的传递如同引用类型变量的复制一样。例如:
//基本类型参数:
function add(val) {
    val += 10;
    return val;
}
var num = 20;
var result = add(num);
console.log(num); // 20
console.log(result); // 30
//引用类型参数:
function setName(obj) {
    obj.name = "Mark";
}
var person = {};
person.name = "Jack";
setName(person);
console.log(person.name); // "Mark"

总结:

  • 基本类型值在内存中占据固定大小的空间,因此保存在栈内存中
  • 从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本
  • 引用类型的值是对象,保存在堆内存中
  • 包含引用类型值的变量,实际上包含的并不是对象本身,而是一个指向该对象的指针
  • 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象
  • 判断一个值是哪种基本类型可以使用typeof操作符,而判断一个值是哪种引用类型可以使用instanceof操作符
    作者:dykingdy
    出处:https://lidaguang1989.github.io/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值