Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

从弱类型与强类型说JavaScript的数据类型判断

  在JavaScript中数据的类型是弱类型。弱类型不是因为它很弱所以叫弱类型,其实弱类型才是数据的本质。随便从内存中取出一块,我们无法判断它的类型,这时候它就是弱类型。而强类型就是为了保证编程逻辑上的完整性而人为的强制定义上去的。C语言和一些比较底层的语言都是使用弱类型的,只不过有些时候我们对类型的强制声明可以让一种语言同时支持弱类型和强类型。就像使用C++做OOP的开发,由于OOP需要非常严谨的类型定义,所以它就定义了一套强类型,而C++本身也只是弱类型的(虽然从语法层面上它是强类型= =。从逻辑的角度分析的它就是弱类型的,别喷我,这个定义本身没有标准的)。
  弱类型的数据,都可以看作是一个void指针,JavaScript的数据也是如此。只不过JavaScript这种语言吸取了OO思想的一部分精华,所以它的类型都是通过对象来封装的。JavaScript中的所有数据(指的是常量和变量)在内存中是以对象的方式储存。先是一大堆的属性,最后一个void指针指向一块内存,它用来存放这个对象的数据。

  在JavaScript中我们要判断一个对象的类型,直接从数据是无法判断的,我们也无法直接获取数据。我们唯一能做的就是访问属性。从属性中获取到对象类型的方法,最简单的就是typeof运算符了。typeof会访问属性,从属性中获取对象指向的数据区域的数据类型。虽然typeof访问的属性确实保存了数据区域的数据类型,但是这个属性保存的只有,字符、数字、布尔、函数、对象,这几种(undefinde是特殊情况,这里不讨论)。这样除了函数以外的所有对象类型都返回了object,我们无法精确判断到数据指针指向的object到底是什么类型的。
alert(typeof []); //object   要获取数据指针指向的对象的类型,就比较复杂了。对象不像普通的数据那么简单,它是一个hash表,可以保存很多的数据,所以typeof这样简单的运算符显然无法得到想要的结果。但是对象也有所谓的类型,那就是它的构造器。我们可以使用instanceof运算符来判断它是否是由某个构造器构造出来的对象。但是instanceof运算符没办法判断非指针对象也就是值对象的类型,那是typeof的工作。一个对象被构造的时候,在它的属性里就会存有它的继承链。在JavaScript中,所有对象都是继承于Object的,所以使用instanceof来判断一个对象的构造器时,Object总是可以被通过。 alert(1 instanceof Number);//返回false
alert([] instanceof Object);//返回true
  只要把typeof和instanceof结合使用就可以判断所有类型了。下面还有其它判断类型的方法,比如constructor属性。这个属性可以被用户重定义,所以无法用它来获取到精确的类型。对于值类型,这个属性其实是一个Setter属性,它会根据值的类型来判断构造器,因为值类型就那么个几个。而指针类型使用这个属性就需要访问它指向的对象,然后从对象的hash表中获取到这个值。所以使用这个方法来判断对象效率不怎么高。而且像null这样的空指针根本无法访问属性,对null使用这个方法只会让代码出错。
alert("a".constructor); //String对象
alert([].constructor); //Array对象
var o={};
o.constructor="次碳酸钴";
alert(o.constructor); //"次碳酸钴"
alert(null.constructor); //错误
  最后还有一种方法可以做类型判断,那就是Object原型的toString方法。这个方法会不择手段的获取数据类型,具体的实现方式我没有研究过,但是它确实是一个好方法。这种方法的效率虽然不如直接使用typeof或者instanceof的效率高,但是它非常方便。 var f=Object.prototype.toString;
alert(f.call(1)); //[object Number]
alert(f.call("a")); //[object String]
alert(f.call([])); //[object Array]
alert(f.call({})); //[object Object]
  暂时就说到这儿吧,我的研究也不是非常深入,如果有什么错误的地方请纠正。。。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^