javascript之typeof、instanceof操作符使用

   写javascirpt代码时,typeof和instanceof这两个操作符时不时就会用到,堪称必用。但是!使用它们总是不能直接的得到想要的结果,非常纠结,普遍的说法认为“这两个操作符或许是javascript中最大的设计缺陷,因为几乎不可能从他们那里得到想要的结果”

  typeof

  说明:typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function。

  从说明来看,貌似没什么问题。

  下面的代码写了一个数值变量,typeof后的结果是"number"。

  代码如下:

  var a = 1;

  console.log(typeof(a)); //=>number

  如果用Number类型的构造函数new一个变量的话,typeof后的结果是"object"。

  复制代码 代码如下:

  var a = new Number(1);

  console.log(typeof(a)); //=>object

  上面的这两个输出结果看似没啥问题,这一点从书上看来是理所当然的事情,因为javascript就是这么设计的。

  但是!问题就在于既然调用了typeof就应该准确返回一个变量的类型,不管是直接用值创建的还是用类型的构造函数创建的,否则!我还用你做啥!

  那么对于:

  代码如下:

  var a = 1;

  var b = new Number(1);

  a和b变量的类型准确的说来都应该是Number才是想要的结果。

  而准确的类型信息保存在变量的内部属性 [[Class]] 的值中,通过使用定义在 Object.prototype 上的方法 toString来获取。

  获取类型信息:

  代码如下:

  var a = 1;

  var b = new Number(1);

  console.log(Object.prototype.toString.call(a));

  console.log(Object.prototype.toString.call(b));

  输出:

  代码如下:

  [object Number]

  [object Number]

  是不是已经很直接了,我们稍微处理一下,得到直接结果:

  代码如下:

  var a = 1;

  var b = new Number(1);

  console.log(Object.prototype.toString.call(a).slice(8,-1));

  console.log(Object.prototype.toString.call(b).slice(8,-1));

  输出:

  Number

  Number

  这就是想要的结果。

  为了更好的使用,我们封装一个方法,用来判断某个变量是否是某种类型:

  代码如下:

  function is(obj,type) {

  var clas = Object.prototype.toString.call(obj).slice(8, -1);

  return obj !== undefined && obj !== null && clas === type;

  }

  定义一些变量做过测试,先来看看它们的typeof输出:

  代码如下:

  var a1=1;

  var a2=Number(1);

  var b1="hello";

  var b2=new String("hello");

  var c1=[1,2,3];

  var c2=new Array(1,2,3);

  console.log("a1's typeof:"+typeof(a1));

  console.log("a2's typeof:"+typeof(a2));

  console.log("b1's typeof:"+typeof(b1));

  console.log("b2's typeof:"+typeof(b2));

  console.log("c1's typeof:"+typeof(c1));

  console.log("c2's typeof:"+typeof(c2));

  输出:

  a1's typeof:number

  a2's typeof:object

  b1's typeof:string

  b2's typeof:object

  c1's typeof:object

  c2's typeof:object

  我们再用新作的函数是一下:

  代码如下:

  console.log("a1 is Number:"+is(a1,"Number"));

  console.log("a2 is Number:"+is(a2,"Number"));

  console.log("b1 is String:"+is(b1,"String"));

  console.log("b2 is String:"+is(b2,"String"));

  console.log("c1 is Array:"+is(c1,"Array"));

  console.log("c2 is Array:"+is(c2,"Array"));

  输出:

  a1 is Number:true

  a2 is Number:true

  b1 is String:true

  b2 is String:true

  c1 is Array:true

  c2 is Array:true

  注:typeof也不是无用,实际用处是用来检测一个变量是否已经定义或者是否已经赋值。

  instanceof

  说明:判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例。

  instanceof 操作符用来比较两个内置类型的变量时一样力不从心,同样会对结果不满意。

  代码如下:

  console.log("abc" instanceof String); // false

  console.log("abc" instanceof Object); // false

  console.log(new String("abc") instanceof String); // true

  console.log(new String("abc") instanceof Object); // true

  只有在比较自定义的对象时才准确反映关系。

  代码如下:

  function Person() {}

  function Man() {}

  Man.prototype = new Person();

  console.log(new Man() instanceof Man); // true

  console.log(new Man() instanceof Person); // true

时间: 2024-09-20 21:08:19

javascript之typeof、instanceof操作符使用的相关文章

javascript之typeof、instanceof操作符使用探讨_基础知识

写javascirpt代码时,typeof和instanceof这两个操作符时不时就会用到,堪称必用.但是!使用它们总是不能直接的得到想要的结果,非常纠结,普遍的说法认为"这两个操作符或许是javascript中最大的设计缺陷,因为几乎不可能从他们那里得到想要的结果" typeof 说明:typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function. 从说明来看,貌似没什么

JavaScript instanceof 操作符

JavaScript instanceof 操作符 instanceof 操作符用来比较两个操作数的构造函数.只有在比较自定义的对象时才有意义. 如果用来比较内置类型,将会和 typeof 操作符 一样用处不大. 比较自定义对象 function Foo() {} function Bar() {} Bar.prototype = new Foo(); new Bar() instanceof Bar; // true new Bar() instanceof Foo; // true // 如

Javascript实例代码讲解instanceof操作符

文章简介:在JavaScript中,我们可以用instanceof操作符来判断对象是否是某个类的实例,如果obj instaceof Class返回true,那么我们认为obj是Class的实例,obj要么由Class创建,要么由Class的子类创建. 在JavaScript中,我们可以用instanceof操作符来判断对象是否是某个类的实例,如果obj instaceof Class返回true,那么我们认为obj是Class的实例,obj要么由Class创建,要么由Class的子类创建.来自

javascript中typeof操作符和constucor属性检测

这篇文章主要介绍了javascript中typeof操作符和constucor属性检测的相关资料,需要的朋友可以参考下 *#type.js 代码如下: function Person(name, age) { this.name = name; this.age = age; } var d = {an: 'object'}; var a = ['apple', 'banana']; var f = function() {}; var s = 'David'; var n = 33; var

谈谈我对JavaScript中typeof和instanceof的深入理解_javascript技巧

这次主要说说javascript的类型判断函数typeof和判断构造函数原型instanceof的用法和注意的地方. typeof 先来说说typeof吧.首先需要注意的是,typeof方法返回一个字符串,来表示数据的类型. typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类型.typeof 一般只能返回如下几个结果: number,boolean,string,function,object,undefined.我们可以使用

PHP强制对象类型之instanceof操作符

对象 一.简介 在PHP中实现强制对象类型有时可能非常重要.如果缺少了它,或是因为缺乏这方面的知识--基于不正确的编程假设,或者仅仅是由于懒惰,那么你会在特定的Web应用程序中看到你所不希望的结果.特别是当用PHP 4进行编程时,使用"is_a()"函数(尽管还有其它方法)来验证你所使用的对象的类型是非常容易的事情.毫无疑问,强制对象类型还可以被用于过滤输入对象(需要被作为参数传递到同一个应用程序中的其它PHP类). 不过,PHP 4并没有暴露一些有关于它的对象模型的弱点-为了实现某些

javascript中typeof的使用示例

 本文为大家介绍下javascript中typeof的使用,下面有个不错的示例,感兴趣的朋友可以参考下  代码如下: <html>  <head>  <title>javascript中typeof的使用</title>  <script>  //1.基本类型  var x = 123;  var y = "abc";  var z = true;  //alert(typeof x);//number  //alert(ty

指针-Javascript中通过点操作符定义属性和字面量形式定义的区别

问题描述 Javascript中通过点操作符定义属性和字面量形式定义的区别 我已经有一种这样的困惑:第一种:function Person(){};Person.name = ""liang"";Person.age = 22 ;Person.sayName = function(){alert(this.name)}alert(Person.prototype.constructor == Person) ; // true在以上这个代码中,我创建了一个构造函数P

Javascript中的delete操作符详细介绍_基础知识

一.变量 说到javascript中的delete操作符,还是首先要搞清楚javascript中的变量和属性之间的关系. javascript中,变量和对象属性关系非常微妙,甚至可以很多时候会被等同起来,因为 javascript 在执行脚本之前会创建一个global对象,在浏览器中就是window对象,所有的全局变量都是这个global对象的属性,执行函数时也会创建一个activation对象,所有的局部变量都是这个activation对象的属性.这些可以大家可以去了解一下javascript