如何检查 var 是不是是 JavaScript 中的字符串?
Posted
技术标签:
【中文标题】如何检查 var 是不是是 JavaScript 中的字符串?【英文标题】:How can I check if a var is a string in JavaScript?如何检查 var 是否是 JavaScript 中的字符串? 【发布时间】:2011-09-11 07:22:52 【问题描述】:如何检查 var 是否为 javascript 中的字符串?
我试过了,还是不行……
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string')
// this is a string
【问题讨论】:
Check whether variable is number or string in javascript 的可能重复项 这也是Check if a variable is a string in JavaScript的副本 【参考方案1】:你很亲密:
if (typeof a_string === 'string')
// this is a string
在相关说明中:如果使用new String('hello')
创建字符串,则上述检查将不起作用,因为类型将改为Object
。有一些复杂的解决方案可以解决这个问题,但最好避免以这种方式创建字符串。
【讨论】:
伙计们,我真的会给你们两个都接受的答案,但我不能,我所能做的就是+1 给两者,而不是在谁更接近我的情况下给出接受的答案具体问题,我还没有完全解释。 这对我有用if(typeof(str) === typeof(String()))
【参考方案2】:
typeof
运算符不是中缀(因此您的示例中的 LHS 没有意义)。
你需要这样使用它......
if (typeof a_string == 'string')
// This is a string.
请记住,typeof
是一个运算符,而不是一个函数。尽管如此,您会看到typeof(var)
在野外被大量使用。这和var a = 4 + (1)
一样有意义。
另外,你也可以使用==
(相等比较运算符),因为两个操作数都是String
s(typeof
总是返回一个String
),JavaScript 被定义为执行与我使用===
(严格比较运算符)时相同的步骤。
作为Box9 mentions,这个won't detect 是一个实例化的String
对象。
你可以用......来检测它。
var isString = str instanceof String;
jsFiddle.
...或...
var isString = str.constructor == String;
jsFiddle.
但是这在多window
环境中不起作用(想想iframe
s)。
你可以通过...解决这个问题
var isString = Object.prototype.toString.call(str) == '[object String]';
jsFiddle.
但同样,(如Box9 mentions),您最好只使用文字String
格式,例如var str = 'I am a string';
.
Further Reading.
【讨论】:
@Box9 不用担心,反正我是代表上限:P @alex 我现在也是:o(还有 10 分钟!) @RobG Rep capped 是指您在 24 小时内获得的最大次数。之后,点赞不计入您的声誉。 难道不能通过简单地测试是否存在只有字符串具有的成员来检查变量是否为字符串?例如:if(myVar.toUpperCase) alert('I am a string');
?见:jsfiddle.net/tb3t4nsx
@ingredient_15939 这不是一个好方法...因为 toUpperCase: ''
【参考方案3】:
结合前面的答案提供了这些解决方案:
if (typeof str == 'string' || str instanceof String)
或
Object.prototype.toString.call(str) == '[object String]'
【讨论】:
【参考方案4】:以下表达式返回true:
'qwe'.constructor === String
以下表达式返回true:
typeof 'qwe' === 'string'
以下表达式返回 false(原文如此!):
typeof new String('qwe') === 'string'
以下表达式返回true:
typeof new String('qwe').valueOf() === 'string'
最好和正确的方式(imho):
if (someVariable.constructor === String)
...
【讨论】:
【参考方案5】:现在我认为最好使用 typeof() 的函数形式,所以...
if(filename === undefined || typeof(filename) !== "string" || filename === "")
console.log("no filename aborted.");
return;
【讨论】:
typeof
没有函数形式,你只是用这些括号控制操作的顺序。有些人可能会发现它在某些情况下更具可读性。
@Jonz “控制操作顺序”是什么意思?谢谢。
我想后来我意识到你可以检查构造函数并更喜欢它,因为理论上我认为它会更快但它不是更快?此处的示例编号 4 显示了括号用法 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 它肯定更具可读性,并且编译器解析要考虑的更少。我对“顺序”的猜测可能是速度问题或与编译器如何加载参数堆栈有关,我不确定。
@a20 操作顺序描述了对包含多个操作的语句执行操作的顺序。请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - 括号(操作分组)具有最高的运算符优先级,因此首先计算。在这种情况下,filename
周围的括号仅对单个语句进行分组,因此无用且无关紧要。这个答案的得分为 0 是一件好事,因为它是错误的、误导的和无益的;如果有负分就更好了。
非常感谢您提供的链接。所以括号先检查并运行?所以应该立即运行而不检查下一个不带括号的调用 aka 的其他方式,这将是稍后和更慢的步骤?不?我对那里的运行时编译器有什么不了解的地方。【参考方案6】:
在所有情况下检查 null 或 undefined a_string
if (a_string && typeof a_string === 'string')
// this is a string and it is not null or undefined.
【讨论】:
typeof null
和typeof undefined
永远不会返回'string'
,所以typeof a_string
就足够了。很抱歉发布了 necropost【参考方案7】:
我个人的方法似乎适用于所有情况,它是测试是否存在所有仅在字符串中出现的成员。
function isString(x)
return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
见:http://jsfiddle.net/x75uy0o6/
我想知道这种方法是否存在缺陷,但多年来我一直很好用。
【讨论】:
这很容易被任何具有这些方法的旧对象所愚弄。 这被称为鸭式打字 - 例如如果它像一根绳子一样走路,它像一根绳子一样说话,它也可能是一根绳子。如果您认为这是测试字符串的最佳方法,那您有点疯狂,但 Javascript 是 Thunderdome,您就是这样。以上是关于如何检查 var 是不是是 JavaScript 中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 javascript 中检查此布尔哈希图是不是为空? [复制]
Ruby,Rails - 如何检查 var 是不是是电子邮件