source

느낌표 두 개?

factcode 2022. 9. 8. 21:50
반응형

느낌표 두 개?

중복 가능성:
JavaScript에서 !! (비) 연산자는 무엇입니까?
JavaScript에서 !! 연산자(이중 느낌표)는 무엇을 의미합니까?

그래서 코드를 디버깅하다가 이걸 발견했어요

var foo.bar = 0; // this is actually passed from another function, adding it for context

function(foo) {
    var someVar = !!foo.bar;

    if (foo.bar) {
      // ..stuff happens
    } else {
      // .. something else happens
    }
}

좋아, 내가 묻고 싶은 것은,!!그게 하고 있는 모든 일은0 === false.

  1. 그것을 사용하는 것에 비해 어떤 이점이 있습니까?boolean(foo.bar)?

  2. foo.bar은 다음과 같은 이유로 평가될 수 있습니다.0 === false이미, 그런데 왜 변환 과정을 거쳤지?(someVar는 다른 곳에서도 재사용되지 않습니다.)

그러면 값이 부울로 변환되어 부울 유형이 보장됩니다.

"foo"      // Evaluates to "foo".
!"foo"     // Evaluates to false.
!!"foo"    // Evaluates to true.

한다면foo.bar0이 아니라 다른 거짓 값일 수 있습니다.다음 진실 표를 참조하십시오.

javascript의 진실 표

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

출처 : Doug Crockford

Javascript는 NaN 값에 대해서도 매우 이상합니다.===와 달리 행동할 수 있는 것은 이것뿐입니다.

NaN   ===  NaN     //false
!!NaN === !!NaN    //true

// !!NaN is false

내 생각에 정답은 별로 요점이 없는 것 같아.우리는 그것이 어떻게 발생했는지 추측할 수 있다:

  • 아마도 사용된 기능의 이전 버전일 것입니다.someVar여러 장소에서, 또는 실제로 이익을 얻는 방법으로true또는false그래서 이게 더 말이 되더라고요.
  • 이 함수를 쓴 사람은 아마 이 함수를 사용하는 데 너무 익숙할 것이다.!!개종하다true/false그는 여기서 그럴 필요가 없다는 것조차 알아차리지 못했다.
  • 함수를 작성한 사람은 모든 계산(이 경우 부울 변환)에 어떤 변수를 결과에 할당함으로써 의미 있는 이름을 부여해야 한다고 느낄 수 있습니다.
  • JavaScript의 Boolean 변환은 의외로 에러가 발생하기 쉽기 때문입니다(예를 들어, new Boolean(false)는, 함수의 작성자는, 함수의 잠재적인 에러 포인트로서 주의를 환기하기 위해서, 암묵적으로 실시하는 것이 아니라, 항상 명시적으로 실시할 필요가 있다고 느끼고 있습니다.
    • 물론, 이것은 함수를 쓴 사람이 다음과 같이 생각한다는 것을 전제로 한다.!!"명시적" 부울 변환으로 사용됩니다.엄밀히 말하면 다음과 같은 암묵적인 부울 변환을 사용합니다.if하지만 이 관용어에 익숙해지면 명시적인 변환이 됩니다.

하지만 내 주관적인 의견으로는, 그 이유들 중 어느 것도 좋은 것은 아니다!

위에서 설명한 바와 같이 부울 타입을 가진 오브젝트를 강제합니다.직접 확인하실 수 있습니다.

    (function typecheck() {
      var a = "a";
      var b = !a;
      var c = !!a;
    
      console.log("var a =", a, typeof(a))
      console.log("var b =", b, typeof(b))
      console.log("var c =", c, typeof(c))
    })();

단순하게 비교만 한다면 변환은 나중에 당신에게 강요를 줄 뿐이다.

참고로 JavaScript에서는 다음 값이 FALSE로 강제됩니다.

  • 거짓의
  • 0
  • ""
  • 무효
  • 정의되어 있지 않다

언급URL : https://stackoverflow.com/questions/9284664/double-exclamation-points

반응형