javascript .toUpperCase()不是函数

6tdlim6h  于 2023-10-14  发布在  Java
关注(0)|答案(6)|浏览(96)

当name全是null时,函数应该返回给用户。例如,当name为“JERRY”时,函数应该返回字符串“HELLO,JERRY!“控制台记录错误:.toUpperCase()不是函数。

var hello = "Hello, ";

function greet(name) {

  if (name == null) {
    console.log(hello + "my friend")
  } else if (name == name.toUpperCase()) {
    console.log(hello.toUpperCase() + name.toUpperCase())
  } else {
    console.log(hello + name);
  }
}

var names = ["jack", "john"]
greet(names);
sqougxex

sqougxex1#

names是一个数组数组没有这样的功能。
你可能想对数组的每个元素调用greet函数:

names.forEach(greet);

如果你想让greet函数接受一个数组作为参数,那么你可以这样做

function greet(name) {
      if (Array.isArray(name)) {
            name.forEach(greet);
            return;
      }
      ...

但这种多态性通常被视为一种不好的做法。

8tntrjer

8tntrjer2#

您可以先应用.toString(),然后再使用.toUpperCase()

if (name === name.toString().toUpperCase())
ctzwtxfj

ctzwtxfj3#

names是数组声明,所以不能使用该类型的函数,如果你想使用for循环或names[1]类型打印该数组,

<script>
  var hello = "Hello, ";

  function greet(name) {

    if (name == null) {
      document.write(hello + "my friend")
    } else if (name == name.toUpperCase()) {
      document.write(hello.toUpperCase() + name.toUpperCase())
    } else {
      document.write(hello + name);
    }
  }

  var names = ["jack", "john"]
  greet(names[0]);
  greet(names[1]);
</script>
txu3uszq

txu3uszq4#

var hello = "Hello, ";

function greet(names) {
  for (var i = 0; i < names.length; i++) {
    var name = names[i];
    if (name == null) {
      console.log(hello + "my friend")
    } else if (name) {
      console.log('toUpperCase works: ',hello.toUpperCase() + name.toUpperCase())
    } else {
      console.log(hello + name);
    }
  }
}

var names = ["jack", "john"]
greet(names);

如果你把一个数组传入函数,它就不工作了。现在好多了。

6g8kf2rb

6g8kf2rb5#

另一种方式,更多的ES学习,错误和类型处理:

function greet(names) {
    const hello = "Hello"
    if (!names){
        console.log(`${hello} my friend`)
        return;
    }
    // Handles a String
    if (typeof names === "string") {
        console.log(`${hello} ${name}`)
        return;
    }
    // Error Handling for Array
    if (Array.isArray(names) && !names.length) {
        console.error("Passed Array is empty")
        return;
    }
    names.map((name) => {
        const str = `${hello} ${name}`
        name == name.toUpperCase()
            ? console.log(str.toUpperCase())
            : console.log(str)
            // Optional if you have toProperCase as a prototype
            // : console.log(`${hello} ${name.toProperCase()}`)
    })
}

let names = ["jack", "JOHN"]
greet(names)

结果

这将处理一个空数组,一个数组,一个字符串和空或假调用。如果您还需要处理一个Object,也可以通过附加代码来完成。

奖励材料

避免讨论这种方式使用原型是好是坏,只是展示了一种合理的方式,如果需要的话。
toPropertyCase原型:

String.prototype.toProperCase =
    String.prototype.toProperCase ||
    function (word) {
        if (!word) {
            word = this
        }
        if (word) {
            let str = word.toLowerCase().split(" ")
            for (let i = 0; i < str.length; i++) {
                str[i] = str[i].charAt(0).toUpperCase() + str[i].slice(1)
            }
            return str.join(" ")
        } else {
            // ERROR message
            // RETURNS var passed to it. If there is an issue it just returns the same value.
            console.log(
                "The util function toProperCase() \nis not able to do anything with '" +
                    word +
                    "' a typeof",
                typeof word,
                "\nReturning variable in same state."
            )
            return word
        }
    }
vxqlmq5t

vxqlmq5t6#

因为names是一个数组,你必须先循环它才能得到数组内部的值。你可以试试我的代码:

var hello = "Hello, ";

function greet(name) {
    //loop name with for of
    for (let val of name) {
        if (val == null) {
            console.log(hello + "my friend")
        } else if (val == val.toUpperCase()) {
            console.log(hello.toUpperCase() + val.toUpperCase())
        } else {
            console.log(hello + val);
        }
    }
}

var names = ["jack", "john"]
greet(names);

相关问题