如果对象属性不存在,则Javascript创建正常变量回退

时间:2015-09-16 18:42:27

标签: javascript

所以现在我已经确定了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

{

3 个答案:

答案 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 }