如何检测变量是否为字符串

Web*_*net 17 javascript jquery

如何检测变量是否为字符串?

use*_*716 35

这是ECMAScript规范中指定的方式,用于确定内部[[Class]]属性.

if( Object.prototype.toString.call(myvar) == '[object String]' ) {
   // a string
}
Run Code Online (Sandbox Code Playgroud)

8.6.2对象内部属性和方法:

[[Class]]内部属性的值由此规范为每种内置对象定义.主机对象的[[Class]]内部属性的值可以是除"Arguments","Array","Boolean","Date","Error","Function","JSON"之一之外的任何String值.,"数学","数字","对象","RegExp""字符串".内部使用[[Class]]内部属性的值来区分不同类型的对象.请注意,除了通过Object.prototype.toString之外,此规范不提供程序访问该值的任何方法(参见15.2.4.2).


有关它如何有用的示例,请考虑以下示例:

var str = new String('some string');

alert( typeof str ); // "object"

alert( Object.prototype.toString.call(str) ); // "[object String]"
Run Code Online (Sandbox Code Playgroud)

如果你使用typeof,你得到"object".

但是如果你使用上面的方法,你会得到正确的结果"[object String]".

  • 不知道为什么这是公认的答案.对象不是字符串.`new String()`导致一个对象包含一系列索引属性,每个属性的值都对应于该位置的字符.是的,它将通过`Object`的`toString`方法强制转换为字符串,但事实仍然是`new String('some string')`本身不是字符串.`typeof someString ==="string"`是确定变量是否为字符串的正确方法.变量是否可以变成*字符串是没有意义的; 每个可以跟踪其原型链到`Object`的对象都有`toString` (8认同)

Dan*_*olo 19

你可以typeof用来做,但对于很多事情来说这是糟糕的设计.

if (typeof myVar == "string") {
    alert("I'm a string!");
}
Run Code Online (Sandbox Code Playgroud)


sim*_*aun 6

使用typeof.

if (typeof foo == 'string')
Run Code Online (Sandbox Code Playgroud)

  • 可能更清楚的是在示例中不使用关键字作为变量. (19认同)

use*_*706 5

我认为我们不需要将其new String('some string')视为字符串,因为如果我们尝试:

new String('abc')==='abc'
Run Code Online (Sandbox Code Playgroud)

它会返回错误!

但是如果我们尝试:

String('abc')==='abc'
Run Code Online (Sandbox Code Playgroud)

它会返回真。