다음과 같이 javascript 객체의 기본 속성을 설정하는 방법이 있습니까?
var emptyObj = {};
// do some magic
emptyObj.nonExistingAttribute // => defaultValue
IE는 무시할 수 있습니다. Chrome 프레임은 그 두통을 덜어주었습니다.
답변:
몇 년 전에 질문 한 이후로 상황이 잘 진행되었습니다.
프록시는 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의 Proxies 문서에서 더 많은 것을 읽으십시오 .
Object.getEntries것은 Proxy에서 호출 할 수 없다는 의미이기도합니다. (
Object.entries처리기를 수정하여 액세스 할 때 속성을 설정할 수 있습니다. 변경 return target.hasOwnProperty(name) ? target[name] : 42;에 if (!target.hasOwnProperty(name)) target[name] = 42; return target[name];.
자바 스크립트에서이를 설정하는 방법은 없습니다. undefined존재하지 않는 속성을 반환 하는 것은 핵심 자바 스크립트 사양의 일부입니다. 이 유사한 질문에 대한 토론을 참조하십시오 . 내가 거기에서 제안했듯이 한 가지 접근 방식 (정말 추천 할 수는 없지만)은 전역 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 || 0`)
null또는 false이 두가지 임무를 수행하는 경우에 설정되지 않은 속성과 동일한 방법을. 그러나 경고는 공정합니다.
someVar = o.someVar === undefined ? "my default" : o.someVar;. 사소한 문제 일 뿐이지 만 코드를 처음 시도했을 때 약간의 문제가 발생했습니다 ;-)
사용 destructuring (새 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'
기본값 인 '제외됨'을 반환합니다.
dict = {'first': 0, 'second': 1, 'third': 2}
a.b.c.d. A, 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);
이제 첫 번째 개체가 비어 있지만 프로토 타입이 defaults개체를 가리키는 두 개의 개체가 있습니다 . 테스트하려면 :
console.log('Unchanged', properties);
properties.a = 'updated';
console.log('Updated', properties);
console.log('Defaults', Object.getPrototypeOf(properties));
한 가지 방법은 기본 개체를 가져 와서 대상 개체와 병합하는 것입니다. 대상 개체는 기본 개체의 값을 재정의합니다.
jQuery에는이를 수행하는 .extend()메서드가 있습니다. jQuery는 필요하지 않지만 다음과 같은 바닐라 JS 구현이 있습니다.
http://gomakethings.com/vanilla-javascript-version-of-jquery-extend/