首页 web前端 js教程 javascript之typeof、instanceof操作符使用探讨_基础知识

javascript之typeof、instanceof操作符使用探讨_基础知识

May 16, 2016 pm 05:33 PM
instanceof typeof 操作符

写javascirpt代码时,typeof和instanceof这两个操作符时不时就会用到,堪称必用。但是!使用它们总是不能直接的得到想要的结果,非常纠结,普遍的说法认为“这两个操作符或许是javascript中最大的设计缺陷,因为几乎不可能从他们那里得到想要的结果”
typeof
说明:typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function。
从说明来看,貌似没什么问题。

下面的代码写了一个数值变量,typeof后的结果是"number"。

复制代码 代码如下:

var a = 1;
console.log(typeof(a)); //=>number

如果用Number类型的构造函数new一个变量的话,typeof后的结果是"object"。
复制代码 代码如下:

var a = new Number(1);
console.log(typeof(a)); //=>object

上面的这两个输出结果看似没啥问题,这一点从书上看来是理所当然的事情,因为javascript就是这么设计的。

但是!问题就在于既然调用了typeof就应该准确返回一个变量的类型,不管是直接用值创建的还是用类型的构造函数创建的,否则!我还用你做啥!
那么对于:
复制代码 代码如下:

var a = 1;
var b = new Number(1);

a和b变量的类型准确的说来都应该是Number才是想要的结果。
而准确的类型信息保存在变量的内部属性 [[Class]] 的值中,通过使用定义在 Object.prototype 上的方法 toString来获取。

获取类型信息:
复制代码 代码如下:

var a = 1;
var b = new Number(1);
console.log(Object.prototype.toString.call(a));
console.log(Object.prototype.toString.call(b));

输出:
复制代码 代码如下:

[object Number]
[object Number]

是不是已经很直接了,我们稍微处理一下,得到直接结果:
复制代码 代码如下:

var a = 1;
var b = new Number(1);
console.log(Object.prototype.toString.call(a).slice(8,-1));
console.log(Object.prototype.toString.call(b).slice(8,-1));

输出:
Number
Number
这就是想要的结果。
为了更好的使用,我们封装一个方法,用来判断某个变量是否是某种类型:
复制代码 代码如下:

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

定义一些变量做过测试,先来看看它们的typeof输出:
复制代码 代码如下:

var a1=1;
var a2=Number(1);
var b1="hello";
var b2=new String("hello");
var c1=[1,2,3];
var c2=new Array(1,2,3);
console.log("a1's typeof:"+typeof(a1));
console.log("a2's typeof:"+typeof(a2));
console.log("b1's typeof:"+typeof(b1));
console.log("b2's typeof:"+typeof(b2));
console.log("c1's typeof:"+typeof(c1));
console.log("c2's typeof:"+typeof(c2));
输出:
a1's typeof:number
a2's typeof:object
b1's typeof:string
b2's typeof:object
c1's typeof:object
c2's typeof:object

我们再用新作的函数是一下:
复制代码 代码如下:

console.log("a1 is Number:"+is(a1,"Number"));
console.log("a2 is Number:"+is(a2,"Number"));
console.log("b1 is String:"+is(b1,"String"));
console.log("b2 is String:"+is(b2,"String"));
console.log("c1 is Array:"+is(c1,"Array"));
console.log("c2 is Array:"+is(c2,"Array"));
输出:
a1 is Number:true
a2 is Number:true
b1 is String:true
b2 is String:true
c1 is Array:true
c2 is Array:true

注:typeof也不是无用,实际用处是用来检测一个变量是否已经定义或者是否已经赋值。
instanceof
说明:判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例。
instanceof 操作符用来比较两个内置类型的变量时一样力不从心,同样会对结果不满意。
复制代码 代码如下:

console.log("abc" instanceof String); // false
console.log("abc" instanceof Object); // false
console.log(new String("abc") instanceof String); // true
console.log(new String("abc") instanceof Object); // true

只有在比较自定义的对象时才准确反映关系。
复制代码 代码如下:

function Person() {}
function Man() {}
Man.prototype = new Person();
console.log(new Man() instanceof Man); // true
console.log(new Man() instanceof Person); // true
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

instanceof有什么作用 instanceof有什么作用 Nov 14, 2023 pm 03:50 PM

instanceof的作用是判断一个对象是否是某个类的实例,或者是否实现了某个接口。instanceof是一个用于检查对象是否是指定类型的运算符。instanceof运算符使用场景:1、类型检查:可以用来判断一个对象的具体类型,以便根据不同类型执行不同的逻辑;2、接口判断:可以用来判断一个对象是否实现了某个接口,以便根据接口的定义调用相应的方法;3、向下转型等等。

Linux 命令中“!”操作符的八个神秘用途 Linux 命令中“!”操作符的八个神秘用途 Jun 27, 2023 pm 12:51 PM

在不同的shell中,使用’!’符号的大多数Linux命令用法可能会有所不同。虽然我提供的示例通常在bashshell中使用,但其他一些Linuxshell可能具有不同的实现,或者可能根本不支持某些对’!’符号的使用。让我们深入了解Linux命令中’!’符号的令人惊奇和神秘的用法。1、使用命令编号从历史记录中运行命令你可能不知道的是,你可以从历史命令中运行一个命令(已经执行过的命令)。首先,通过运行’history’命令找到命令的编号。linuxmi@linuxmi:~/www.linuxmi.

深入了解PHP中的模等于操作符的用法 深入了解PHP中的模等于操作符的用法 Mar 19, 2024 pm 12:54 PM

模等于操作符(%)在PHP中是一个非常常用的运算符,用于计算两个数相除的余数。在本文中,我们将深入了解模等于操作符的用法,并提供具体的代码示例帮助读者更好地理解。首先,让我们看一个简单的例子,假设我们需要计算一个数除以另一个数的余数:$a=10;$b=3;$remainder=$a%$b;echo"10除以3的余数是:&

java中instanceof是什么意思 java中instanceof是什么意思 Nov 13, 2023 pm 01:52 PM

在Java中,instanceof是一个二元运算符,用于检查一个对象是否是一个类的实例,或者是一个类的子类的实例,其语法形式为“object instanceof class”,其中,object是一个对象引用,class是一个类名或者接口名。

sql in操作符使用 sql in操作符使用 Aug 04, 2023 pm 03:58 PM

sql in操作符使用:1、单列匹配,可以使用IN操作符匹配一个列中的多个值;2、多列匹配,IN操作符也可以用于匹配多个列的值;3、子查询,IN操作符也可以与子查询一起使用,子查询是一个嵌套在主查询中的查询语句。

php7新增的两个操作符:“?->”和“??” php7新增的两个操作符:“?->”和“??” Mar 21, 2023 pm 03:49 PM

在之前的PHP版本中,如果我们没有定义一个变量,直接使用它会导致Undefined variable的错误。但是,在PHP7中,我们可以使用一些新功能来避免这个问题的发生。这些新功能包括两个新的操作符,即:?->和??。它们可以分别解决两种不同类型的问题。

java中instanceof运算符怎么使用 java中instanceof运算符怎么使用 May 19, 2023 am 08:16 AM

概念1、该运算符用于操作对象的例子,检查对象是否为特定类型(类型或接口类型)。格式2、如果计算器左侧变量所指的对象是操作器右侧类或接口的对象,则结果是真实的。(Objectreferencevariable)instanceof(class/interfacetype)实例packagecom.verify_instanceof;publicclassTestInstanceOf{publicstaticvoidmain(String[]args){//下面四行代码用来证明:instanceof

在Java中的instanceof运算符 在Java中的instanceof运算符 Sep 01, 2023 pm 08:01 PM

该运算符仅用于对象引用变量。该运算符检查对象是否属于特定类型(类类型或接口类型)。instanceof运算符写为-(Objectreferencevariable)instanceof(class/interfacetype)如果运算符左侧变量引用的对象通过了右侧类/接口类型的IS-A检查,则结果将为true。以下是一个示例-示例 现场演示publicclassTest{  publicstaticvoidmain(Stringargs[]){&nbs

See all articles