从变量看javaScript

一、从存储看变量

       在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
View Code

       同理我们可以对原生函数以及正则来进行检测。

三、变量的强制类型转换

       在js中我们常常会遇到的强制类型转换有下面几种:

  • 逻辑运算符
  • 在if语句中的类型转换
  • 当使用==的时候进行转换
  • 在进行字符串拼接的时候
  • 以及使用parseInt()、Number()等方法的时候


posted @ 2017-07-30 21:09  张居客  阅读(264)  评论(0编辑  收藏  举报