在JavaScript中处理未定义变量的最简单方法

时间:2017-09-26 22:35:09

标签: javascript ternary-operator

我有一个我正在创建的可能具有未定义属性的对象。

设置属性的方式是否比我在下面所做的更简洁:

var ruleObj = {
    factor: (ruleArray[2] ? ruleArray[2].trim() : null),
    resultElseTarget: (ruleArray[10] ? ruleArray[10].trim() : null)
} 

注意我必须在三元运算符两次之后重复变量。我问的原因是我多次遇到这种类型的问题而且它似乎不是处理它的最好方法。

6 个答案:

答案 0 :(得分:4)

这是一个包含另一个函数的函数,它不对nullundefined值执行任何操作:

const liftMaybe = f => x => x == null ? null : f(x);

然后,您可以定义对trim无效的undefined

const trimMaybe = liftMaybe(x => x.trim());

并使用它:

var ruleObj = {
    factor: trimMaybe(ruleArray[2]),
    resultElseTarget: trimMaybe(ruleArray[10]),
};

它在处理空字符串时与原文不同,但我不知道这是故意还是有意义。

答案 1 :(得分:0)

简洁是一回事但是使用Javascript时,更大的问题是可读性和类型检查。

在您的示例中,如果ruleArray[2]的值是布尔值,则它将评估为false并将factor设置为null。也许这就是你想要的,但现在只是查看你的示例代码,我假设你的ruleArray包含bool而不是潜在的undefines。

更好的方法是编写一个函数来进行空检查

编辑:有人比我快:) https://stackoverflow.com/a/46436844/643084

EDIT2:另一个答案很棒,但我想做个便笺。不应将null视为与undefined相同,即使他们在大多数情况下都评估相同。

答案 2 :(得分:0)

有些事情:

由于您正在检查索引,因此您需要确保自己的长度至少达到所需的大小。否则ruleArray [10]会抛出你的范围错误。

假设您确定数组中有正确数量的元素,您可以使用它来检查var是否为undefined,这通常用于检查传入的参数(比如你有类似函数(arg1,arg2)) :

arg1 = arg1 || 'some_default';

在你的情况下,再次假设你的阵列足够长:

factor: ( ruleArray[2] || 'some other default' );

(如果你想避免的话,为什么要把它设置为null。)

如果你想知道,"有没有办法访问一个不存在的索引,只返回null",答案是"也许......但是我不会"。

请注意,如果该值确实是假的(例如,0,''或false),您可能无法获得预期的结果,在这种情况下,您可能需要检查某些内容更明确,如null。

我大量使用了简洁的东西&= 34;某事= thisValIfNotFalsy || someOtherDefaultVal。像任何事情一样谨慎,何时何地等等。

答案 3 :(得分:0)

您可以执行以下操作:



    var ruleArray = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    
    function formatRule(rule) {
        if (!rule) return null
        return rule.trim()
    }
    
    var ruleObj = {
        factor: formatRule(ruleArray[2]),
        resultElseTarget: formatRule(ruleArray[10])
    }
    
    console.log(ruleObj.factor)
    console.log(ruleObj.resultElseTarget)




我们创建了一个纯函数,其任务是生成null或修剪值,这样可以避免在其他地方复制此逻辑。

答案 4 :(得分:0)

您可以使用函数模式并在传递参数时使用AND &&运算符设置默认参数,以检查变量是否已定义,如果未将元素值设置为null。您可以包含进一步的检查以确定传递的变量是否为字符串。

let ruleArray = [];

ruleArray[10] = "def ";

let ruleFn = (factor = null, resultElseTarget = null) => 
               ({factor, resultElseTarget});

let ruleObj = ruleFn(ruleArray[2] && ruleArray[2].trim()
              , ruleArray[10] && ruleArray[10].trim());

console.log(ruleObj, ruleObj.factor === null);

答案 5 :(得分:0)

  

是否有更简洁的方式

到目前为止,所有答案似乎都假设您的输入是字符串或null / undefined。对我来说,我会说检查null / undefined是错误的方式。你只能在一个字符串上调用trim,那么为什么不检查它是一个字符串?它也意味着NaN / Numbers / Arrays等,不会出错。我假设你想要这个函数做的是修剪一个字符串,如果它是一个字符串,所以我也会说你应该传递原始值,如果不是一个字符串。

也许这就是@zaftcoAgeiha在谈到不对待null&未定义相同。

无论如何,这是一个例子。注意数字是如何传递的,但hello被修剪。

const ruleArray = [];

ruleArray[2] = null;
ruleArray[5] = 7;
ruleArray[7] = 'Helllo ';

const trimIfString = (x) => typeof x === 'string' ? x.trim() : x;


var ruleObj = {
    factor: trimIfString(ruleArray[2]),
    resultElseTarget: trimIfString(ruleArray[5]),
    hello: trimIfString(ruleArray[7])
} 

console.log(ruleObj);