논리 연산자 (예 : ||, && 등)에 복합 할당 연산자가없는 이유는 무엇입니까?


20

ECMA-262, part 11.13에 따르면, 복합 할당 연산자의 전체 목록은 다음과 같습니다 *= /= %= += -= <<= >>= >>>= &= ^= |=.

일부 11.11에 따르면, var c = a || b둘 것이다 a으로 값을 c경우 ToBoolean(a)true이고 넣어 것 b으로 값을 c, 그렇지 않으면. 따라서 논리적 OR 은 종종 통합 연산자로 사용됩니다.

function (options) {
    options = options || {};
}

자주, 위에 표시된 것처럼 병합을 사용하여 변수의 기본값을 지정합니다 a = a || b.

복합 할당 연산자 ||=가 실제로 유용하여 위의 코드를 더 짧고 깔끔하게 작성할 수 a ||= b있습니다. 그러나 ( 및 다른 복합 할당 연산자는 있지만 *=) 존재하지 않습니다 +=.

문제는 왜?


2
나는 % = 연산자조차 존재한다는 것을 매우 당혹스럽게 생각합니다. 누가 필요하다고 결정 했습니까? 이러한 연산자 중 일부는 잘못된 언어 디자인 결정처럼 보입니다.
Jonathan Rich

2
@JonathanRich : 왜 % =가 없습니까? 이러한 할당 연산자를 사용하려면 조만간 일부 개발자 (예 : penartur)가 왜 연산자가 다른 연산자보다 "평등한지"궁금해 할 것입니다.
케빈 클라인

4
@JonathanRich Crypto는 모듈러스를 많이 사용합니다. Furthemore, 산술 할당 연산자로 연산의 나머지 부분과 원하는 직교성이 (만약 하나 기대하는 +=, *=, -=, /=, 왜 안 것 %=일?).

4
@JonathanRich : 연산자는 원이 angle %= 360있거나 정규화하려고 할 때 편리합니다 (예 : 또는 vertexIndex %= numberOfVertices닫힌 다각형의 정점 목록).
세바스찬 네 그라 수스

1
2007 년 (누군가 주장하는 사람) Brendan Eich는 다음 ||=과 같이 선언했으며 &&=곧 올 것입니다. 두 가지 모두 유용하지만 할당 방식을 && 형식으로 남겨 둘 이유가 없습니다. " .
Phrogz

답변:


12

한 가지 이유는 논리 연산자 &&||"단락"동작 이 있기 때문입니다 . 의 오른쪽 피연산자 &&|| 필요한 경우가 아니면 평가되지 않습니다. 아마도 이런 이유로 언어 설계자들은 표현의 의미가 a ||= f()명확하지 않다고 결정 했기 때문에 그러한 연산자는 더 잘 빠졌습니다.


2
예. 예를 들어, 많은 사람들은이를 a ||= b로 해석해야 한다고 생각 a = a || b하지만 실제로 a || a = bRuby 와 같이 해석 될 수 있습니다 . 세터 에 부작용이 있으면 다를 수 있습니다 . 하나를 선택하면 다른 캠프의 사용자에게는 좋지 않을 수 있습니다. 나는 개인적 a || a = b으로 길을 좋아 하지만 (루비 방식) 모든 사람이 그 방법에 만족하는지 잘 모르겠습니다.
Franklin Yu

8

"이 언어 기능이 구현되지 않은 이유"에 대한 모든 질문에 대한 일반적인 답변은 언어를 디자인 한 팀이 혜택이 비용보다 중요하지 않다고 결정했다는 것입니다.

비용은 많은 형태를 취할 수 있습니다. 언어 기능을 구현하는 데 시간과 노력이 필요하지만 복잡성의 본질적인 비용도 있습니다.이 기능은 언어의 잠재적 이점에 비례하여 언어를 더 복잡하거나 모호하게합니까?

가상 ||=연산자는 다른 복합 할당 연산자와 근본적으로 다른 작업을 수행합니다. 다른 연산자는 본질적으로 수학적이지만,이 연산자는 다릅니다. 하나의 값을 다른 값으로 대체합니다 (설명한 맥락에서) 합니다.

이러한 모호함 (운영자 는 상황에 따라 두 가지 다른 기능을 수행함)을 감안할 때 왜 언어에 포함되지 않았는지 알기가 어렵지 않습니다. 그 변화를 진술하지만

function (options) {
    options = options || {};
}

function (options) {
    options ||= {};
}

null 병합을 수행하는 것이 귀중한 기능이므로 이점이 훨씬 명확하지 않습니다. 값 대체가 발생하면 논리적이고 명확한 것으로 보입니다. 하는 경우 등호 오른쪽에 두 값 모두 있어 대체가 발생할 수 있다는 시각적 표시를 제공하는 .

C #은 다른 경로를 취했으며 null 병합에 특정 연산자 를 사용합니다 .


1
코드를 읽을 때 첫 번째 예제는 두 번째 옵션 인 "옵션 또는 아무것도 없음"과 비교하여 "옵션은 옵션이거나 아무것도 없음"이라는 더 자연스럽게 읽습니다. 나는 이것이 "또는 equals"연산자를 포함하지 않는 또 다른 이유라고 생각한다
Andy Hunt

당신의 대답에 대한 훌륭한 개방. 그리고 귀하의 답변의 시작은 태그에 대한 위키 내에서 속한다고 생각합니다.

3
@AndyBursh 모든 복합 할당 연산자에 동일한 논리를 적용 할 수 있습니다. "X는 X 곱하기 2"는 "X 곱하기 2"와 비교하여 더 자연스럽게 읽습니다.
penartur

2
입력 foo = foo || bar하려면 foo두 번 입력 해야합니다 . 이것은 번거롭고 오타를 리팩토링하는 경향이 있습니다.
Phrogz

1
나는 당신이 "수학적"의 의미를 오해하고 있다고 생각합니다. 아마도 당신은 부울 대수에 대해 들었을 것입니다. ||=null 병합 연산자 로 사용하기 위해 부울이 아닌 강제 변환은 직관적이지 않으며 실제로 코드 형태가 둔해 보입니다. 그것이 유용한 곳은 부울 수학을 시도 할 때입니다. function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
joshperry

3

||=유용한 구성 이 맞습니다 . Perl에 존재합니다.

실제로 Perl은 다음을 모두 사용할 수있게합니다.

**=    +=    *=    &=    <<=    &&=   -=    /=    
|=     >>=   ||=   .=    %=     ^=    //=   x=

이것들 중 일부는 훌륭합니다 ( .=문자열 끝에 무언가를 추가합니다).&&= ??? ?)

언어에 포함되는 것은 실제로 디자인 철학의 특징입니다.


3
stackoverflow.com/questions/12589467/… 무엇을 &&=/ 무엇을 의미 하는지 .
Mat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.