本文共 1324 字,大约阅读时间需要 4 分钟。
很多人在学习js的过程中,会遇到比较类型和比较实例对象的问题,以上的两个关键字:instanceof 和typeof分别是比较实例对象和比较数据类型的作用。所以他们是有区别的。
type-of,顾名思义就是比较变量的数据类型是否是需要的类型或者是去判断的类型,常用的语法是
typeof(变量或对象)= "值的类型"
typeof操作符返回一个字符串。
一般的返回结果可能有如下这几种情况:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。
注意:Array,Null 等特殊对象使用 typeof 一律返回object。
instanceof 关键字在js中是用于判断一个变量是否属于某个对象的实例。当然这和java中的实例在虚拟机中占有的存储是否一致?我们用一个例子。
1.instanceof的用法
var b = new Array();alert(b instanceof Array); // truealert(b instanceof Object) // true
可以看到 变量b实例化了Array,所以b是属于Array的一个类似于开辟了一个子类空间,属于父类管理的。那么为什么Array和object都是true呢?这个其实很好理解,因为Array也是object类的,所以可以说Array把它当作object的子类一部分,这样很好理解了。
我看过js原型,更深层次来讲,instanceof 运算符是用来检测 constructor.prototype 是否存在于参数 object 的原型链上。我们在新建一个函数function对象时,会生成一个叫做prototype 的属性集合的东西,往往和伴随另一个叫做Proto的东西生成,可以把它当做之后如果被实例化的那个对象的内部指针,指向js原型。
2.对于js实例化
这个是题外话,看了一下js的实例化,发现和java中的实例化存储位置是相差甚大的。举个例子,
var a = new Array(); var b = new Array();alert(a=b?true:false);//jsjs中生成的两个Array的实例化对象a和b,发现他们比较之后输出的是true。
在看java
Employee e = new Employee();Employee a = new Employee();System.out.println(a==e?true:false);这里设计了一个Employee类,然后实例化这个类分别为对象a和b。
现在比较他们两个发现输出是false。
这是为什么呢?
首先我们必须知道的是,javascript是弱类型语言,而java是强类型语言,这个就代表着java拥有自己的一个叫做jvm(java虚拟机)的东西,它可以分配一些的内存去存储一些东西而且分的很清楚。但是js就是一个基本就像一个整体,所以即便新实例化一个对象,也是在这个整体上完成的。java比较的是两个地址,js比较的是两个值。
转载地址:http://zntrn.baihongyu.com/