跳到主要内容

引用数据类型

· 阅读需 3 分钟

常用的实例函数和静态函数

引用数据类型,是通过 new 操作符来生成的,然而 new 在执行的时候,会改变 this 的指向。

执行 new 的时候,首先是创建一个空对象,把空对象的proto属性指向构造函数的 prototype 属性,完成了将构造函数的 this 指向新建的这个空对象。

Object 类型中,有这样的几个实例函数:

  1. hasOwnProperty(propertyName)函数,判断了一个属性是不是实例自己定义的;但是它不会检查原型链上的属性。
  2. propertyIsEnumerable(propertyName)函数,判断属性是否是实例属性并且该属性是否可枚举;

Object 类型的静态函数:

  1. Object.create(),主要是用来创建并且返回一个指定原型和指定属性的对象;
  2. Object.defineProperties()函数,添加或者修改对象属性的值,第一个参数是操作对象,第二个参数是添加或者修改的属性信息;
  3. Object.getOwnPropertyNames()函数,获取对象的所有的属性和函数;
  4. Object.keys()函数,获取对象可枚举的实例属性;

Array 类型

###判断一个数组是否为空的方法

  1. 一般使用的是 instanceof运算符,是在原型链上查找变量是否是某个类型的实例, 比如:
const str = [1,2];
console.log(str instanceof Array);// true
console.log(str instanceof Object);// true

这就导致我们不能精准判断一个变量的具体数据类型。

  1. 第二个方式使用 Array 的 isArray 方法,比如:console.log(Array.isArray(arr); ,变量是数组就返回 true,法则返回 false。

  2. 通过判断构造函数,判断变量的构造函数是 Array 类型,还是 Object 类型。因为一个对象是通过构造函数来生成的。代码如下:

const arr = [];
console.log(arr.constructor === Array)

每一个变量都会有一个proto属性,表示隐式原型,proto 属性指向了构造函数的原型。比如:console.log(arr.__proto__ === arr.constructor.prototype);//true

引用数据类型都是继承了 Object 类型,所以它们都含有了 toString 函数,不同数据累心的 toString 的返回值是不一样的,因此可以通过 toString 函数来判断一个变量是数组还是对象。结果返回的是“[object Array]”或者"[object Object]"。

比如:

const obj = {}
const arr = []

console.log(Object.prototype.toString.call(obj)); //[object Object]
console.log(Object.prototype.toString.call(arr)) // [object Array]
console.log(Object.prototype.toString.call(908)) // [object Number]
console.log(Object.prototype.toString.call("7sd")) // [object String]