我向OpenWeatherMap.org API发出AJAX请求以获取当地天气预报(温度,城市和天气描述)。我正在将天气描述分配给变量" weatherDescription"。我正在使用switch语句来检查" weatherDescription"有"云"例如,在描述中,如果它确实将DOM内元素图像的图标改变为"阴天"图标图片。
以下代码适用于Chrome,但遗憾的是.includes()方法在其他浏览器(Safari,IE,Opera等)中不起作用。
function SwitchIcons() {
switch (true) {
case (weatherDescription.includes('clear')):
icon.className = "";
icon.classList.add("wi", "wi-day-sunny");
break;
case (weatherDescription.includes('rain')):
icon.className = "";
icon.classList.add("wi", "wi-day-rain");
}
}
SwitchIcons();
所以,我现在正在测试" weatherDescription"对于regExp,但条件总是在第一种情况下返回true(例如下面的例子):
var myRegExp = /sun|rain|sleet/ig;
switch (true) {
case myRegExp.test(weatherDescription)):
icon.className = "";
icon.classList.add("wi", "wi-day-sunny");
break;
case myRegExp.test(weatherDescription)):
icon.className = "";
icon.classList.add("wi", "wi-day-rain");
}
是否有可能通过regEx使用.includes()方法获得相同的结果,还是有更好的方法来实现这一目标?
答案 0 :(得分:2)
问题是g
修饰符。第二次调用test
将尝试匹配从上一个匹配开始,而不是在字符串的开头。 JavaScript中的正则表达式对象具有状态,当您将g
与test
,exec
及类似内容一起使用时,这很重要。
这是一个更简单的例子来说明问题:
var rex;
rex = /test/g;
snippet.log(rex.test("test")); // true
snippet.log(rex.test("test")); // false
// vs.
rex = /test/;
snippet.log(rex.test("test")); // true
snippet.log(rex.test("test")); // true

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;