经常有人会在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. postman使用之四:切换环境和设置读取变量

    postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...

  2. Mysql 存储引擎 InnoDB与Myisam的主要区别

    MySQL默认采用的是MyISAM. 1,事务处理 innodb 支持事务功能,myisam 不支持. Myisam 的执行速度更快,性能更好. MyISAM不支持事务,而InnoDB支持.InnoD ...

  3. 【转】【MySql】MySql优化要点

    如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL的出现暂时解决了这一危机 ...

  4. createElement与createDocumentFragment的点点区别

    在DOM操作里,createElement是创建一个新的节点,createDocumentFragment是创建一个文档片段. 网上可以搜到的大部分都是说使用createDocumentFragmen ...

  5. CRC校验码原理、实例、手动计算

    目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...

  6. try catch中用了 Response.Redirect 引发的线程异常终止

    记录一下,提醒自己. 今天写代码的时候,在try 中写了一句  Response.Redirect 在 catch 把页面重定向到了另外一个地方 本来是想打算,如果没出现异常,就定到页面A,如果异常了 ...

  7. 不一样的猜数字游戏 — leetcode 375. Guess Number Higher or Lower II

    好久没切 leetcode 的题了,静下心来切了道,这道题比较有意思,和大家分享下. 我把它叫做 "不一样的猜数字游戏",我们先来看看传统的猜数字游戏,Guess Number H ...

  8. 解决:error: .repo/manifests/: contains uncommitted changes

    repo sync同步时提示出错:          error: .repo/manifests/: contains uncommitted changes 解决方法: 1.cd 进入.repo/ ...

  9. HttpResponse的使用方法

    HttpResponse的使用方法: HttpRequest类是一个封闭HTTP提交信息的类型,而封闭HTTP输出信息的类型就是HttpResponse类,使用HttpResponse类可以实现三种类 ...

  10. mysql日期格式化

    DATE_FORMA T(date, format) 根据格式串format 格式化日期或日期和时间值date,返回结果串. 可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值 ...