经常有人会在JavaScript里写如下的方法:

function checkType() {
var s1 = 123;
var s2 = "OK";
if (s1 instanceof Number) {
alert("s1 is a number.");
}
if (s2 instanceof String) {
alert("s2 is a String.");
}
}

问题在哪里呢?

首先我们要理解,JS里,var本身是一个泛型,它并不是Number,也不是String,更不是其他的类。

其次要从instanceof方法来理解:

第一:

instanceof 表示对象是否是特定类的一个实例。

注意特定类的实例,也就是说instanceof反馈的是对象的构造的信息。

语法为:result = object instanceof class

例如:

function Test() {}
var test = new Test();
alert(test instanceof Test);

第二:

String 类型的声明。

使用 var str = new String("String");声明定义的是一个String类型的对象。str指向该对象的一个引用

使用 var str1 = "String";声明定义将str指向字符串“String”,

str指向一个实例,str1指向一个字符串。

以上声明定义的规则,同java类似。

访问str时,JavaScript引擎会“自动拆装包”得到str的对象实例所表示的值“String”。所谓“自动拆装包”即运行期时,基础数据类型 转换成基础类型构造的对象实例以及将基础类型构造的对象实例转换成基础数据类型。如“new Number”、new Boolean("true")、new String等。

因此s2只有自己的基本类型而没有所谓的实例构造类型

即,我们定义了var s1 = 123, 它的类型并不是Number,而是var。

只有我们把123实例化为Number的时候,它的类型在instanceof里才是Number。

其他的自定义类一样。


另外一个方法typeof

JavaScript中instanceof和typeof都能用来判断一个变量是否为空或是什么类型的变量。

typeof用以获取一个变量的类型,typeof一般只能返回如下六种结果:

number, boolean, string, function, object, undefined。

我们可以使用typeof来获取一个变量是否存在,如

if(typeof a!="undefined"){}

而不要去使用if(a),因为如果a不存在(未声明)则会出错,

对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。

如果我们希望获取一个对象是否是数组,或判断某个变量是否是某个对象的实例则要选择使用instanceof。

instanceof用于判断一个变量是否某个对象的实例,如

var a=new Array();
alert(a instanceof Array);

会返回true,

同时

alert(a instanceof Object)

也会返回true;

这是因为Array是object的子类。

再如:

function test(){};
var a=new test();
alert(a instanceof test)

会返回true。

谈到instanceof我们要多插入一个问题,就是function的arguments,

我们大家也许都认为arguments是一个Array,

但如果使用instaceof去测试会发现arguments不是一个Array对象,尽管看起来很像。

另外:

测试

var a = new Array();
if (a instanceof Object) {
alert('Y');
} else {
alert('N');
}

得到'Y'

if (window instanceof Object) {
alert('Y');
} else {
alert('N');
}

得到'N'

所以,这里的instanceof测试的object是指js语法中的object,不是指dom模型对象。

使用typeof会有些区别

alert(typeof(window)

会得到 object

JavaScript类型判断instanceof与typeof对比的更多相关文章

  1. JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱

    JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...

  2. 类型判断----小白讲解typeof,instanceof,Object.prototype.toString.call()

    1.typeof只能判断基本类型数据, 例子: typeof 1 // "number" typeof '1' // "string" typeof true ...

  3. javascript类型判断最佳实践

    javascript有8种数据类型 值类型 Number Null Undefined String Symbol Boolean BigInt 引用类型 Object Array Function ...

  4. JavaScript 类型判断的那些事

    先准备几个变量 var a = "abcde."; var b = 222; var c= [1,2,3]; // 或者 new Array() var d = new Date( ...

  5. JavaScript类型判断详解(Object.prototype.toString.call()方法进行数据类型的可靠判断)

    前言 在编写一些类库中,我们经常需要判断一些未知的用户的输入和配置,故而需要进行一系列的类型判断.故而总结下JS是如何进行类型判断的 typeof typeof操作符返回一个字符串,表示未经计算的操作 ...

  6. JavaScript类型判断

    几种方法:typeof,instanceof,Object.prototype.toString,constructor,duck type ES6引入了一种新的原始数据类型Symbol,表示独一无二 ...

  7. javascript类型判断方法

    判断javascript中的类型,共有四种常用的方法 var a=6; var b="str"; var c=true; var arr=[]; typeof 用于基本类型的判断 ...

  8. javaScript 类型判断

    直接上例子: 1 判断是否为数组类型 2 判断是否为字符串类型 3 判断是否为数值类型 4 判断是否为日期类型 5 判断是否为函数 6 判断是否为对象 1 判断是否为数组类型 linenum < ...

  9. JavaScript中instanceof与typeof运算符的用法及区别详细解析

    JavaScript中的instanceof和typeof常被用来判断一个变量是什么类型的(实例),但它们的使用还是有区别的: typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typ ...

随机推荐

  1. hadoop安装

    环境 RedHad Linux9.0  java6   hadoop1.2.1 hadoop下载地址:http://mirror.bit.edu.cn/apache/hadoop/common/ 版本 ...

  2. ThreadLocal()理解

    在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使用 ...

  3. C++学习笔记(2)

    本学习笔记是C++ primer plus(第六版)学习笔记.是C++学习笔记(1)的后续.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p ...

  4. thrift中的超时(timeout)坑

    最近在项目中采用thrift作为后台服务rpc框架,总体用下来性能还不错,跨语言特性使用起来也还行,但是也遇到了一些坑,其中之一就是超时问题(timeout),如果服务端些的某些业务场景耗时较长,th ...

  5. 使用adb shell 进入手机修改文件的权限

    1.将android的tools目录加入到path中,或者直接在adb.exe路径下启动cmd窗口2.adb shell 进入手机后,发现是 $ ,不是 # 号3.在进入shell后运行 su ,就可 ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. JS组件系列——分享自己封装的Bootstrap树形组件:jqTree

    前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第 ...

  8. Memcached telnet端命令

    Command Description Example get Reads a value get mykey set Set a key unconditionally set mykey 0 60 ...

  9. javascript 中断函数的使用 setInterval()——返回顶部

    方法名称:gotop() 功能描述:点击某个元素,调用方法gotop(),固定间隔,滚动至屏幕顶部 日期 :2016.06.06 16:02 author  :cyh2009@live.com < ...

  10. 【IIS】iis6.1下添加两个ftp站点,

    1,添加本地账户或密码||组  :[控制面板-->管理工具-->计算机管理器-->系统工具-->本地用户和组] 2,IIS站点目录先(添加FTP站点)[注意:多个站点多个端口] ...