如果对象属性不存在,则创建普通变量回退的Javascript

Javascript creating a normal variable fallback if object property does not exist

本文关键字:变量 回退 Javascript 创建 属性 对象 不存在 如果      更新时间:2023-09-26

所以现在我已经掌握了javascript的基础知识,我已经准备好进入使用"style"进行编码的中间艺术。我正在努力编写易于维护的代码。其思想是通过创建回退,即使使用中的某个对象属性不可用,也能使函数工作。问题是,如果我经常访问属性,那么我将不得不创建三元条件,为每个访问的属性创建一个简单的条件。现在你可以看到我只访问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

三元运算符是一种很好的方法。它允许您评估任何您喜欢的表达式,以确定您的候选值是否合适或是否应该使用回退。

示例。。。

// 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函数。允许您检查属性(甚至是嵌套较深的属性(的存在,并允许您指定回退。

ES6提供了很好的设施来做您想做的事情。最简单的例子是

var { a = 1, b = 2 } = obj;

这使用具有默认值的析构函数赋值。检索obj上的属性a并将其分配给变量a,但如果不存在,则a的值为1。

在我对"扩展"或"合并"函数的评论的基础上,让我们看看以下内容(从这里开始(:

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 }