经常有人会在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. 【2016-10-17】【坚持学习】【Day8】【简单工厂模式】

    今天学习简单工厂模式, 结构 一个抽象产品 多个具体产品 一个工厂类,通过传入参数,new出不同的产品 代码: abstract class Product { //所有产品类的公共业务方法 publ ...

  2. 发一份shiro标准配置,特此记录

    主要还是整合了本地ehcache,集群session管理过段时间放出 <?xml version="1.0" encoding="UTF-8"?> ...

  3. CF733C Epidemic in Monstropolis[模拟 构造 贪心]

    C. Epidemic in Monstropolis time limit per test 1 second memory limit per test 256 megabytes input s ...

  4. linux下更新python

    刚开始入门python,想直接入门python3,需要更新一下linux自带的python.自带的python是2.6,可以在终端root下键入python查看python版本. 1.从官网下载pyt ...

  5. typescript实现react中的批次式更新

    欢迎吐槽讨论 前言 笔者在React经常使用setState,在学习过程中作笔记以作总结,欢迎讨论. 关于setState的核心观点 1 . 执行setState不都是异步的. 2 . setStat ...

  6. cf Round 607

    A.Chain Reaction(DP+二分) 题意:一排有n个灯塔,每个灯塔给出坐标xi和力量yi,每次从最右边依次点亮灯塔,每点亮一个灯塔,它左边的距离它yi范围内的灯塔将受到损坏.现在允许在最右 ...

  7. Java连接Oracle database小结

    利用jdbc连接Oracle数据库,首先得选对jdbc的版本. jdk6需要ojdbc6.jar这个包.如果选错的话,调用isValid()这个方法时,有可能有这个异常: Exception in t ...

  8. 使用Cordova和JQM在ios上需要注意的问题

    1.ios编译 cordova platform add ios --save cordova build ios 2.IOS 微信和地图調用問題:因IOS 9.0以上版本白名單限制,衹有加入白名單的 ...

  9. cookie学习指南

    一.什么是cookie cookie也叫HTTP cookie,最初是用来客户端和服务器端进行会话用的,由于HTTP是一种无状态的协议,为了维持用户和跟踪用户信息,所以引入了cookie和sessio ...

  10. ECMAScript 6 Features 中文版

    ECMAScript 6 Features 中文版 如词不达意,欢迎提 PR & issue 采用中英混排的方式进行译制,如不解请查看对应原文 本文档将与原作者的 文档 保持同步更新,欢迎关注 ...