JavaScript 引用类型

JavaScript 引用类型

所谓引用类型,在ECMAScript中表示一种数据结构,其中有一些数据和方法,在其余语言中大多被称为,可是在这里咱们通常不这样称呼。即便ECMAScript是一门面向对象语言,可是它不具有传统面向对象语言中所支持的类和接口。他们描述的是一类对象所具备的属性和方法。引用类型的值就是一个对象,它是引用类型的一个实例。 新对象是用一个new操做符后面跟上一个构造函数建立的。所谓构造函数本质上是一个函数,这个函数的目的是为了建立某一类对象,函数中包含了建立该对象所须要的东西。 ECMAScript中提供其余各类类型的引用类型。javascript

基本类型和引用类型的值

JavaScript 中的变量与其余语言的变量有很大差异,独特的松散类型的特性,决定了它只是特定时间用来保存特定值的一个名字而已。它的数据类型在生命周期中是能够随时改变的。Crazy and Powerful !java

在一个变量中可能存在两种不一样数据类型的值:基本类型值和引用类型值。基本类型值是按值引用的,咱们能够操做保存在变量中实际的值。可是引用类型就不一样了,引用类型的值是保存在内存中的对象,而JavaScript是不容许直接操做内存空间的。因此说咱们在操做对象的时候操做的是对象的引用而不是实际的对象。因此对象是按引用访问的。数据结构

  • 引用类型具备动态的属性

两种类型在定义的时候是类似的,建立一个变量而且为它赋值。可是引用类型容许咱们更改其属性和方法,而基本类型值没有这个功能。当咱们为基本类型值增添属性后虽然不会报错,可是倒是无效的。函数

  • 变量值的复制

对于基本类型值来讲,从一个变量复制给另外一个变量的时候,会在新的变量上建立一个新值,而后把值复制过去。今后这两个值就没了联系,不会相互影响了。但若是是从一个变量向另外一个变量复制引用类型的值的时候,复制过去的实际上是一个指针,指向存在堆中的一个对象,而后两个变量引用同一个对象,改变一个,会影响另外一个:ui

let obj1 = new Object();
let obj2 = obj1;
obj1.name = 'Baoyuan';
console.log(obj2.name); //'Baoyuan'
复制代码
  • 参数的传递

ECMAScript 中全部函数的参数都是按值传递的。spa

向函数传递基本类型的值的时候,被传递的值被复制给命名参数。而对于引用类型来讲,会把这个值在内存中的地址复制给命名参数,这会致使函数内值的改变反应在函数外部:指针

function setName (obj) {
    obj.name = 'Baoyuan';
};
let people = new Object();
setName(people); // 将people对象地址复制给了函数内部的obj,也就是说引用同一个对象。
console.log(people.name); //'Baoyuan'
复制代码

即便这个对象是按值传递的,由于 people 指向的对象在堆内存中只有一个, obj 会按引用来访问同一个对象。code

咱们先来看最多见用的最多的一种-Object对象

Object

Object是典型的引用类型值,虽然它的实例中并不具有不少功能,可是大多数咱们所见的引用类型值都是他的实例。并且对于咱们在程序中存储和传输数据来讲是不可或缺的。 一般咱们可使用new方法来建立一个对象:接口

let peopele = new Object();
people.age = 23;
people.name = 'Baoyuan';
复制代码

咱们建立了一个people对象并为其设置了姓名和年龄属性,一样的使用对象字面量也能够有相同的效果:

let people = {
    name: 'Baoyuan',
    age: 23
};
复制代码

在使用这种方式的时候属性名也能够用字符串表示,通常咱们推荐使用字面量建立,它的代码简洁并且它也是向函数传递大量参数的首选方式。 咱们能够经过点访问法访问其属性:

console.log(people.name); //Baoyuan
复制代码

除此以外还有一种更为灵活的方式,当咱们的属性名中含有包含会致使语法错误的字符串或者是保留字的话,咱们可使用[]来访问:

people['name'] = 'Bao yuan'; //属性名以字符串形式放入,属性值中含有空格。
复制代码

这种方式还能够经过变量来访问属性:

let item = 'name';
people[item]; //Baoyuan
复制代码

同常来讲除非必须使用[]的状况下,通常建议用点表示法。

除此以外引用类型还有ArrayDateRegExpFunction等。

类型判断

在检测基本数据类型的时候咱们使用typeof可是若是咱们在引用类型上使用的话都会返回object,这并非咱们想要的。为此ECMAScript提供了instanceof

result = variable instanceof constructor

它会根据原型链来识别,好比:

console.log(people instanceof Array); //变量people是Array类型吗?
复制代码

不足之处请批评指正~

相关文章
相关标签/搜索