有没有办法设置javascript对象的默认属性:
var emptyObj = {};
// do some magic
emptyObj.nonExistingAttribute // => defaultValue
IE可以被忽视,Chrome Frame让我感到头疼。
答案 0 :(得分:76)
自从我几年前提出问题以来,事情进展顺利。
代理是ES6的一部分。以下示例适用于Chrome, Firefox, Safari and Edge:
var handler = {
get: function(target, name) {
return target.hasOwnProperty(name) ? target[name] : 42;
}
};
var p = new Proxy({}, handler);
p.answerToTheUltimateQuestionOfLife; //=> 42
在Mozilla's documentation on Proxies中阅读更多内容。
答案 1 :(得分:25)
没有办法在Javascript中设置它 - 对于不存在的属性返回undefined
是核心Javascript规范的一部分。见the discussion for this similar question。正如我在那里建议的那样,一种方法(虽然我不能真正推荐它)将是定义全局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";
答案 2 :(得分:14)
使用解构(ES6中的新功能)
有很棒的documentation by Mozila以及精彩的blog post可以更好地解释语法。
var emptyObj = {};
const { nonExistingAttribute = defaultValue } = emptyObj;
console.log(nonExistingAttribute); // defaultValue
我可以重命名这个变量吗?当然!
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
答案 3 :(得分:10)
这听起来像是基于原型的对象的典型用法:
// 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
答案 4 :(得分:10)
我的代码是:
function(s){
s = {
top: s.top || 100, // default value or s.top
left: s.left || 300, // default value or s.left
}
alert(s.top)
}
答案 5 :(得分:5)
或者你可以试试这个
dict = {
'somekey': 'somevalue'
};
val = dict['anotherkey'] || 'anotherval';
答案 6 :(得分:3)
我实现此目标的方法是使用object.assign
函数
const defaultProperties = { 'foo': 'bar', 'bar': 'foo' }
const overwriteProperties = { 'foo': 'foo' }
const newObj = Object.assign(defaultProperties, overwriteProperties) // { 'foo': 'foo', 'bar': 'foo' }
答案 7 :(得分:2)
昨天我看到一篇文章提到Object.__noSuchMethod__
属性:JavascriptTips我没有机会玩它,所以我不知道浏览器支持,但也许你可以以某种方式使用它?
答案 8 :(得分:2)
我很惊讶没人提到三元运算符。
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,它仍然会得到正确的值。
答案 9 :(得分:1)
var obj = {
a: 2,
b: 4
};
console.log(obj);
--> {a: 2, b: 4}
function applyDefaults(obj) {
obj.a ||= 10;
obj.b ||= 10;
obj.c ||= 10;
}
// do some magic
applyDefaults(obj);
console.log(obj);
--> {a: 2, b: 4, c: 10}
这是可行的,因为
undefined || "1111111" --> "1111111"
"0000000" || "1111111" --> "0000000"
作为null
、undefined
、NaN
、0
、""
(空字符串)、false
本身,都被认为是相当于假 (falsy)。其他都是true
(truthy)。
请注意,这并非跨浏览器和 nodejs 版本统一支持(请自行确认)。
所以两个麻烦的情况是空字符串 ""
和 0
(零)。如果不覆盖这些很重要,您可能需要将其重写为:
if (typeof obj.d == "undefined") obj.d = "default"
这也将在浏览器中得到更好的支持。
或者你可以把它写成:
obj.d ??= "default"
这是 nullish assignment,它仅适用于 null
或 undefined
(nullish) 的值 - 其中空字符串 not 部分。然而,这再次削弱了跨浏览器的支持。
另见 Mozilla 官方网站 - Assigning a default value to a variable。
答案 10 :(得分:1)
最简单的解决方案:
dict = {'first': 1,
'second': 2,
'third': 3}
现在,
dict['last'] || 'Excluded'
将返回'Excluded',这是默认值。
答案 11 :(得分:1)
我认为最简单的方法是使用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): https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
答案 12 :(得分:0)
for
答案 13 :(得分:0)
一种方法是获取默认对象并将其与目标对象合并。目标对象将覆盖默认对象中的值。
jQuery使用.extend()
方法执行此操作。然而,不需要jQuery,因为有可以在这里找到的vanilla JS实现:
http://gomakethings.com/vanilla-javascript-version-of-jquery-extend/
答案 14 :(得分:0)
我来这里是为了寻找解决方案,因为标题与我的问题描述相匹配,但这不是我想要的,但是我为我的问题找到了解决方案(我希望为动态属性提供默认值像日期)。
let Blog = {
title : String,
image : String,
body : String,
created: {type: Date, default: Date.now}
}
上面的代码是我最终解决的解决方案。
答案 15 :(得分:0)
在我看来,这是最简单易读的方式:
let options = {name:"James"}
const default_options = {name:"John", surname:"Doe"}
options = Object.assign({}, default_options, options)
答案 16 :(得分:0)
实际上这可能与Object.create
有关。它不适用于未定义的"属性。但对于那些已被赋予默认值的那些。
var defaults = {
a: 'test1',
b: 'test2'
};
然后,当您创建属性对象时,可以使用Object.create
properties = Object.create(defaults);
现在您将有两个对象,其中第一个对象为空,但原型指向defaults
对象。测试:
console.log('Unchanged', properties);
properties.a = 'updated';
console.log('Updated', properties);
console.log('Defaults', Object.getPrototypeOf(properties));