typeof和instanceof的区别

typeof和instanceof都可以用来判断变量,它们的用法有很大区别:

typeof会返回一个变量的基本类型,只有以下几种:number,boolean,string,object,undefined,function;例:

alert(typeof(1));//number

alert(typeof("abc"));//string

alert(typeof(true));//boolean

alert(typeof(m));//undefined

如果我们想要判断一个变量是否存在,可以使用typeof:(不能使用if(a) 若a未声明,则报错)

if(typeof a != 'undefined'){

//变量存在

}

instanceof返回的是一个布尔值,如:

var a = {};

alert(a instanceof Object);  //true

var b = [];

alert(b instanceof Array);  //true

需要注意的是,instanceof只能用来判断对象和函数,不能用来判断字符串和数字等,如:

var b = '123';

alert(b instanceof String);  //false

alert(typeof b);  //string

var c = new String("123");

alert(c instanceof String);  //true

alert(typeof c);  //object

另外,用instanceof可以判断变量是否为数组

大家都知道js中可以使用typeof来判断变量的基本类型,如:

alert(typeof '111'); // "string"

alert(typeof 22); // "number"

alert(typeof a); // "undefined"

alert(typeof undefined); // "undefined"

alert(typeof []); // "object"

但是这个方法不适用于来判断数组,因为不管是数组还是对象,都会返回object,这就需要我们需求其他的方法。

有几种方法可以拿来判断:

1、constructor属性

这个属性在我们使用js系统或者自己创建的对象的时候,会默认的加上,例如:

var arr = [1,2,3];  //创建一个数组对象

arr.prototype.constructor = Array;  //这一句是系统默认加上的

所以我们就可以这样来判断:

var arr = [1,2,3,1];

alert(arr.constructor === Array);   // true

2、instanceof

instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:

var arr = [1,2,3];

alert(arr instanceof Array);   // true

最后,为了给大家一个结果,现写出一个终极解决方案:

判断数组终极解决方案

var arr = [1,2,3];

function isArrayFn(obj){  //封装一个函数

if (typeof Array.isArray === "function") {

return Array.isArray(obj); //浏览器支持则使用isArray()方法

}else{                     //否则使用toString方法

return Object.prototype.toString.call(obj) === "[object Array]";

}

}

alert(isArrayFn(arr));// true

js intanceof 或 typeof的更多相关文章

  1. 聊聊js中的typeof

    内容: 1.typeof 2.值类型和引用类型 3.强制类型转换 typeof 官方文档:typeof 1.作用: 操作符返回一个字符串,指示未经计算的操作数的类型. 2.语法: typeof ope ...

  2. Ext JS中的typeOf

    Ext JS中的typeOf:以字符串格式,返回给定变量的类型 其中对字符串对象.元素节点.文本节点.空白文本节点判断并不准确 测试代码如下: <!DOCTYPE HTML PUBLIC &qu ...

  3. 浅谈JS中的typeof和instanceof的区别

    JS中的typeof和instanceof常用来判断一个变量是否为空,或者是什么类型. typeof typeof运算符返回一个用来表示表达式的数据类型的字符串. typeof一般返回以下几个字符串: ...

  4. JS类型判断typeof PK {}.toString.call(obj)

    参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...

  5. js中的typeof name

    js中的name 使用typeof name得到  string.. 因为name是全局变量,可以在任意浏览器中使用 . cosole.dir(window)查看.. console.log(type ...

  6. JS isArray、typeof、instanceof

    Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...

  7. js instanceof和typeof的区别及简单用法

    js中判断一个变量的类型,通常的做法是用typeof方法,看它返回的是 什么,但是对于数组和对象它返回的都是object,ECMAScript引入了java中的instanceof 方法来弥补这一缺陷 ...

  8. JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)

    Ajax前台向后台传递对象: 数据准备 将js对象或者json对象转换为json字符串在Ajax传递,在后台中再将json字符串转换为json对象,再转换为java对象或在前端和后端构造一样的数据结构 ...

  9. 一文搞懂js中的typeof用法

    基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好 ...

随机推荐

  1. MySql中的concat()相关函数

    concat 函数的基本应用一: SQL CONCAT函数用于将两个字符串连接起来,形成一个单一的字符串.试试下面的例子: SQL> SELECT CONCAT('FIRST ', 'SECON ...

  2. 前端:微信支付和支付宝支付在pc端和h5页面中的应用

    1:h5微信支付 使用的是https://pay.weixin.qq.com/wiki/doc/api/index.html  中的 (1):公司需要首先要配置公众号微信支付地址和测试白名单(支付的时 ...

  3. Virtualbox环境中安装Oracle 11gr2 RAC(ASM)

    系统Oracle Linux 6.5,Oracle 11.2.0.1 终于开始安装ASM和RAC的行程了.开始前需要想清楚的几个事情: 如何规划网络配置(配置多网卡,实现连通性,规划内外网,eth0, ...

  4. iOS:Xcode7下创建 .a静态库 和 .framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

  5. Solr学习、安装与Quick Start

    之前用Lucene进行了一些简单的例子,现在安装Solr学习一下. 在mac下,貌似可以直接brew install solr来进行安装.尝试一下. 貌似安装成功了: ==> Summary

  6. nagios监控redis

    nagios是非常强大的监控工具,但是它本身没有监控redis的功能 但是网上有很多大神写了监控redis的插件,比较热门的使用perl写的check_redis.pl 但是由于我们监控mongodb ...

  7. 深入理解AMD和RequireJS!

    AMD 基于commonJS规范的nodeJS出来以后,服务端的模块概念已经形成,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行.但是,由于一个重大 ...

  8. scrapy-splash抓取动态数据例子十一

    一.介绍 本例子用scrapy-splash抓取活动树网站给定关键字抓取活动信息. 给定关键字:数字:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信息 ...

  9. Memcachedclientutils类

    0.个人标签 我的CSDN博客地址: http://blog.csdn.net/caicongyang 1.依赖的jar包 commons-pool-1.5.6.jar slf4j-api-1.6.1 ...

  10. Java8 读写锁的改进:StampedLock(笔记)

         StampedLock是Java8引入的一种新的所机制,简单的理解,可以认为它是读写锁的一个改进版本,读写锁虽然分离了读和写的功能,使得读与读之间可以完全并发,但是读和写之间依然是冲突的,读 ...