如何检查var是否为JavaScript中的字符串?


Answers:


379

您接近:

if (typeof a_string === 'string') {
    // this is a string
}

相关说明:如果使用创建的字符串new String('hello')作为类型,则上述检查将不起作用Object。有很多复杂的解决方案可以解决此问题,但是最好避免以这种方式创建字符串。


1
伙计们,我真的会给你们两个都接受的答案,但是我不能,我只能对两个人都给+1,而不是给谁更接近我的特定问题而不是给我一个接受的答案。充分解释。
vitto

这对我if(typeof(str) === typeof(String()))
Scott Murphy

78

typeof运营商不中缀(所以你的榜样的LHS没有意义)。

您需要像这样使用它...

if (typeof a_string == 'string') {
    // This is a string.
}

请记住,typeof是运算符,而不是函数。尽管如此,您会发现typeof(var)在野外经常使用它。这和一样有意义var a = 4 + (1)

另外,==由于两个操作数均为Strings(typeof 始终返回a String),因此您也可以使用(相等比较运算符),JavaScript被定义为执行与我使用的相同步骤===(严格比较运算符)。

Box9所述,这不会检测实例化的String对象。

您可以使用...进行检测。

var isString = str instanceof String;

jsFiddle

...要么...

var isString = str.constructor == String;

jsFiddle

但这在多window环境下无法工作(认为iframe)。

您可以通过...解决此问题

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle

但是,再次(如Box9所述),最好只使用文字String格式,例如var str = 'I am a string';

进一步阅读


1
@ Box9不用担心,无论如何我都会成为上限:P
Alex

@alex我现在也是:o(还有10分钟!)
David Tang

3
@RobG代表上限是指您在24小时内获得了最大代表。在那之后,投票不会计入您的声誉。
亚历克斯

是否仅通过测试仅字符串具有的成员的存在就无法检查变量是否为字符串?例如:if(myVar.toUpperCase) alert('I am a string');?请参阅:jsfiddle.net/tb3t4nsx
ingredient_15939

1
@ ingredient_15939这不是一个好方法……因为{ toUpperCase: '' }
alex

14

结合前面的答案可以提供以下解决方案:

if (typeof str == 'string' || str instanceof String)

要么

Object.prototype.toString.call(str) == '[object String]'

4

以下表达式返回true

'qwe'.constructor === String

以下表达式返回true

typeof 'qwe' === 'string'

下面的表达式返回false(sic!):

typeof new String('qwe') === 'string'

以下表达式返回true

typeof new String('qwe').valueOf() === 'string'

最佳和正确的方法(恕我直言):

if (someVariable.constructor === String) {
   ...
}

1

现在,我相信最好使用typeof()的函数形式,以便...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

没有的函数形式typeof,您只是用这些括号控制操作的顺序。在某些情况下,某些人可能会觉得它更具可读性。
乔恩·z

@Jonz“控制操作顺序”是什么意思?谢谢。
a20

我想以后我意识到您可以检查构造函数并更喜欢它,因为从理论上讲我认为会更快,但不会更快?此处的示例4显示了括号用法developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…绝对更易读,编译器解析无需考虑。我不确定'order'可能是速度问题,或者与编译器如何加载参数堆栈有关,我不确定。
詹姆斯大师'18

1
@ a20操作顺序描述了对包含多个操作的语句执行操作的顺序。请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…-括号(运算分组)具有最高的运算符优先级,因此首先被评估。在这种情况下,圆括号filename仅将单个语句组合在一起,因此是无用和多余的。好的答案是0分,因为它是错误的,误导性的和无助的;如果分数为负数会更好。
Jon z

非常有用的链接的感谢。因此,首先检查括号并运行?这样就应该立即运行,而无需检查下一步是否使用无括号调用aka的其他方式,这将是以后的步骤,而且速度较慢?没有?我对那里的运行时编译器不了解什么。
大师詹姆斯

0

在所有情况下检查null或未定义

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就足够了。抱歉,不能发布邮件
伊万·

-3

我的个人方法似乎适用于所有情况,它正在测试是否只存在字符串的成员。

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/

我想知道这种方法是否有缺陷,但是多年来一直为我服务。


2
拥有这些方法的任何旧对象都容易欺骗这个对象。
亚历克斯2015年

8
这被称为鸭式打字-例如,如果它走路像字符串,说话像字符串,那也可能是字符串。如果您认为这是测试字符串的最佳方法,您会有些疯狂,但是Java语言是Thunderdome,您可以。
乔恩·z
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.