谁能告诉我为什么下面的开关不起作用?
var String=new String('String #1');
document.write(String);
document.write(' Check ');
switch(String)
{
case 'String #1' :
document.write('String Number 1');
break;
default: document.write('wrong string');
}
输出为:String #1 检查错误字符串
String 是 JavaScript 中内置的构造函数。命名隐藏这些构造函数的变量将导致错误:
TypeError: String is not a constructor
重命名
String
变量,并且不要在此处使用 switch
语句,因为您有一个 String 实例。 switch
语句根据 MDN 文档和 ECMAScript 2015 规范 使用严格比较 (
===
)。由于字符串实例和文字永远不会“严格相等”,因此比较失败。不要实例化,而是使用文字:
var string = "String #1";
switch(string) {
case "String #1":
document.write("String Number 1");
break;
default:
document.write("wrong string");
}
另外,我不建议使用
document.write
,请参阅这里。使用 createElement
和 appendChild
记录或插入到 DOM 中应该足够了。
您必须将对象与对象进行比较,而不是字符串与对象进行比较。这里我将一个对象与一个对象进行比较:
var string = "String #1";
console.log(string);
console.log("Check");
switch(string)
{
case "String #1":
console.log("String Number 1");
break;
default: console.log("wrong string");
}
您可以使用
toString()
将对象更改为字符串 参见示例 https://jsfiddle.net/DIRTY_SMITH/59x9xn3g/1/
<script>
var someObject =new String('String #1');
var someString = someObject.toString();
document.write(someString);
document.write(' Check ');
switch(someString)
{
case 'String #1' : document.write('String Number 1');
break;
default: document.write('wrong string');
}
</script>
另一个简单的解决方案是将原始字符串和字符串对象连接起来。结果是一个原始字符串,可以在 switch 语句中使用。
var String=new String('String #1');
document.write(String);
document.write(' Check ');
switch('' + String)
{
case 'String #1' :
document.write('String Number 1');
break;
default: document.write('wrong string');
}