设置Javascript对象属性的默认值

设置Javascript对象属性的默认值,javascript,Javascript,有没有办法设置Javascript对象的默认属性,以便: let emptyObj = {}; // do some magic emptyObj.nonExistingAttribute // => defaultValue 在Javascript中没有设置此项的方法-为不存在的属性返回undefined,这是核心Javascript规范的一部分。请参阅。正如我在那里所建议的,一种方法(尽管我不能真正推荐)是定义一个全局getProperty函数: function getProper

有没有办法设置Javascript对象的默认属性,以便:

let emptyObj = {};
// do some magic
emptyObj.nonExistingAttribute // => defaultValue

在Javascript中没有设置此项的方法-为不存在的属性返回
undefined
,这是核心Javascript规范的一部分。请参阅。正如我在那里所建议的,一种方法(尽管我不能真正推荐)是定义一个全局
getProperty
函数:

function getProperty(o, prop) {
    if (o[prop] !== undefined) return o[prop];
    else return "my default";
}

var o = {
    foo: 1
};

getProperty(o, 'foo'); // 1
getProperty(o, 'bar'); // "my default"
但这将导致大量非标准代码,其他人很难阅读,并且可能会在您期望或想要未定义值的领域产生意外后果。最好边走边检查:

var someVar = o.someVar || "my default";

我昨天看到一篇文章提到了一个
对象。\uuuuu noSuchMethod\uuuuuu
属性:我没有机会玩它,所以我不知道浏览器支持,但也许你可以在某种程度上使用它?

这听起来确实像是基于原型的对象的典型用法:

// define a new type of object
var foo = function() {};  

// define a default attribute and value that all objects of this type will have
foo.prototype.attribute1 = "defaultValue1";  

// create a new object of my type
var emptyObj = new foo();
console.log(emptyObj.attribute1);       // outputs defaultValue1
或者你可以试试这个

dict = {
 'somekey': 'somevalue'
};

val = dict['anotherkey'] || 'anotherval';
我的代码是:

function(s){
    s = {
        top: s.top || 100,    // default value or s.top
        left: s.left || 300,  // default value or s.left
    }
    alert(s.top)
}

这实际上可能与
对象有关。创建
。它不适用于“未定义”属性。但是对于那些被赋予默认值的

var defaults = {
    a: 'test1',
    b: 'test2'
};
然后,当您创建属性对象时,您可以使用
object.create

properties = Object.create(defaults);
现在您将有两个对象,其中第一个对象为空,但原型指向
默认值
对象。要测试:

console.log('Unchanged', properties);
properties.a = 'updated';
console.log('Updated', properties);
console.log('Defaults', Object.getPrototypeOf(properties));

我很惊讶还没有人提到三元运算符

var emptyObj = {a:'123', b:'234', c:0};
var defaultValue = 'defaultValue';
var attr = 'someNonExistAttribute';
emptyObj.hasOwnProperty(attr) ? emptyObj[attr] : defaultValue;//=> 'defaultValue'


attr = 'c'; // => 'c'
emptyObj.hasOwnProperty(attr) ? emptyObj[attr] : defaultValue; // => 0
这样,即使“c”的值是0,它仍然会得到正确的值。

自从几年前我提出这个问题以来,事情进展得很顺利

代理是ES6的一部分。以下示例适用于:



阅读更多信息。

一种方法是采用默认对象并将其与目标对象合并。目标对象将覆盖默认对象中的值

jQuery具有执行此操作的
.extend()
方法。但是,不需要jQuery,因为这里有一些普通的JS实现,例如:


我认为最简单的方法是使用
Object.assign

如果你有这门课:

class MyHelper {
    constructor(options) {
        this.options = Object.assign({
            name: "John",
            surname: "Doe",
            birthDate: "1980-08-08"
        }, options);
    }
}
您可以这样使用它:

let helper = new MyHelper({ name: "Mark" });
console.log(helper.options.surname); // this will output "Doe"
文件(含polyfill): 使用分解结构(ES6中新增)

这里有一个非常棒的例子,比我能更好地解释语法

回答你的问题 进一步 我可以重命名这个变量吗?当然

const { nonExistingAttribute: coolerName = 15} = emptyObj;
console.log(coolerName); // 15
嵌套数据呢?加油

var nestedData = {
    name: 'Awesome Programmer',
    languages: [
        {
            name: 'javascript',
            proficiency: 4,
        }
    ],
    country: 'Canada',
};

var {name: realName, languages: [{name: languageName}]} = nestedData ;

console.log(realName); // Awesome Programmer
console.log(languageName); // javascript

最简单的解决方案:

dict = {'first': 1,
        'second': 2,
        'third': 3}
现在,


将返回“Excluded”,这是默认值。

我实现这一点的方法是使用
对象。分配
函数

var defaults = {
    a: 'test1',
    b: 'test2'
};
const defaultProperties = { 'foo': 'bar', 'bar': 'foo' };
const overwriteProperties = { 'foo': 'foo' };
const newObj = Object.assign({}, defaultProperties, overwriteProperties);
console.log(defaultProperties);  // {"foo": "bar", "bar": "foo"}
console.log(overwriteProperties);  // { "foo": "foo" };
console.log(newObj);  // { "foo": "foo", "bar": "foo" }

我来这里寻找解决方案,因为标题与我的问题描述相匹配,但它不是我想要的,但我得到了问题的解决方案(我想为一个属性设置一个默认值,该属性将是动态的,比如日期)


上面的代码就是我最终解决的解决方案。

在我看来,这是最简单易读的方法:

let options = {name:"James"}
const default_options = {name:"John", surname:"Doe"}

options = Object.assign({}, default_options, options)

这是因为

undefined || "1111111" --> "1111111"
"0000000" || "1111111" --> "0000000"
由于
null
undefined
NaN
0
(空字符串),
false
本身都被视为等同于false()。其他任何内容都是正确的

请注意,浏览器和nodejs版本之间并不一致支持这一点(请自行确认)

因此,两种麻烦的情况是空字符串
0
(零)。如果不覆盖这些内容很重要,您可能需要将其改写为:

if (typeof obj.d == "undefined") obj.d = "default"
obj.d ??= "default"
这也将在浏览器间得到更好的支持

或者,您可以这样写:

if (typeof obj.d == "undefined") obj.d = "default"
obj.d ??= "default"
这是仅适用于
null
undefined
()的值,空字符串不是其中的一部分。然而,这再次削弱了跨浏览器支持


另请参见Mozilla官方网站-。

每个不存在的属性或一个已知的属性名称?也看到了该页面,我们一定读过同一篇文章。不过只有方法。这可以用DefineGeter完成,但不幸的是ECMA5中没有。他们不会使用另一种在我看来更糟糕的getter/setter方法(需要事先定义属性)。这可能是未来的答案:)让我们希望浏览器能很快实现:)♬我相信未来的答案将是使用@JamesLong是的,你是对的!事实证明,未来已经到来:)3年前,我问了一个问题,这个问题现在可以在FF(和其他浏览器很快)。我在下面添加了一个答案。警告:
var-someVar=o.someVar | |“我的默认值”将产生潜在的意外结果<代码>someVar=o.someVar==未定义?o、 someVar:“我的默认值”会更好。当默认值也计算为
false时,我通常单独使用
|
。(例如 O.SMOVAR(0))这是一个很好的观点,这在任何一个虚假的值都是有效输入的地方是行不通的,在使用这个模式时你必须考虑一下。但通常情况下,将显式设置为
null
false
的属性与未设置属性的处理方式相同是有意义的,在这种情况下,这会产生双重作用。不过警告是公平的。@Shanimal您的示例是错误的,应该是
someVar=o.someVar==undefined?“我的默认”:o.someVar,只是一个小问题,但当我第一次尝试您的代码时,它让我有点不知所措;-)是的@Metalskin我们不关心未定义的值,是吗?lol.对不起,希望这个错误没有花费你太多的时间:)如果你调用console.log(emptyObj),它会返回{}。not{attribute1:'defaultValue1'}是,因为
attribute1:defaultValue1
在原型和控制台上。log仅枚举顶级对象上设置的项,而不是在原型上设置的项
undefined || "1111111" --> "1111111"
"0000000" || "1111111" --> "0000000"
if (typeof obj.d == "undefined") obj.d = "default"
obj.d ??= "default"