1、js的基本类型和引用类型
(1)认识一下基本类型和引用类型
js的基本类型包括 Undefined、Null、Boolean、Number、String
这五种类型,基本类型是按值访问的,因为可以操作保存在变量中的实际的值。
js的引用类型常用的包括 Object、Array、RegExp
,因为在操作对象时,实际上在操作对象的引用而不是实际的对象,因此,引用类型的值是按引用访问的。
定义基本类型和引用类型的方式是差不多的:都是创建一个变量并为该变量赋值,但是当这个值保存到变量中后,不同类型的值可以进行的操作却是不一样的。接下来我们看一个示例:
var a = new Object();
a.name = 'hanmeimei';
console.log(a.name) // 'hanmeimei'
我们new了一个对象保存到了 a 变量中,并且给 a 对象添加了一个值为 'hanmeimei’的 name 属性,
如果这个对象不被销毁或者这个属性不被删除,那么我们可以一直访问这个属性。
但是我们不能给基本类型的值添加属性
(画重点,大家要记住),接下来看示例
// 虽然不会报错,但是输出 a.age 是undefined
var a = 'hanmeimei'
a.age = 27;
console.log(a.age) // undefined
(2)如何检测数据的类型
一提到检测数据类型,大家肯定首先会想到使用 typeof
操作符,我们接着看代码
var a = 'hanmeimei';
var b = 27;
var c = true;
var d = null;
var e;
var f = new Object();
var g = [];
console.log(typeof a) // string
console.log(typeof b) // number
console.log(typeof c) // boolean
/**
javascript 中会把二进制前三位都为0的判断为object类型,
而null的二进制表示全都是0,自然前三位也是0,所以执行typeof时会返回 object。
**/
console.log(typeof d) // object
console.log(typeof e) // undefined
console.log(typeof f) // object
console.log(typeof g) // object
这个时候大家可以看到,typeof
在检测除null之外的基本类型都是检测正确的,但是在检测数据
和对象
的时候通通都是object,显然,在检测引用类型的时候不是我们想要的,那么在检测引用类型的时候我们可以使用instanceof
操作符,接下来看示例:
var a = new Object();
var b = [];
console.log(a instanceof Object); // true
console.log(b instanceof Array); // true
根据有关规定,所有引用类型的值都是Object的实例,所以在检测引用类型值和构造函数时,instanceof
操作符都会返回true
。当然使用instanceof
操作符检测基本类型的值时,都是false。
(3)复制变量值
引用类型和基本数据类型除了保存方式和检测方式不同之外,从一个变量像另一个变量复制值时也不一样。废话不多说,看代码:
// 引用数据类型
var a = {};
a.name = 'xiaohong'
var b = a;
b.name = 'xiaoming'
console.log(a.name) // xiaoming
大家好奇了,为什么是‘‘xiaoming’’呢,应该是‘‘xiaohong’’呀。实际上当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到新的变量分配的空间中,而这个值的副本实际上就是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上同时引用了一个对象,所以改变其中一个变量,就会影响另外一个变量。
// 基本数据类型
var a = 3;
var b = a;
b = 5;
console.log(a) // 3
从一个变量向另外一个变量复制基本类型的值时,会在变量对象上创建一个新值,然后把该值复制到新变量上。所以改变 b 的值不会改变 a 的值。
ps:写的不好,不喜勿喷,懂了的就是懂了,写这篇文章就是给初学前端JS的童靴看的。