基本数据类型和引用数据类型的区别
先看一道面试题
var num1 = 12;
var num2 = num1; // num1变量代表的值给了num2变量
num2++; // num2++ 相当于 num2 = num2 + 1; 在自己原有值的基础上 +1,也可以写成 num2 += 1;
console.log(num2); // 13
console.log(num1); // 12
var obj1 = {name: 'derrick'};
var obj2 = obj1;
obj2.name = 'rose';
console.log(obj1.name); // rose
console.log(obj2.name); // rose
// 发现: 基本数据类型没有跟着改变,而引用数据类型跟着改变了
图示解析如下:
所以,
基本数据类型和引用数据类型的本质区别:基本数据类型操作的是值,而引用数据类型操作的是对新空间的引用地址。
- 基本数据类型:是把值直接的给变量,接下来在操作的过程中,直接拿这个值操作的,可能两个变量存储一样的值。但是你的是你的,我的是我的,之间没有关系,其中一个改变,另外一个没有任何的影响
-
引用数据类型:
- 定义一个变量
- 开辟一个新的空间,然后把属性名和属性值保存到这个空间中,并且有一个空间地址
- 把空间地址给了这个变量,变量并没有存储这个数值,而是存储的是对这个空间的引用地址
- 接下来我们把这个地址又告诉给了另外一个变量,另外一个变量存储的也是这个地址,此时两个变量操作的是同一个空间
- 其中一个改变了空间的内容,另外一个也跟着改变了
可以用显示的例子来说明:
基本数据类型:
张三开了一个淘宝店,卖的是吃的,李四也开了一个淘宝店,卖的和张三店里的东西一样,也卖的是吃的。但是张三和李四的收益都是各自的,相互没有影响。
引用数据类型:
张三开了一个淘宝店,卖的是吃的,张三有一个店的账号地址,李四也想开拿到了张三的店的账号地址。于是他们共同经营这家淘宝店,不管是谁在管理,到时候的收益是双方的。
JavaScript检测数据类型类型的方式
- typeof 运算符
- instanceof 运算符
- constructor
- Object.prototype.toString.call()
现在只讨论typeof运算符。
typeof用来检测数据类型的,其语法为:
typeof 要检测的值
其返回值是字符串,是包含了数据类型字符串。例如"number", "string", "boolean", "undefined", "object", "function
,
typeof null 返回 "object"
,
type of 对象 返回 "object", typeof function(){} 返回"function"
。
但是typeof的局限性,不能具体的检查object下细分的类型,检查这些返回的都是"object"。
console.log(typeof 'derrick'); // "string"
console.log(typeof 1); // "number"
console.log(typeof null); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
下面看一道面试题:
console.log(typeof typeof typeof typeof []); // "string"
解析:
typeof [] ==> "object",
typeof "object" ==> "string",
...
得到结果 "string"。
结论:出现两个和两个以上的typeof,最终结果都是"string"。