typeof 和 instanceOf的区别

【雕爷学编程】Arduino 手册之 type of data 数据类型 也可以像上面那样不指定数组大小,由编译器计算后面的字符串常量的大小来确定数组大小,不过需要注意的是,字符串末尾都有一个不可见的结束符\0,因此其长度比我们看到的字符数量多一个字节。Arduino开发语言是基于C/C++编程语言的,因此Arduino家族中的8位开发板和32位开发板的基本数据类型是有差别的。char表示字符类型。注意:上述类型的字节和取值范围是对于Arduino常用的16位AVR控制器来说的,对于32位的控制器,如Arduino Due,int型和unsigned int型占用4字节。 阅读详情

关于typeof

typeof一元运算符,用来返回操作数类型的字符串。

typeof几乎不可能得到它们想要的结果。typeof只有一个实际应用场景,就是用来检测一个对象是否已经定义或者是否已经赋值。而这个应用却不是来检查对象的类型。

ValueClassType
"foo"Stringstring
new String("foo")Stringobject
1.2Numbernumber
new Number(1.2)Numberobject
trueBooleanboolean
new Boolean(true)Booleanobject
new Date()Dateobject
new Error()Errorobject
[1,2,3]Arrayobject
new Array(1, 2, 3)Arrayobject
new Function("")Functionfunction
/abc/gRegExpobject (function in Nitro/V8)
new RegExp("meow")RegExpobject (function in Nitro/V8)
{}Objectobject
new Object()Objectobject

上面表格中,Type 一列表示 typeof 操作符的运算结果。可以看到,这个值在大多数情况下都返回 "object"。

Class 一列表示对象的内部属性 [[Class]] 的值。

JavaScript 标准文档中定义: [[Class]] 的值只可能是下面字符串中的一个: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.
为了获取对象的 [[Class]],我们需要使用定义在 Object.prototype 上的方法 toString。

对象的类定义

JavaScript 标准文档只给出了一种获取 [[Class]] 值的方法,那就是使用 Object.prototype.toString。

function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

is('String', 'test'); // true
is('String', new String('test')); // true

上面例子中,Object.prototype.toString 方法被调用,this 被设置为了需要获取 [[Class]] 值的对象。

注:Object.prototype.toString 返回一种标准格式字符串,所以上例可以通过 slice 截取指定位置的字符串,如下所示:

Object.prototype.toString.call([])    // "[object Array]"
Object.prototype.toString.call({})    // "[object Object]"
Object.prototype.toString.call(2)    // "[object Number]"

注:这种变化可以从 IE8 和 Firefox 4 中看出区别,如下所示:

// IE8
Object.prototype.toString.call(null)    // "[object Object]"
Object.prototype.toString.call(undefined)    // "[object Object]"

// Firefox 4
Object.prototype.toString.call(null)    // "[object Null]"
Object.prototype.toString.call(undefined)    // "[object Undefined]"

测试为定义变量

typeof foo !== 'undefined'

上面代码会检测 foo 是否已经定义;如果没有定义而直接使用会导致 ReferenceError 的异常。 这是 typeof 唯一有用的地方。

结论

为了检测一个对象的类型,强烈推荐使用 Object.prototype.toString 方法; 因为这是唯一一个可依赖的方式。正如上面表格所示,typeof 的一些返回值在标准文档中并未定义, 因此不同的引擎实现可能不同。

除非为了检测一个变量是否已经定义,我们应尽量避免使用 typeof 操作符。

xtypeof x
undefined"undefined"
true 或false"boolean"
任意数字或者NaN"number"
任意字符串"string"
函数对象(在ECMA-262术语中,指的是实现了[[Call]] 的对象)"function"
任意内置对象(非函数)"object"
数组"obeject"
null"object"
宿主对象(JS引擎内置对象,而不是DOM或者其他提供的)由编译器各自实现的字符串,但不是"undefined","number","boolean","number","string"。
正则表达式各浏览器表现不一

如果想将null和对象区分开,则必须针对特殊值显式检测。如:my_value===null。对于宿主对象来说,typeof有可能并不返回‘object’,而返回字符串。但实际上客户端js中的大多数宿主对象都是‘object’类型。对于所有内置可执行对象进行typeof运算都将返回“function”。

// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写,意思是"不是一个数字"
typeof Number(1) === 'number'; // 不要这样使用!

// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof返回的肯定是一个字符串
typeof String("abc") === 'string'; // 不要这样使用!

// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 不要这样使用!

// Undefined
typeof undefined === 'undefined';
typeof blabla === 'undefined'; // 一个未定义的变量,或者一个定义了却未赋初值的变量

// Objects
typeof {a:1} === 'object';
typeof [1, 2, 4] === 'object'; 
// 使用Array.isArray或者Object.prototype.toString.call方法
//可以分辨出一个数组和真实的对象
typeof new Date() === 'object';

typeof new Boolean(true) === 'object' // 令人困惑.不要这样使用
typeof new Number(1) === 'object' // 令人困惑.不要这样使用
typeof new String("abc") === 'object';  // 令人困惑.不要这样使用
// Functions
typeof function(){} === 'function';
typeof Math.sin === 'function';






关于instanceof

instanceof 左操作数是一个类,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true.而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。

instanceof 运算符是用来测试一个对象是否在其原型链原型构造函数的属性。其语法是object instanceof constructor

instanceof 操作符用来比较两个操作数的构造函数。只有在比较自定义的对象时才有意义。 如果用来比较内置类型,将会和 typeof 操作符 一样用处不大。

比较自定义对象

function Foo() {}
function Bar() {}
Bar.prototype = new Foo();

new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true

// 如果仅仅设置 Bar.prototype 为函数 Foo 本身,而不是 Foo 构造函数的一个实例
Bar.prototype = Foo;
new Bar() instanceof Foo; // false

instanceof 比较内置类型

new String('foo') instanceof String; // true
new String('foo') instanceof Object; // true

'foo' instanceof String; // false
'foo' instanceof Object; // false

有一点需要注意,instanceof 用来比较属于不同 JavaScript 上下文的对象(比如,浏览器中不同的文档结构)时将会出错, 因为它们的构造函数不会是同一个对象。

结论:instanceof 操作符应该仅仅用来比较来自同一个 JavaScript 上下文的自定义对象。 正如 typeof 操作符一样,任何其它的用法都应该是避免的。

function C(){} // defining a constructor
function D(){} // defining another constructor

var o = new C();
o instanceof C; // true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false, because D.prototype is nowhere in o's prototype chain
o instanceof Object; // true, because:
C.prototype instanceof Object // true

C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false, because C.prototype is nowhere in o's prototype chain anymore

D.prototype = new C(); // use inheritance
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

var myString = new String();
var myDate = new Date();

myString instanceof String; // returns true
myString instanceof Object; // returns true
myString instanceof Date;   // returns false

myDate instanceof Date;     // returns true
myDate instanceof Object;   // returns true
myDate instanceof String;   // returns false
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car;    // returns true
var b = mycar instanceof Object; // returns true

引用资料:

  1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
  2. http://bonsaiden.github.io/JavaScript-Garden/zh/#types.instanceof
  3. https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof
arduino-1.8.2-windows Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。 立即下载

相关推荐

从零搭建企业网络:使用Packet Tracer模拟多区域OSPF组网全过程

本文通过Cisco Packet Tracer模拟,详细演示了从零搭建一个典型企业多区域OSPF网络的完整流程。内容涵盖网络拓扑规划、IP地址设计、多区域划分原理,并提供了从设备初始化、接口配置到OSPF多区域核心配置与验证的详细步骤。文章旨在帮助网络学习者与IT支持人员通过动手实验,将理论知识转化为实际的配置与排障能力。

day7的博客 1029

JS数据类型判断,typeof和instanceof的区别

typeof和instanceof的区别 typeof 用于数据类型的判断,返回值有number、string、boolean、function、undefined、object 六个。 <script> var a, b, c, d, e, f,g,h,i; a = [1, 2, 3, 4, 5]; b = 1; c = "weaface"; d = false; f = null;

qq_53884837的博客 4149

FPGA实战笔记——SDRAM乒乓缓存与OV5640视频采集(VGA显示优化篇)

本文详细介绍了基于FPGA的SDRAM乒乓缓存技术在OV5640视频采集与VGA显示优化中的应用。通过设计多时钟域同步和双Bank乒乓缓存策略,有效解决了摄像头30fps输出与VGA 60fps显示之间的帧率不匹配问题,实现了720P高清视频的流畅稳定显示,为实时图像处理系统提供了可靠的硬件解决方案。

ss78901的博客 882

JS中判断数据类型:typeof与instance of

1: typeof: 1:typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number, string, object,boolean, function, undefined, symbol 这七种类型, 2:但是,typeof 在判断一个 object的数据的时候只能告诉我们这个数据是 object, 而不能细致的具体到是哪一种 object 3:所以在typeof判断类型的基础上,我们还需要利用Object.prototype.toString方法来进一步判断数据

czj1049561601的博客 721

多普勒频移测速与FMCW测距

文章目录时域与频域基于多普勒频移估计速度基于传统的FMCW测距什么是FMCWFMCW测距原理参考论文 时域与频域 时域 — 自变量是时间,即横轴是时间,纵轴是信号振幅的变化。表示振幅随时间的变化。 频域 — 自变量是频率,即横轴是频率,纵轴是该频率信号幅度的峰值。表示振幅峰值随频率的变化。 基于多普勒频移估计速度 当发送端静止而接收端相对运动时,有: v=FsFcv=\frac{F^s}{F}cv=FFs​c 其中,F是信号的原始频率;FsF^sFs 是接收信号频率与发送信号频率之差,即多普勒频移;c是

dsaaf21的博客 9186

Tomcat漏洞——弱口令爆破

靶机:CentOS7 IP:192.168.100.40。攻击机:kali IP:192.168.100.60。版 权 声 明:本博客所有文章除特别声明外,均采用。文章版权归作者所有,未经允许请勿转载!作 者:PeiyuJue。

weixin_57379923的博客 909

js判断数据类型的几种方法及其局限性(typeof, instanceof, Object.prototype.toString.call())

​ js中判断了类型的方法有很多, 这篇文章主要来说一下常用的几种判断类型的方法,以及使用:每个方法都各有优缺点,在日常使用的时候请结合这些优缺点进行斟酌:javaScript中typeof可以判断以下类型:undefined: 未定义的变量或者值boolean: 布尔类型, true 或falsenumber: 数值类型, 包括整数,浮点数, NaN, 和Infinity (无穷大)string: 字符串类星星, 表示文本symbol:符号类型,ES6中新增的基本数据类型function: 函数类型,可以

Angel_Tears_的博客 1812

深度解析与实战:长短时记忆网络(LSTM)在股票走势预测中的应用(基于Python + PyTorch)

本文全面探讨了LSTM在股票价格预测中的应用,从理论基础到实践操作。文章首先强调了股票市场预测的重要性,并介绍了LSTM网络结构及其在处理时间序列数据中的优势。接着,详细说明了数据预处理的关键步骤,包括数据收集、清洗、特征选择和归一化。文章还讨论了LSTM模型的构建、训练和评估,并提供了Python及PyTorch的实操案例。最后,总结了LSTM在股票预测的成果,并提出了未来研究的方向,如模型优化和特征工程,旨在帮助读者掌握LSTM在股票价格预测中的应用,并探索提升模型性能的方法。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2100

JavaScript数据类型判断:instanceof运算符的使用及特殊情况

在JavaScript编程中,我们经常需要判断数据的类型以便执行相应的逻辑。instanceof运算符是一种常用的方法,用于检测对象是否属于特定的构造函数。本篇博客将介绍instanceof运算符的使用,并探讨一些特殊情况。

m0_58013334的博客 1125

DFI协议时序

参数名称典型值应用场景关键影响tcmd_lat1-2个时钟周期命令与地址锁存同步地址错误风险tphy_wrlat1-2个时钟周期写操作响应速度写带宽与延迟2-3个时钟周期写操作端到端延迟系统吞吐量1-2个时钟周期连续写命令间隔信号干扰与资源冲突tphy_rdlat1-2个时钟周期读操作响应速度读带宽与延迟trddata_en由CL决定(如0.41 ns)读数据返回时间系统延迟10-20 ps写数据与命令对齐数据丢失风险<1 µs低功耗模式切换。

qq_43134430的博客 5101

【C++】构造函数之初始化列表(Initialization list of constructors)

本讲主要是构造函数的初始化列表的讲节,但是本节很重要,可以关乎后面写项目

m0_62599305的博客 2232

typeof和instanceof的区别是什么?

typeof和instance of 的区别

qq_51441159的博客 7508

48、基于头部电信号和触觉的人机交互技术研究

本文探讨了基于头部电信号控制决策和触觉感知的人机交互技术。通过EEG信号采集与ANN模型(TDNN/PRNN)分析,实现对用户意图的识别;同时利用触觉传感接口识别操作员有意接触,提升人机协作安全性。研究涵盖系统设计、数据处理流程、实验结果及技术拓展方向,并展望了两种技术在工业、医疗与智能家居等领域的融合应用前景。

i1j2k的博客 98

typeof和instanceof的区别

1:操作数数量不同 typeof的操作数是 1个 instanceof的操作数是 2个 # 1个操作数 console.log(typeof('strings')); # 2个操作数 var c = new String('Hellos'); console.log(c instanceof String); 2:返回值不同 typeof返回的是字符串 数据类型 instanceof返回的是布尔值 3:操作数类型不同 typeof操作的可以是简单数据类型,函数,或者对象 instanceof操作的 左边

Always-Learning 575

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

js instanceof 与 typeof的区别,实现 instanceof

instanceof 可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype typeof 是判断参数是什么类型的实例,返回值为说明运算数类型的字符串。 返回值结果:“number”、“string”、“boolean”、“object”、“function”、“undefined”

guoqing的博客 1021

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

instanceof和typeof的区别

instanceof和typeof是JavaScript中用于检测变量类型的运算符,但两者的用途和机制存在本质差异。操作符用途适用类型返回值典型用途typeof判断基本数据类型原始类型、函数字符串判断 number、string 等instanceof判断对象的原型链关系对象布尔值判断对象属于哪个类。

2402_88963084的博客 703

typeof与instanceof的区别和用法

一、typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型。 console.log(typeof 3.14); //number console.log(typeof Math.LN2); //number console.log(typeof Infinity); //number console.log(typeof NaN); // number NaN是"Not-...

qq_43437571的博客 466

typeof与instanceof的区别及用法

js中typeof与instanceof的区别 在我们运用JavaScript中typeof与instanceof是我们经常用到来判断一个变量的类型,以及是否为空,但是他们两者之间还是有较大的区别的,首先来说typeof typeof typeof的返回值是个字符串,返回的字符串表达了程序员想要输出的变量类型 然而typeof返回的结果通常情况下一般都是以下6个: number string bo...

刘毅鹏的博客 5075

JS中的typeof和instanceof的区别

JS中的typeof和instanceof的区别 01:typeof常用来判断一个变量【可以是基本数据类型的变量/对象数据类型的变量】 是什么类型。 instanceof 仅仅 用来判断一个 对象 是否是 指定的 对象数据类型 的一个 实例。 区别: 1:typeof操作符 作用域 五种基本数据类型的变量 和 一种复杂数据类型的变量 , 返回值 是: string number boolean undefined null object function 2:当typeof操作符 无论是 作

qq_19373729的博客 611

typeof与instanceof区别

虽然typeof null为object,但这只是JavaScript存在的一个悠久Bug,不代表null就是引用数据类型,并且本身也不是对象。所以,null在typeof之后返回的是有问题的结果,不能作为判断null的方法。如果需要通用检测数据类型,可以采用Object.prototype.toString,调用该方法,统一返回格式"[object Xxx]"的字符串。同时,可以发现引用类型数据,用typeof来判断的话,除了function会被识别出来之外,其余的都输出object。

2301_80060263的博客 403

typeof与instanceof的区别

typeof与instanceof的区别 一、typeof typeof是一个一元运算,放在一个运算数之前,运算数可以是任意类型。 它返回值是一个字符串,该字符串说明运算数的类型。(typeof 运算符返回一个用来表示表达式的数据类型的字符串。 ) typeof的返回值类型有七种 number, boolean, string, undefined, object, function,symbol...

qq_43287488的博客 388

typeof 与 instanceof 有什么区别

所以,null 在 typeof 之后返回的是有问题的结果,不能作为判断null的方法。而 typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了 function 类型以外,其他的也无法判断。同时,可以发现引用类型数据,用typeof来判断的话,除了function会被识别出来之外,其余的都输出object。如果我们想要判断一个变量是否存在,可以使用typeof:(不能使用if(a), 若a未声明,则报错)operand表示对象或原始值的表达式,其类型将被返回。

weixin_67762121的博客 194

在js中 typeof和instanceof的区别

typeof和instanceof的区别 typeof与instanceof都是用来判断数据类型的,返回值是否为空等情况,但是他们具体的情况该如何区分? 1.首先两者返回的值不同。 typeof返回的值是一个字符串,而, instanceof返回的是布尔类型的值,判断是true或者false。 typeof返回的类型有: number,boolean,string,function,objec...

qq_43060624的博客 241

typeof和instanceof区别

typeof返回小写字母字符串表示数据属于什么类型,instanceof返回布尔值。Undefined、Null、Boolean、Number和String。typeof检测数据类型,instanceof检测对象之间的关联性。typeof是1个,instanceof是2个。typeof是简单数据类型、函数或者对象,

weixin_42178670的博客 574
上一篇: 新手学跨域之Jsonp
下一篇: 使用 Etcd 和 Haproxy 做 Docker 服务发现
formyth
博客等级 码龄17年 9粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值