Javascript内联用空字符串替换undefined

时间:2016-12-13 16:33:03

标签: javascript string undefined ternary-operator

我有这个功能:

function callWS(input) {
    var output = {
        "type"  : input["type"]  || "",
        "mark"  : input["mark"]  || "",
        "model" : input["model"] || "",
        "year"  : input["year"]  || ""
    };

    return output;
}

我希望用户以多种方式调用此函数:

callWS(); ==> {"type":"","mark":"","model":"","year":""}
callWS({"type":"moto"}); ==> {"type":"moto","mark":"","model":"","year":""}
callWS({"type":"moto","mark":"audi"}); ==> {"type":"moto","mark":"audi","model":"","year":""}

如果参数未定义,则将其初始化为空字符串。目前我的功能在第一种情况下不起作用,但在另一种情况下起作用。

当我将其称为callWS()时,我得到:

Uncaught TypeError: Cannot read property 'type' of undefined

说实话,我不知道为什么它适用于2和3的情况但我需要让它适用于第一种情况。我知道如果我使用:

if (input["type"])

会做到这一点,但我需要一个内联解决方案。这有可能吗?

3 个答案:

答案 0 :(得分:4)

您必须提供input变量本身的默认值。

function callWS(input) {
   input = input || {};
   ...
}

否则,您访问导致错误的未存在(未定义)对象的属性(您现在拥有的)。

另一方面,访问现有对象的未存在属性并不被视为JS中的错误。

答案 1 :(得分:0)

在ES6中,将其写为

function callWS({type = "", mark = "", model = "", year = ""} = {}) {
  return {type, mark, model, year};
}

这是另一种不涉及ES6的方法。许多库包含default实用程序,如果缺少这些实用程序,它会将某些属性应用于另一个对象。

function deflt(obj, defaults) {
  var keys = Object.keys(defaults);
  for (var i = 0; i < keys.length: i++) {
    var key = keys[i];
    if (!(key in obj)) obj[key] = defaults[key];
  }
  return obj;
}

您可以按如下方式使用:

function callWS(input) {
  input = input || {};
  deflt(input, {type: "", mark: "", model: "", year: ""});
  return input;
}

注意:如上所述,这将返回输入的修改版本。如果这不是您想要的,请根据需要进行调整。

答案 2 :(得分:0)

您可以编写自己的extend方法并使用它。 这样你就可以拥有一个默认对象,为它提供默认值,然后将其与传递给函数的对象合并。

function extend(a, b){
    for(var key in b){
        if(b.hasOwnProperty(key)){
            a[key] = b[key];
        }
    }

    return a;
}

function callWS(input) {
    var defaultInput = {
        "type": "",
        "mark": "",
        "model":"",
        "year": ""
    }
    
    var output = extend(defaultInput, input);

    return output;
}

console.log(callWS());
console.log(callWS({"type":"moto"}));
console.log(callWS({"type":"moto","mark":"audi"}));