Javascript 内联用空字符串替换未定义
Javascript inline replace undefined with empty string
我有这个功能:
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"])
可以解决问题,但我需要一个内联解决方案。这有可能吗?
在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;
}
注意:正如所写,这将 return 输入的修改版本。如果这不是您想要的,请根据需要进行调整。
您也必须为 input
变量本身提供默认值。
function callWS(input) {
input = input || {};
...
}
否则您访问不存在(未定义)对象的属性会导致错误(您现在拥有的)。
另一方面,访问现有对象上不存在的属性在 JS 中不会被视为错误。
您可以编写自己的 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"}));
我有这个功能:
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"])
可以解决问题,但我需要一个内联解决方案。这有可能吗?
在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;
}
注意:正如所写,这将 return 输入的修改版本。如果这不是您想要的,请根据需要进行调整。
您也必须为 input
变量本身提供默认值。
function callWS(input) {
input = input || {};
...
}
否则您访问不存在(未定义)对象的属性会导致错误(您现在拥有的)。
另一方面,访问现有对象上不存在的属性在 JS 中不会被视为错误。
您可以编写自己的 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"}));