一、从存储看变量
在js中,变量按存储方式来说,有两种类型,一是值类型,二是引用类型。
先说值类型,在js中,值类型有Number、String、 Boolean、undefined、null。那么在内存中,值类型存储的就是这些基本数据变量的值,如果我们要对这些变量进行复制,那么我们需要一块新的内存空间来存放复制的值。
那引用类型又是什么呢,引用类型在js中有对象、函数、数组,作为引用类型,他们都可以无限的扩展属性,那么当一个引用类型扩展的属性非常多的时候,我们进行复制是不是就要拿出一块相应的空间去存放,那占得内存就会非常大了,所以引用类型存放的只是一个引用也就是一个指针,指向在堆中真正的数据。
在这里举一个可能不是很恰当的例子,我们把房子作为内存空间,声明的变量就是房子里的东西,值类型是什么呢?我看了你这个房间,我也很想要,于是乎我就新建了一个房子,然后把其中的东西原封不动的复制一份搬到我的房子里,这就是值类型复制的特性。下面看代码例子:
1 var home = "精装修房子"; // 创建一个字符串类型的值 2 var newHome = home; // 我也拥有了一栋一模一样的房子 3 newHome = "别墅"; // 现在我把房子盖成了别墅 4 console.log(home); // "精装修房子",是互不影响的
值类型
那么引用类型是什么呢,就是我很喜欢你这个房子,那你就把钥匙配给我一把,我也可以使用这个房子,但是我对这个房子的使用情况也会影响到你的使用,我往里面填了一个电视,那么你用的时候电视是在里面的了。下面看代码:
1 // 一个新房子 2 var home = { 3 name: "居客"; 4 bed: "木板床" 5 }; 6 // 我很喜欢,给我一把钥匙 7 var me = home; 8 // 修改房子,买一个电视 9 me.TV = "长虹"; 10 console.log(home);
引用类型
二、typeof和instanceof
在面试的时候我们会经常的遇到一个这样的问题,typeof的返回值有什么,或者是说直接给你一个语句问你返回值是什么。
那么typeof的返回值究竟有哪些呢?
1 typeof undefined; // undefined 2 typeof 18; //number 3 typeof "juke"; //string 4 typeof null; //object 5 typeof {}; //object 6 typeof []; //object 7 typeof function(){}; //function 8 9 // 其实还有一种在ES6中定义的基本类型Symbol,这里不多介绍 10 typeof Symbol(); //symbol
typeof
可以看到,我们使用typeof对于引用类型来说,只能够分辨出function,但是对数组、对象来说,typeof十分不出来的。
那么instanceof就能够派上用场了,它可以判断一个函数是不是一个变量的构造函数。
1 var arr = []; 2 arr instanceof Array; //true
现在看来是能够检测是不是数组了,但是在一些特别的环境下,我们要使用ES5中的新特性去检测数组。
1 var arr = []; 2 Array.isArray(arr); //true
但是这个属性在浏览器中有比较大的限制,只有IE9+、Chrome、Firefox4+、Safari5+、opera10.5+的浏览器才会支持,那么还有没有更稳妥的方式去检测数组呢,当然有,数组也是对象,我们可以通过,object的toString方法来判断。
1 var arr = []; 2 function isArray(arr) { 3 return Object.prototype.toString.call(arr) == ‘[object Array]‘; 4 } 5 6 isArray(arr); // true
同理我们可以对原生函数以及正则来进行检测。
三、变量的强制类型转换
在js中我们常常会遇到的强制类型转换有下面几种:
- 逻辑运算符
- 在if语句中的类型转换
- 当使用==的时候进行转换
- 在进行字符串拼接的时候
- 以及使用parseInt()、Number()等方法的时候