Javascript在对象属性不存在时创建普通变量回退

Javascript在对象属性不存在时创建普通变量回退,javascript,Javascript,所以现在我已经掌握了javascript的基本知识,并且准备开始使用“风格”进行更为中间的编码。我试图编写易于维护的代码。其思想是通过创建回退使函数工作,即使使用中的某个对象属性不可用。问题是,如果我经常访问属性,那么我必须创建三元条件,为每个访问的属性创建一个简单的条件。现在您可以看到我只访问对象.a。当然,我可以存储所有对属性的访问: 想法1 var a = (object.hasOwnProperty(a) ? object.a : a) var b ... var c ... 想法2:

所以现在我已经掌握了javascript的基本知识,并且准备开始使用“风格”进行更为中间的编码。我试图编写易于维护的代码。其思想是通过创建回退使函数工作,即使使用中的某个对象属性不可用。问题是,如果我经常访问属性,那么我必须创建三元条件,为每个访问的属性创建一个简单的条件。现在您可以看到我只访问
对象.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;

也值得研究的是LoaseS。允许您检查一个属性的存在(甚至是深嵌套的属性),并允许您指定一个后退。

< P>扩展我对“扩展”或“合并”函数的评论,让我们来看看下面的(from):

var extend=函数(默认值、选项){
var扩展={};
var-prop;
用于(默认情况下的道具){
if(Object.prototype.hasOwnProperty.call(默认值,prop)){
扩展的[prop]=默认值[prop];
}
}
用于(选项中的道具){
if(Object.prototype.hasOwnProperty.call(options,prop)){
扩展[prop]=选项[prop];
}
}
回报延长;
};
//您的“回退”对象值
var默认值={
答:1,,
b:2
};
//你的目标物体
变量myObject={
b:4,
c:8
};
//一行覆盖一组默认值,生成最终对象

log(extend(defaults,myObject));//对象{a:1,b:4,c:8}
ES6提供了很好的工具来完成您想要的事情。最简单的例子是

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


这使用带默认值的解构赋值。
obj
上的属性
a
将被检索并赋值给变量
a
,但如果它不存在,
a
将取值1。

如何使用,有两个对象,一个
defaults
对象和一个
target
对象。您的合并将有利于e
target
对象属性(如果它们有值,则不覆盖它们)。如果不需要阻止继承的或错误的值,中的
很简单:
a=“a”in obj?obj.a:false;
@Cᴏʀʏ请随意发布带有一些示例的答案。这听起来很有趣。它不会创建更多的“代码”吗?一个有用的实用函数不会有任何影响。如果你的应用程序适当地使用它。你基本上会有:
var myObject={…};var defaults={…};myObject=merge(myObject,defaults)
@Asperger:我在一个答案中提供了一个示例,但我没有包括我链接的另一个答案中的示例。那么
toString()
和其他非自己的属性呢?它们在对象上不存在,但仍将通过您的函数以非默认方式传递……恐怕
hasOwnProperty()
是可靠对象处理的必要条件……此外,您不需要
类型的
,只需快速比较未定义:
如果(候选者===未定义){
,因为
候选者
总是被定义的,即使值是未定义的…
typeof
实际上只有在词法名称未知时才需要,在这种情况下它会阻止引用。+1,我喜欢使用
未定义的
而不是
hasOwnProperty
来实现此目的。这样,您可以提供不仅是成员值,还有可选的函数参数。@hege_hegedus确实如此。我想我们也可以使用void(0)。您对使用merge的CORIES解决方案有何看法?merge可以方便地编写许多设置默认值,但执行速度也相当慢。对象初始化通常不经常发生,因此速度损失通常可以忽略不计。然后,这又是一段要发布的代码。您可以使用
$.extend()
或另一个扩展作为合并()Prototype对我来说是新的。想告诉我它是什么吗?我可以用谷歌搜索它,但我想听听你的意见,因为你似乎非常了解GableeJavaScript中的每个对象都有一个
Prototype
——这对我来说是高级JavaScript。因为我们正在讨论中间JavaScript主题,我将把它作为一个练习留给你公平地说,它需要的文本比这里的注释多得多。好吧。把它作为我的家庭作业;)我会接受你的答案,因为你做了很多,这很有帮助。对不起,我可以问一下这是不是一篇好文章吗?那篇文章很好。
。call
是调用原型方法的内容。
。call
允许你指定的内容ode>这个
在方法中。关于提到使用原型方法处理这个问题的op呢?你的方法看起来更干净、更小。这么多人都给出了好的建议,都有他们的优点和缺点。我不知道该怎么做adopt@Asperger我不明白你的问题--你能详细解释一下吗?对不起,我的意思是,你的解决方案似乎有问题y优雅。现在我正在努力决定选择哪一个,您的还是CORY的。我的意思是在可维护性和灵活性方面,当然,performanceOk支持真的很糟糕