为什么charAt没有检测到字符串?

时间:2016-10-23 16:57:34

标签: javascript

为什么以下函数在索引2处返回元音时,索引2不是元音?

 function isVowel(name) {
   console.log("The third letter of " + name + " " + "is " + name.charAt(2))
   if (name.charAt(2) === "a" || "i" || "o" || "u")
   console.log("3rd letter is vowel")
   else
   console.log("3rd letter is NOT vowel")
}

isVowel("abcdefg")

/*Outputs:*/ The third letter of abcdefg is c
3rd letter is vowel

6 个答案:

答案 0 :(得分:3)

在JavaScript(以及所有其他语法相似的语言)中,这一行:

$date = new DateTime('2016-10-22 01:39:53 +5:30');
$date->setTimezone(new DateTimeZone('+13:40'));
echo   $date->format('Y-m-d H:i:s');

装置

  • 如果name.charAt(2)===“a”
  • 或“i”
  • 或“o”
  • 或“你”

这并不意味着

  • 如果name.charAt(2)===“a”
  • 或name.charAt(2)===“i”
  • 或name.charAt(2)===“o”
  • 或name.charAt(2)===“u”

在很多语言中你都会收到错误,因为if (name.charAt(2) === "a" || "i" || "o" || "u") 不是布尔值,所以"i"是个奇怪的说法;但是JavaScript很乐意进行类型强制,因此|| "i"会导致false || "e",因为true是一个“真理” 1 值。

要使它意味着你想要的意思,你必须重复左手操作数:

"e"

您可能希望使用变量来避免重复调用if (name.charAt(2) === "a" || name.charAt(2) === "i" || name.charAt(2) === "o" || name.charAt(2) === "u") ,或者查看其他内容,例如这种典型的“Y in Y”方法:

charAt

旁注:你是不是错过了“e”(有时是“y”)? ; - )

1 “truthy value” - 用作布尔值时强制为if ("aiou".indexOf(name.charAt(2) !== -1) 的值为 truthy ;那些强迫true的人是“虚假的”。虚假值为false0""NaNnull,当然还有undefined;所有其他价值都是真实的。

答案 1 :(得分:2)

JS中的non-empty string is treated as a truthy value所以if语句总是true。如果第一个条件name.charAt(2) === "a"失败,它将检查第二个条件"i",它将始终被视为真实,因为它是非空字符串。

相反,您可以使用String#indexOf方法执行此类简单操作。

if ("aiou".indexOf(name.charAt(2)) > 1)

答案 2 :(得分:1)

将if条件更改为 name.charAt(2)==='一个' || name.charAt(2)==='我' || name.charAt(2)==='○' || name.charAt(2)===' U'

答案 3 :(得分:1)

您需要通过一次比较检查每个字母。



function isVowel(name) {
    console.log("The third letter of " + name + " " + "is " + name.charAt(2))
    if (name.charAt(2) === "a" || name.charAt(2) === "i" || name.charAt(2) === "o" || name.charAt(2) === "u") {
        console.log("3rd letter is vowel");
    } else {
        console.log("3rd letter is NOT vowel");
    }
}

isVowel("abcdefg");




较短的ocde可能是用元音检查字符串并获取字母的位置,以进行检查。



function isVowel(name) {
    console.log("The third letter of " + name + " " + "is " + name.charAt(2))
    if ('aeiou'.indexOf(name[2]) !== -1) {
        console.log("3rd letter is vowel");
    } else {
        console.log("3rd letter is NOT vowel");
    }
}

isVowel("abcdefg");




答案 4 :(得分:1)

您可以使用Object作为hash map来检查角色是否为元音(您的元音检查条件错误,它总是返回true

var vowels = {
  a: true,
  i: true,
  e: true,
  o: true,
  u: true
}

if(name.charAt(2) in vowels) {
 ...
}

为什么您的病情总是在返回true? 因为在你的情况下这些都是等价的:

if (name.charAt(2) === "a" || "i" || "o" || "u")
if ((name.charAt(2) === "a") || ("i" || "o" || "u"))
if ((name.charAt(2) === "a") || true)
if (THIS_CAN_BE_ANYTHING || true)
if (true) // So, your condition is always true

答案 5 :(得分:1)

||运算符不能那样工作:

if (name.charAt(2) === "a" || "i" || "o" || "u")

在语法上是正确的,但它不会做你期望的。你需要对每个元音进行单独的比较。或者,您可以将元音保留在字符串中,然后通过搜索或查找进行检查:

if ("aeiou".indexOf(name.charAt(2)) >= 0)

if ("aeiou".includes(name.charAt(2)))

(后一个例子中使用的.includes()函数尚未获得广泛的支持。)