【问题标题】:How do you implement a guard clause in JavaScript?如何在 JavaScript 中实现保护子句?
【发布时间】:2018-02-21 15:52:53
【问题描述】:

我想保护我的函数免受空值的影响,并且只有在存在“已定义”值时才继续。

lookingaround 之后,建议的解决方案加倍等于未定义:if (something == undefined)。这个解决方案的问题是你可以声明一个未定义的变量。

所以我目前的解决方案是检查 null if(something == null),它隐含地检查未定义。如果我想捕捉额外的虚假值,我会检查if(something)

在此处查看测试:http://jsfiddle.net/AV47T/2/

现在我错过了什么吗?

马蒂亚斯

【问题讨论】:

    标签: javascript undefined


    【解决方案1】:

    标准的 JS 守卫是:

    if (!x) {
        // throw error
    }
    

    !x 将捕获任何 undefinednullfalse0 或空字符串。

    如果你想检查一个值是否有效,那么你可以这样做:

    if (Boolean(x)) {
        // great success
    }
    

    在这一部分中,如果 x 是 undefinednullfalse0 或空字符串,则执行该块。

    -tjw

    【讨论】:

    • 你将如何防范 null 和 undefined?没有别的!
    • 您必须明确检查这两种情况,例如,(x !== undefined && x !== null)。每当检查 null/undefined 时,请确保使用 !==(身份)运算符而不是 !=(平等)运算符。
    • 为什么 'if(x == null)' 不能作为 undefined 和 null 的防护措施?
    • 这将用于“守卫”目的,但 undefinednull 在 javascript 中有不同的值,所以当我编写代码时,我总是想说明正确语义的使用。可以定义一个变量并且其值为 null;所以变量为空,但 not 未定义。如果您习惯于将变量与null 进行比较以查看它们是否已定义,那么您可能会遇到某些极端情况的问题。换句话说,IMO 这是一种不好的做法,而且比抱歉更安全。
    • !x 和 x !== undefined 在未定义 x 的未定义变量上爆炸。 typeof 检查是我所知道的唯一一个不会对未定义变量抛出异常的检查。
    【解决方案2】:

    我所知道的唯一安全的方法来防范真正未定义的变量(意味着变量名从未在任何地方定义)是检查typeof

    if (typeof _someUndefinedVarName == "undefined") {
       alert("undefined");
       return;
    }
    

    其他任何事情(包括if (!_someUndefinedVarName))都会失败。

    基本示例:http://jsfiddle.net/yahavbr/Cg23P/

    删除第一个块,你会得到:

    _someUndefinedVarName 未定义

    【讨论】:

    • jQuery 确保 undefined 确实是 undefined 而不是一些变量,通过这样做:function(undefined) { ... })()。在那个闭包内,undefined 是安全的。由于没有参数传递给这个函数,但它有一个参数的签名,undefined 参数将永远是未定义的,真的。为了清洁和效率,我推荐这种技术而不是你的。如果程序员愚蠢到在那个闭包中弄乱undefined自己,然后想知道为什么它不起作用,那是他们的错……
    【解决方案3】:

    最近才发现在 JS 中使用 '&&' 作为守卫运算符。不再有 If 语句!

    var data = {
      person: {
        age: 22,
        name: null
      }
    };
    
    var name = data.person.name && doSomethingWithName(data.person.name);
    

    【讨论】:

    • 是的,但是:a) 为了完全确定你需要一个一个地检查每个属性的存在,甚至是根对象:data && data.person && data.person.name b) 如果对象“数据”未声明,则会抛出错误。 结论:你必须谨慎使用监护人运营商,因为它不是灵丹妙药
    • 没有。如果名称为空字符串或零,您的代码将失败。使用即将推出的空值合并运算符:data.person.name ?? doSomethingWithName(data.person.name)
    • @JuanmaMenendez 你说得对,就像 JS 中的大多数东西一样,你在使用时需要小心。
    【解决方案4】:

    三元解救!

    (i) => 
        i == 0 ? 1 :
        i == 1 ? 2 :
        i == 2 ? 3 :
        null
    

    【讨论】:

    • 三元可能有用,但嵌套它往往会降低可读性。在许多地方,最好的做法是避免嵌套三元运算。话虽如此,您可以解释一下这是如何回答问题的。
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2020-03-24
    • 2017-11-22
    • 2020-08-10
    • 2021-10-22
    • 2015-09-20
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多