JavaScript引用数据类型

引用数据类型,也叫作复杂数据类型,可能不同的开发者,理解不同就有不同的叫法。

引用数据类型主要作用是区分基本数据类型,描述的是具有属性和函数的对象。
应用数据类型包含了Object、Array、Date、RegExp类型、Math类型、Function类型,以及基本数据类型的包装类型,如Number()、String()。

引用数据类型的几个特点:

  1. 引用数据类型的实例是通过new操作符创建的;
  2. 引用数据类型的变量赋值传递的是内存地址;
  3. 引用数据类型的比较,实际上是在比较内存地址,而基本数据类型比较的是值;

Object类型

Object有实例函数和静态函数。实例函数是函数的调用是基于Object类型的实例,比如:const obj = new Object();

Object类型有以下几个实例函数:

  1. hasOwnProperty(propertyName),用来判断对象是否含有某个属性,但是不会检查到实例对象原型链上的属性。比如:
    在这里插入图片描述
  2. propertyIsEnumerable(propertyName),这个函数用来判断指定属性是否是实例属性并且是否具有可枚举,如果是不可枚举或者属性是原型链上的属性,都会返回false;

Object的静态函数:

  1. Object.create()函数,创建并且返回一个指定原型和指定属性的对象;
  2. Object.defineProperties函数,用于添加或者修改对象的属性,如:
const obj = {};
Object.defineProperties(obj,{
	name:{
		value:"oiuy"
	}
});
  1. Object.getOwnPropertyNames,这个函数是获取哦对所有的实例属性和函数,不包含原型链继承的属性和函数,返回格式为数组;
  2. Object.keys,获取对象的可枚举属性,不含原型链继承的属性,返回数据格式为数组;

Array类型

判断一个变量是数组还是对象,如果用typeof来判断的话,得到的是object,因为typeof运算符只有在判断基本数据类型的时候,才能返回准确的结果。所以我们只能使用以下这几个方法来判断引用数据类型

  1. instanceof运算符,通过查找原型链来判断一个变量是否是某个数据类型,例如:
    这里是引用
  2. 判断构造函数,在判断一个变量是数组还是对象的时候,其实只需要判断这个变量的构造函数是Array还是Object就可以了。如下:
    在这里插入图片描述
    因为在JavaScript中的变量都有一个__proto__属性,表示是隐式原型,一个对象的隐式原型指向的是构造函数的原型。比如:
    在这里插入图片描述
    封装一个判断变量是数组还是对象的函数:
// 判断变量是数组还是对象
function isArrayOrObject(obj) {
    const constructor = obj.__proto__.constructor || obj.constructor;

    if (constructor === Array) {
        return "Array"
    }

    if (constructor === Object) {
        return "Object";
    }

    return "该变量不是object类型"
}

console.log(isArrayOrObject([])); // Array
console.log(isArrayOrObject({})); // Object

const param = 468;
console.log(isArrayOrObject(param)); // 该变量不是object类型
  1. 引用数据类型都会直接或者间接继承Object类型,所以都会含有toString函数,不同数据类型的toString()函数返回值也不一样。通过call函数,我们可以直接调用Object原型上的toString函数,比如:
console.log(Object.prototype.toString.call([1]))// [object Array]
console.log(Object.prototype.toString.call(124))//[object Number]
console.log(Object.prototype.toString.call({ name: '24' })); // [object Object]
console.log(Object.prototype.toString.call("")) //[object String]

上面封装的函数,是通过变量的.__proto__属性来判断的,但是有些浏览器已经支持__proto__了,可以改用toString:

// 判断变量是数组还是对象
function isArrayOrObject(obj) {
    const res = Object.prototype.toString.call(obj)
    if (res === '[object Array]') {
        return "Array"
    }
    if (res === '[object Object]') {
        return "Object";
    }
    return "该变量不是object类型"
}
  1. Array.isArray()函数,用来判断一个变量是否是数组。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

读心悦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值