2013-08-02 4 views
0

다른 오브젝트를 사용하여 오브젝트를 구성하려는 경우. 인수는 필수는 아닙니다.오브젝트에있는 오브젝트의 값 추출 - 참조 오류

var Key = function(args) { 
    text in args && this.text = args.text; 
}; 

한 줄에 내 멤버를 초기화 :

이유는 다음을 수행 할 수 없습니까? 진짜로해야할 것 같은데 ...)?

도움 주셔서 감사합니다.

+1

전체 오류 메시지가 ReferenceError가가'이다. –

+0

'if()'를 사용하지 않는 이유는 무엇입니까? 결국 솔루션과 동일한 문자 수를 갖게되고 더 명확하게 읽을 수 있습니다. 'if (text in args) this.text = args.text' –

+0

if를 사용할 때 항상 괄호를 추가하여 코드를 일률적으로 유지하여 3 줄을 사용합니다. – Virus721

답변

1

문제의 원인은 원하는 의미와 일치하지 않는 operator precedence입니다.

해당 표현식 문에서 가장 높은 우선 순위는 . 연산자입니다. 어떤 연산자보다 우선 순위가 높기 때문에 괄호를 사용하지 않아도됩니다.


다음으로 가장 높은 우선 순위는 in 연산자입니다, 그래서 우리는 첫 번째 피연산자로 포장 할 수 있습니다. && 운영자가 다음으로 가장 높은 우선 순위를 가지고 그 후


(text in args) && this.text = args.text; 

, 그래서 다시 우리는 피연산자로 포장 할 수 있습니다.

((text in args) && this.text) = args.text; 

그래서 지금 우리는이 문제를 볼 수 있습니다. args.text((text in args) && this.text) 표현식의 결과에 할당하려고 시도하고 있습니다.이 표현식은 확인 가능한 식별자에 할당되어 있지 않으므로 유효하지 않습니다.

이제 우리는 = 연산자의 우선 순위를 수동으로 적용해야한다는 것을 알았으므로 연산이 예상되는 피연산자로 래핑하고 괄호를 &&으로 조정할 수 있습니다. 우리가 우선 순위의 나머지 부분은 자연스럽게 우리의 의도에 대한 벌금을 밖으로 일 것을 알고 있기 때문에

((text in args) && (this.text = args.text)); 

, 우리는 다른 괄호를 제거 할 수 있습니다. assignment`에 잘못된 왼쪽, 어느 것이 작동하고 왜 당신의 대답은 그것을 수정하지 않은 이유를 설명 :

text in args && (this.text = args.text); 
+0

좋은 설명 주셔서 감사합니다. 나는 내가 찾은이 마지막 줄이 옳다고 생각했지만 오류가 발생한다. "text is undefined". 대신 텍스트를 문자열로 사용해야합니다 : args에 'text'? – Virus721

+0

@ Virus721 :'text' 변수가없고'args' 오브젝트 내에서''text ''라는 이름의 프로퍼티를 찾으려한다면, 문자열이 필요합니다. –

+0

@Crasy Train 필자는'if ('text'in args) this.text = args.text;를 시도했지만 'Operand args'에 'TypeError : invalid'라고 표시했습니다. 나는 전에 이런 종류의 일을 여러 번 해본 적이 있다고 생각했다. – Virus721