code

이 자바 스크립트 코드 줄은 동일합니까?

codestyles 2021. 1. 11. 08:15
반응형

이 자바 스크립트 코드 줄은 동일합니까?


JavaScript 코드에서이 문자열을 찾았습니다.

var c = (a.b !== null) ? a.b : null;

이것은 if-else 문의 속기이지만 null이면 null 값이 할당됩니다. 그것은 항상 동등 하지 않습니까?

var c = a.b

모든 경우를 포함하여-예외, null, 정의되지 않음 등?

즉,이 줄은 (항상) 동일합니까?

var c = (a.b !== null) ? a.b : null;

-vs-

var c = a.b

아니요, b가 변수를 업데이트하는 게터 인 경우 항상 같을 필요는 없습니다 . 하지만 이런 식으로 코딩하는 것은 나쁜 습관입니다.

var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = (a.b !== null) ? a.b : null;
// outputs 2
console.log(c);
var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = a.b;
// outputs 1
console.log(c);

이러한 명령문은 논리적으로 동일합니다.

즉, 다른 답변 에서 언급했듯이 a.b부작용이 있으면 명령문이 동일한 프로그램 상태가되지 않습니다.

이것은 var c실행되는 명령문에 따라 다른 값 갖는 형태로 쉽게 분명해질 수 있으며 a.b프로그램의 다른 곳에서 무언가를 수정하는 경우 더 숨겨 질 수 있습니다.

리팩토링

리팩토링에 대해 논의 했으므로 간단히 다루겠습니다. 위의 내용이 분명해 졌으면하는 것처럼 직접 리팩토링은 모든 시나리오에서 안전하지 않습니다 . 그러나 나는 여전히 어떤 종류의 리팩터링을 권장합니다.

두 가지 가능한 상황은 다음과 같습니다.

  1. a.b 부작용이 없으며 직접 리팩토링이 안전합니다.
  2. a.b숨겨진 부작용이 있습니다. 이것은 매우 불명확하고 혼란스럽고 완전히 잘못된 코드를 나타냅니다 . 진술 중에 발생하는 모든 변경 사항이 독자에게 명확하고 명확 하도록 리팩토링되어야합니다 (직관적으로 그렇게하고 주석에 의해 지원되기를 바랍니다).

@potatopeelings가 이미 지적했듯이, 두 가지 가능한 문이 항상 동일하지는 않습니다. 하나는 모호한 코드를 작성할 수 있고 결과가 다를 수 있기 때문입니다.

그러나 다음과 같은 코드가 표시되면

var c = (a.b !== null) ? a.b : null;

나는 코드의 의도가

var c = a.b;

코드를 더 예쁘게 만들도록 변경하겠습니다. 이 변경으로 인해 코드가 테스트 단계를 통과하지 못하는 경우, 즉, a.bgit blame으로 작성자를 찾으려고 노력할 것 입니다.

So, my answer is, that the two statements are not equivalent, but should be equivalent in well-written code.


Well, actually not even

var c = (a !== null) ? a : null;

is guaranteed to be equivalent to

var c = a;

when a is resolved by a getter or an ES6 proxy handler on the global object.

Hence for instance, this assign to c the value 0:

Object.defineProperty(self, 'a', { get: function() { return c ^= 1; } });
var c = (a !== null) ? a : null;
console.log(c);

while this assigns to c the value 1:

Object.defineProperty(self, 'a', { get: function() { return c ^= 1; } });
var c = a;
console.log(c);


You're right, var c = a.b is exactly the same as var c = (a.b !== null) ? a.b : null;

My guess is the null in the ternary operator was meant to be anything except null, a default value if you will.


The reason for that confusingly odd syntax is because a.b might be an empty string OR undefined, and apparently an empty string is valid input.

Also, note: a.b might be a function.

ReferenceURL : https://stackoverflow.com/questions/31939218/are-these-lines-of-javascript-code-equivalent

반응형