javascript

位置:IT落伍者 >> javascript >> 浏览文章

javascript之typeof、instanceof操作符使用


发布日期:2020年11月25日
 
javascript之typeof、instanceof操作符使用

写javascirpt代码时typeof和instanceof这两个操作符时不时就会用到堪称必用但是!使用它们总是不能直接的得到想要的结果非常纠结普遍的说法认为“这两个操作符或许是javascript中最大的设计缺陷因为几乎不可能从他们那里得到想要的结果”

typeof

说明typeof返回一个表达式的数据类型的字符串返回结果为js基本的数据类型包括numberbooleanstringobjectundefinedfunction

从说明来看貌似没什么问题

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

代码如下:

var a = ;

consolelog(typeof(a)); //=>number

如果用Number类型的构造函数new一个变量的话typeof后的结果是"object"

复制代码 代码如下:

var a = new Number();

consolelog(typeof(a)); //=>object

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

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

那么对于

代码如下:

var a = ;

var b = new Number();

a和b变量的类型准确的说来都应该是Number才是想要的结果

而准确的类型信息保存在变量的内部属性 [[Class]] 的值中通过使用定义在 Objectprototype 上的方法  toString来获取

获取类型信息

代码如下:

var a = ;

var b = new Number();

consolelog(ObjectprototypetoStringcall(a));

consolelog(ObjectprototypetoStringcall(b));

输出

代码如下:

[object Number]

[object Number]

是不是已经很直接了我们稍微处理一下得到直接结果

代码如下:

var a = ;

var b = new Number();

consolelog(ObjectprototypetoStringcall(a)slice());

consolelog(ObjectprototypetoStringcall(b)slice());

输出

Number

Number

这就是想要的结果

为了更好的使用我们封装一个方法用来判断某个变量是否是某种类型:

代码如下:

function is(objtype) {

var clas = ObjectprototypetoStringcall(obj)slice( );

return obj !== undefined && obj !== null && clas ===  type;

}

定义一些变量做过测试先来看看它们的typeof输出

代码如下:

var a=;

var a=Number();

var b="hello";

var b=new String("hello");

var c=[];

var c=new Array();

consolelog("as typeof:"+typeof(a));

consolelog("as typeof:"+typeof(a));

consolelog("bs typeof:"+typeof(b));

consolelog("bs typeof:"+typeof(b));

consolelog("cs typeof:"+typeof(c));

consolelog("cs typeof:"+typeof(c));

输出

as typeof:number

as typeof:object

bs typeof:string

bs typeof:object

cs typeof:object

cs typeof:object

我们再用新作的函数是一下

代码如下:

consolelog("a is Number:"+is(a"Number"));

consolelog("a is Number:"+is(a"Number"));

consolelog("b is String:"+is(b"String"));

consolelog("b is String:"+is(b"String"));

consolelog("c is Array:"+is(c"Array"));

consolelog("c is Array:"+is(c"Array"));

输出

a is Number:true

a is Number:true

b is String:true

b is String:true

c is Array:true

c is Array:true

typeof也不是无用实际用处是用来检测一个变量是否已经定义或者是否已经赋值

instanceof

说明判断一个对象是否为某一数据类型或一个变量是否为一个对象的实例

instanceof 操作符用来比较两个内置类型的变量时一样力不从心同样会对结果不满意

代码如下:

consolelog("abc" instanceof String); // false

consolelog("abc" instanceof Object); // false

consolelog(new String("abc") instanceof String); // true

consolelog(new String("abc") instanceof Object); // true

只有在比较自定义的对象时才准确反映关系

代码如下:

function Person() {}

function Man() {}

Manprototype = new Person();

consolelog(new Man() instanceof Man); // true

consolelog(new Man() instanceof Person); // true

               

上一篇:利用js实现遮罩以及弹出可移动登录窗口

下一篇:JavaScript 模拟类机制及私有变量的方法及思路