Javascript 在何处验证函数的参数以及是抛出还是返回?

Javascript 在何处验证函数的参数以及是抛出还是返回?,javascript,Javascript,关于函数的使用,我有几个具体的问题 如果在这里问这个问题显得过于简单,我深表歉意。我正在从事一个不断发展的项目。这些问题最近一直困扰着我 问题: 1。是否需要验证每个函数中的参数? //getConcatInfo: ("John Doe", 50, {name: "London"}) => "John 50 London" getConcatInfo(name, age, city){ let first = name.split(" ")[0];

关于函数的使用,我有几个具体的问题

如果在这里问这个问题显得过于简单,我深表歉意。我正在从事一个不断发展的项目。这些问题最近一直困扰着我

问题:

1。是否需要验证每个函数中的参数?

   //getConcatInfo: ("John Doe", 50, {name: "London"}) => "John 50 London"
    getConcatInfo(name, age, city){
        let first = name.split(" ")[0];
        return first + " " + age + " " + city.cityName;
    }
let name = user.name;
let name = user.age;
let city = getUserCity();

if(name && age && city && city.name) //<= like this?
   getConcatInfo(name, age, city);
  • 我是否应该检查每个参数是否存在于项目中的每个函数中
  • 对于所有函数,我是否应该检查每个参数的类型是否正确?例如,
    city
    应该是键为
    cityName
    name
    的对象,
    age
    应该是
    String
    Number
  • 比如说,如果存在两个参数,而第三个参数不存在,我应该抛出一个异常或只返回null这样做的原因是,像
    RXJS
    这样的库在事件处理程序中抛出任何错误时都会停止侦听给定的事件
  • 2。调用函数之前是否需要验证参数?

       //getConcatInfo: ("John Doe", 50, {name: "London"}) => "John 50 London"
        getConcatInfo(name, age, city){
            let first = name.split(" ")[0];
            return first + " " + age + " " + city.cityName;
        }
    
    let name = user.name;
    let name = user.age;
    let city = getUserCity();
    
    if(name && age && city && city.name) //<= like this?
       getConcatInfo(name, age, city);
    
    let name=user.name;
    让name=user.age;
    让city=getUserCity();
    
    如果(name&&age&&city&&city.name)/您应该永远不要信任输入。您应该检查函数中的参数

    您可以控制函数,但不能控制调用站点

    关于你应该做多少检查。这取决于您的用例。检查太少可能会导致运行时出现很多问题,检查太多会导致发货速度变慢,因此,由您自己决定什么是检查太多。您可以应用的经验法则是,您对调用站点的控制越多,您可以在函数内部执行的检查就越少,但是您不应该信任输入

    返回null(或其他值)或引发异常取决于参数中的违规程度。您可以尝试从小问题中恢复:返回null或使用特定参数的默认值并执行代码。如果无法从错误中恢复,则应引发异常。在你的情况下,你可以这样做

    getConcatInfo(name, age, city){
        name = name || 'default name'
        age = age || 18
        city = city || {cityName: 'default name'}
        let first = name.split(" ")[0];
        return first + " " + age + " " + city.cityName;
    }
    
    您还可以使用默认参数

    getConcatInfo(name = 'default name', age = 18, city = {cityName: 'default name'}){
        let first = name.split(" ")[0];
        return first + " " + age + " " + city.cityName;
    }
    

    如果您想进行类型检查,您可能需要查看。但当然,这是另一种语言:)

    你应该永远不要信任输入。您应该检查函数中的参数

    您可以控制函数,但不能控制调用站点

    关于你应该做多少检查。这取决于您的用例。检查太少可能会导致运行时出现很多问题,检查太多会导致发货速度变慢,因此,由您自己决定什么是检查太多。您可以应用的经验法则是,您对调用站点的控制越多,您可以在函数内部执行的检查就越少,但是您不应该信任输入

    返回null(或其他值)或引发异常取决于参数中的违规程度。您可以尝试从小问题中恢复:返回null或使用特定参数的默认值并执行代码。如果无法从错误中恢复,则应引发异常。在你的情况下,你可以这样做

    getConcatInfo(name, age, city){
        name = name || 'default name'
        age = age || 18
        city = city || {cityName: 'default name'}
        let first = name.split(" ")[0];
        return first + " " + age + " " + city.cityName;
    }
    
    您还可以使用默认参数

    getConcatInfo(name = 'default name', age = 18, city = {cityName: 'default name'}){
        let first = name.split(" ")[0];
        return first + " " + age + " " + city.cityName;
    }
    

    如果您想进行类型检查,您可能需要查看。当然,这是另一种语言:)

    嘿。谢谢你能把问题的其他部分也看一遍吗?我猜你说的“不信任输入”主要是指来自用户的输入(或其他可能不可靠的来源)?基本上是的,但即使是来自你自己代码的输入也不应该被信任。假设您使用正确的输入和结构调用了所有方法,但随后添加了另一个不符合所需结构的调用。这很公平。TypeScript在确保应用程序将数据保持在预期结构中(通过在编译时而不是运行时捕获许多结构错误)方面有很大的帮助。我的建议是检查您的输入。这应该包括你。调用getConcatInfo时,您处于另一个方法中,应该检查其中的输入。如果输入和其余的计算都正常,那么您应该能够安全地在其中调用您的方法,因为此时您的对象应该具有正确的结构。谢谢你能把问题的其他部分也看一遍吗?我猜你说的“不信任输入”主要是指来自用户的输入(或其他可能不可靠的来源)?基本上是的,但即使是来自你自己代码的输入也不应该被信任。假设您使用正确的输入和结构调用了所有方法,但随后添加了另一个不符合所需结构的调用。这很公平。TypeScript在确保应用程序将数据保持在预期结构中(通过在编译时而不是运行时捕获许多结构错误)方面有很大的帮助。我的建议是检查您的输入。这应该包括你。调用getConcatInfo时,您处于另一个方法中,应该检查其中的输入。如果输入和其余的计算都正常,您应该能够安全地在其中调用您的方法,因为此时您的对象应该具有正确的结构。