目标:实现一段代码,判断一个变量的值是否为字符串 ?
方法一:
javascript
function isString1(str){ if(typeof str=="string"){ console.log("是字符串"); return true; }else{ console.log("不是字符串"); return false; } }
方法二:
javascript
//判断是否是字符串 function isString2(str){ if(Object.prototype.toString.call(str) === "[object String]"){ console.log("是字符串"); return true; }else{ console.log("不是字符串"); return false; } }
方法一也是能判断传入的变量是否为字符串的,为何说方法二更优?该如何理解方法二呢?
javascript
var a=2; var b="2"; var c=[]; var d=function(){}; var e={}; var f; isString1(a);// 不是字符串 isString1(b);// 是字符串 isString1(c);// 不是字符串 isString1(d);// 不是字符串 isString1(e);// 不是字符串 isString1(f);// 不是字符串 console.log("下面是讨论给出的参考:"); isString2(a);// 不是字符串 isString2(b);// 是字符串 isString2(c);// 不是字符串 isString2(d);// 不是字符串 isString2(e);// 不是字符串 isString2(f);// 不是字符串
问题是:谁跟你说方法二更好的? 哪个权威告诉你的?
这俩方法其实都挺好的呀!
typeof
胜在速度快,Object.prototype.toString.call
性能不如typeof
,但胜在可通用,不光可以检测String
类型,Arguments
,Number
,Boolean
,Date
,RegExp
,Error
,Function
,Array
,Math
,JSON
,Promise
,Map
,Set
这些对象子类型通通可以一块检测了,多方便,所以许多 Library 通常采用第二种,可能只是出于偷懒的考虑,并不能说明typeof
就不好。单就检测字符串而言,我觉得
typeof
相对更好些,因为它速度最快!第二好的方法嘛,我看也排不上
Object.prototype.toString.call
,而是下面这个:胜在简洁、优雅
第三才是
Object.prototype.toString.call
当然了,
Object.prototype.toString.call
和typeof
对包装对象的判定结果相反:变量
s
用typeof
检测,就不是字符串类型;用Object.prototype.toString.call
检测,就是字符串类型。哪个结果对?都对!从typeof
的角度看,s
是一个引用类型值,不是原始值字符串,当然返回 false;从另一个角度看,s
属于对象类型下的字符串子类型,当然返回 true。实际上,几乎不会有人显式地在程序中书写类似
s
这样的包装对象,因为所有的编码规范都不建议这么做!所以,根本不必纠结包装对象这种特殊情况到底该返回 true 还是 false,请直接忽略这种情况!少年郎,大胆地使用
typeof
吧!PS:
stackoverflow 上的相关链接:
Check if a variable is a string
how to detect if variable is a string