所以现在我已经确定了javascript的基础知识,并且我已经准备好进入更具有“风格”编码的中级艺术。我正在尝试编写易于维护的代码。即使通过创建回退而无法使用其中一个对象属性,也可以使函数正常工作。问题是,如果我经常访问属性,那么我将不得不创建三元条件,为每个访问的属性创建一个简单的条件。现在你可以看到我只访问object.a
。我当然可以存储所有属性的访问权限:
创意1
var a = (object.hasOwnProperty(a) ? object.a : a)
var b ...
var c ...
想法2:
var a = (object['a'] ? object.a : a)
想法3:
var a = object['a'] ? object.a : a
创意3:
(object.hasOwnProperty(a) ? var a = object.a : var a = 1);
创意4:
Switch statements?
最后:
object = {
// a: 1,
b: 2,
c: 3,
}
// normal vars in case one of the properties do not exist
var a = 1,
b = 2,
c = 3;
function x(){
var a = 1;
object.a * 10
if (object.a == not exist || (object.b == not exist|| (object.c == not exist)
then treat all non existing object properties accessed to as normal variables by doing:
convert object.a --> a
{
答案 0 :(得分:2)
三元运算符是一种很好的方法。它允许您评估您喜欢的任何表达式,以确定您的候选值是否合适,或者您是否应该使用后备。
...实例
// Use fallback if candidate is not "truthy"
var result = obj.a ? obj.a : "fallback";
// Use fallback if candidate is undefined
var result = obj.a !== undefined ? obj.a : "fallback";
// Use fallback if candidate is not defined on the object (whether or not it exists in the prototype chain)
var result = obj.hasOwnProperty(a) ? obj.a : "fallback";
您需要决定使用后备值的条件。一旦你决定,将它包装在一个函数中。或者制作几个使用不同条件的类似功能。
这是一个检查候选值是否未定义并返回后备值的函数。
function getOrDefault(candidate, fallback) {
if (typeof candidate === "undefined") {
return fallback;
}
return candidate;
}
// Example 1
var b = "alternate value";
var obj = { foo: "value" };
var result = getOrDefault(obj.a, b);
// result -> "alternate value";
// Example 2
var b = "alternate value";
var obj = { a: false };
var result = getOrDefault(obj.a, b);
// result -> false;
另外值得研究的是lodash的get function。允许您检查属性是否存在(甚至是深层嵌套的属性),并允许您指定回退。
答案 1 :(得分:2)
ES6为您提供所需的设施。最简单的例子是
var { a = 1, b = 2 } = obj;
这使用带有默认值的解构赋值。 a
上的obj
属性已被检索并分配给变量a
,但如果不存在,a
将获取值1.
答案 2 :(得分:1)
扩展我对“扩展”或“合并”功能的评论,让我们来看看以下内容(来自here):
var extend = function ( defaults, options ) {
var extended = {};
var prop;
for (prop in defaults) {
if (Object.prototype.hasOwnProperty.call(defaults, prop)) {
extended[prop] = defaults[prop];
}
}
for (prop in options) {
if (Object.prototype.hasOwnProperty.call(options, prop)) {
extended[prop] = options[prop];
}
}
return extended;
};
// Your "fallback" object values
var defaults = {
a: 1,
b: 2
};
// Your target object
var myObject = {
b: 4,
c: 8
};
// one line to override a set of defaults, producing a final object
console.log(extend(defaults, myObject)); // Object { a: 1, b: 4, c: 8 }