instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

语法

object instanceof constructor

描述

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

需要注意的是,如果表达式 obj instanceof Foo 返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的__proto__魔法属性,是可以实现的。比如执行obj.__proto__ = {}之后,obj instanceof Foo就会返回false了。

String和Date对象同时也属于Object类型

typeof

typeof操作符返回一个字符串,指示未经计算的操作数的类型。

下表总结了 typeof 可能的返回值。有关类型和原语的更多信息,可查看 JavaScript数据结构 页面。

typeof和instanceof的区别

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

typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值

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

if(typeof a != 'undefined'){

//变量存在

}

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

typeof不能用于判断是否为数组,因为都会返回object,判断是否为数组可以用一下几个方法:

1、constructor属性

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

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

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

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

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

arr.constructor === Array; // true

2、instanceof

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

arr instanceof Array; // true

3、Array.isArray()

Array.isArray(arr) // true

4、Object.prototype.toString.call()

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

Object.prototype.toString.call(arr) // "[object Array]"

判断数组终极解决方案:

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

instanceof和多全局对象(多个frame或多个window之间的交互)

在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。比如,表达式 [] instanceof window.frames[0].Array 会返回false,因为 Array.prototype !== window.frames[0].Array.prototype,因此你必须使用 Array.isArray(myObj) 或者 Object.prototype.toString.call(myObj) === "[object Array]"来判断myObj是否是数组。

java typeof_typeof和instanceof的区别相关推荐

  1. java基础之 “==”和“ equals”以及instanceof的区别

    1)对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. "=="比较两个变量本身的值,即两个对象在内存 ...

  2. 面试必问一:Java 中 == 和 equals 的区别你知道吗

    面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...

  3. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  4. Java NIO与IO的区别和比较

    Java NIO与IO的区别和比较 导读 J2SE1.4以上版本中发布了全新的I/O类库.本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO ...

  5. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array

    java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...

  6. Java中的instanceof关键字

    Java中的instanceof关键字 instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边 ...

  7. JAVA CLASSPATH 和PATH的区别 经典

    JAVA CLASSPATH 和PATH的区别 收藏 PATH: 用来指定 java 虚拟机(JVM) 所在在目录,也就是我们最常用的用来编译java源程序的javac.exe 和用来执行 *.cla ...

  8. java 接口与抽象类的区别

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  9. POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别

    POPTEST老李谈JVM.JRE.JDK.java ee sdk with jdk区别 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作 ...

最新文章

  1. Java项目:医院分诊挂号住院管理系统(java+SpringBoot+FreeMarker+Mysql)
  2. python不对字符串进行转义
  3. vmware中linux无法动态获取dhcp解决方法
  4. sql注入攻击与防御第二版读书笔记二——SQL盲注利用
  5. Easy Multiplication 快速傅里叶变换
  6. vue中mode的设置
  7. python无限循环的关键字_零基础学python-12.2 关键字pass,else,break,continue
  8. 1、Python基本对象类型----数字
  9. OS + RedHat 6.3 x64 / sshd X11 /
  10. 【编译原理】递归下降语法分析设计原理与实现
  11. mysql中一个字符等于几个字节_细说一个汉字等于几个字符,以及汉字,字符,字节,位之间的关系...
  12. 软件架构风格-调用/返回风格
  13. Python杨辉三角形
  14. unity 画球面_Unity实现球面行走
  15. 数据分析,机器学习学习用数据集[1]-搜狗新闻行业分类数据集(已分好训练测试和验证集)
  16. 获取本机内网、外网ip
  17. MPB:南土所褚海燕组-土壤宏转录组学样本前处理与数据分析
  18. 创建ArrayList对象,添加5个元素,使用Iterator遍历输出
  19. 手机社会化分享到qq好友、qq空间、微信、微信朋友圈、微博等(区分浏览器)
  20. Shiro密码加密 盐值加密

热门文章

  1. Eclipse修改项目名
  2. 里诺图书管理系统 v2.34官方版
  3. 详细解释sprintf 函数(转)
  4. java编写一个教师类Teacher_(1)编写一个Teacher类,包含授课方法;编写JavaTeacher和MathTeacher类继承自Teacher类,并重写授课方法;...
  5. 娣卞害绁炵粡缃戠粶濡備綍璁粌
  6. C语言(三)常量的定义
  7. Java使用钉钉定时发送邮件到企业邮箱
  8. windows文件服务器双机热备_服务器双机热备解决方案
  9. php parseint方法,js parseInt()方法详解
  10. JS处理前台页面的所有异常