次のようにjavascriptオブジェクトのデフォルト属性を設定する方法はありますか?
var emptyObj = {};
// do some magic
emptyObj.nonExistingAttribute // => defaultValue
IEは無視できますが、ChromeFrameはその頭痛の種から私を解放しました。
回答:
数年前に質問して以来、物事は順調に進んでいます。
プロキシはES6の一部です。次の例は、Chrome、Firefox、Safari、およびEdgeで機能します。
var handler = {
get: function(target, name) {
return target.hasOwnProperty(name) ? target[name] : 42;
}
};
var p = new Proxy({}, handler);
p.answerToTheUltimateQuestionOfLife; //=> 42
詳細については、Mozillaのプロキシに関するドキュメントをご覧ください。
Object.getEntriesと、プロキシで呼び出すことができないことも意味します:(
Object.entries、それらがアクセスされたとき、あなたはセットのプロパティにハンドラを変更することができます。に変更return target.hasOwnProperty(name) ? target[name] : 42;しif (!target.hasOwnProperty(name)) target[name] = 42; return target[name];ます。
Javascriptでこれを設定する方法はありません-undefined存在しないプロパティを返すことは、コアJavascript仕様の一部です。この同様の質問の説明を参照してください。そこで提案したように、1つのアプローチ(実際にはお勧めできませんが)は、グローバル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";
var someVar = o.someVar || "my default";o.someVarが設定されているが、falseと評価されると予期しない結果が生じる可能性があります(例:null、0、 "")。someVar = o.someVar === undefined ? o.someVar : "my default";の方がいい。||デフォルトでもfalse. (e.g. o.someVar ||と評価される場合、私は通常、単独で使用します。
nullまたはfalse未設定のプロパティと同じように扱うことは理にかなっています。この場合、これは二重の義務を果たします。ただし、警告は公正です。
someVar = o.someVar === undefined ? "my default" : o.someVar;マイナーな問題にすぎないはずですが、私が最初にあなたのコードを試したとき、それは私を少し投げました;-)
破壊を使用する(ES6の新機能)
Mozilaによるすばらしいドキュメントと、構文を私よりもよく説明している素晴らしいブログ投稿があります。
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
これは確かに、プロトタイプベースのオブジェクトの典型的な使用法のように聞こえます。
// 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
attribute1: defaultValue1はプロトタイプ上にあり、console.logは、プロトタイプではなく、最上位オブジェクトに設定されたアイテムのみを列挙するためです。しかし、私のconsole.log(emptyObj.attribute1)示すように、価値はそこにあります。
JSON.stringify(emptyobj)。と同じ問題です。この問題に対応してすべての属性を返すメソッドを作成することを余儀なくされました
私のコードは:
function(s){
s = {
top: s.top || 100, // default value or s.top
left: s.left || 300, // default value or s.left
}
alert(s.top)
}
function foo( array $kwargs = array() ) { // Fill in defaults for optional keyworded arguments. $kwargs += array( 'show_user' => true, 'show_links' => false, ); ...
私がこれを達成する方法は、object.assign関数を使用することです
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" }
overwriteProperties正しい方法は次のとおりです。const newObj = Object.assign({}, defaultProperties, overwriteProperties)
最も簡単なアプローチはを使用することだと思います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"
ドキュメント(ポリフィル付き):https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
またはあなたはこれを試すことができます
dict = {
'somekey': 'somevalue'
};
val = dict['anotherkey'] || 'anotherval';
String()修正しませんか?のように:val = dict[String('anotherkey')] || 'anotherval';
d = {x: 1, y: 0}そしてd['y'] || 100その後である、あなたのアイデアを試してみていない、それは誤って100を与えるd[String('y')] || 100-それはまだそれが0に与える必要があるときに不適切な100を与える
すべてのソリューションの中で最も単純:
dict = {'first': 1,
'second': 2,
'third': 3}
さて、
dict['last'] || 'Excluded'
デフォルト値である「Excluded」を返します。
dict = {'first': 0, 'second': 1, 'third': 2}
a.b.c.d。、D、またはcが未定義の場合は、エラーを打つ、あなただけ行うことができます(((a || {}).b || {}).c || {}).d) || "default"
これは私にはそうするための最も簡単で読みやすい方法のようです:
let options = {name:"James"}
const default_options = {name:"John", surname:"Doe"}
options = Object.assign({}, default_options, options)
昨日、Object.__noSuchMethod__プロパティについて言及している記事を見ました。JavascriptTips試してみる機会がなかったので、ブラウザのサポートについてはわかりませんが、何らかの方法で使用できますか?
三項演算子についてまだ誰も言及していないことに驚いています。
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であっても、正しい値を取得します。
これは実際にはで行うことができますObject.create。「未定義」のプロパティでは機能しません。しかし、デフォルト値が与えられているものについては。
var defaults = {
a: 'test1',
b: 'test2'
};
次に、プロパティオブジェクトを作成するときに、 Object.create
properties = Object.create(defaults);
これで、最初のオブジェクトが空である2つのオブジェクトが作成されますが、プロトタイプはそのdefaultsオブジェクトを指しています。テストする:
console.log('Unchanged', properties);
properties.a = 'updated';
console.log('Updated', properties);
console.log('Defaults', Object.getPrototypeOf(properties));
1つのアプローチは、デフォルトオブジェクトを取得し、それをターゲットオブジェクトとマージすることです。ターゲットオブジェクトは、デフォルトオブジェクトの値を上書きします。
jQueryにはこれを行う.extend()メソッドがあります。ただし、次のようなバニラJS実装があるため、jQueryは必要ありません。
http://gomakethings.com/vanilla-javascript-version-of-jquery-extend/