[javascript] Javascript에서 Type Coercion은 정확히 무엇입니까?

Javascript에서 유형 강제는 정확히 무엇입니까?

예를 들어, ==대신 ===?



답변

유형 강제는 연산자의 피연산자가 다른 유형일 때 그 중 하나가 다른 피연산자의 유형과 “동등한”값으로 변환됨을 의미합니다. 예를 들어 다음과 같은 경우 :

boolean == integer

부울 피연산자는 정수로 변환 false됩니다. 0, true1이됩니다. 그런 다음 두 값이 비교됩니다.

그러나 비 변환 비교 연산자를 사용하면 ===이러한 변환이 발생하지 않습니다. 피연산자가 다른 유형이면이 연산자는를 반환 false하고 동일한 유형일 때만 값을 비교합니다.


답변

타입 강제의 일반적인 개념을 이해하는 데 도움이 될 타입 시스템에 대한 짧은 소개부터 시작하겠습니다.

언어의 유형 시스템은 해당 언어에 존재하는 데이터 유형과 서로 다른 연산자를 사용하여 결합 할 수있는 방법을 알려주는 규칙을 정의합니다. 예를 들어, 그러한 규칙 중 하나는 더하기 (+) 연산자가 숫자에만 작용하도록 지정할 수 있습니다. 이러한 규칙은 주로 발에 총을 쏘는 것을 방지하기 위해 존재합니다. 하지만 프로그래머가 프로그램에서 그 규칙을 어기면 어떻게 될까요? 언어가 이러한 표현이 의미가 없다고 생각하더라도 프로그래머가 프로그램을 입력 {} + {}하거나 입력하는 것을 방해하는 “hello” + 5것은 없습니다.

이러한 상황에서 궁극적으로 일어나는 일은 언어가 유형 규칙에 대해 얼마나 엄격한 지에 따라 다릅니다.

언어 유형 시스템은 종종 규칙을 위반하는 두 가지 입장 중 하나를 보유합니다.

  1. “이봐, 멋지지 않아!”라고 말합니다. 즉시 프로그램을 중단하십시오.
  2. “{}로는 아무것도 할 수 없지만 숫자로는 할 수 있습니다.”라고 말하고 {}를 숫자로 변환 해 봅니다.

규칙에 대해 첫 번째 위치를 차지하는 유형 시스템을 사용하는 언어를 구어 적으로 “강력한 유형”언어라고합니다. 그들은 당신이 그 규칙을 어 기지 못하게하는 것에 대해 엄격합니다. 두 번째 접근 방식 (예 : JavaScript)을 사용하는 언어를 “약한 유형”또는 “느슨한 유형”언어라고합니다. 물론 규칙을 어길 수는 있지만 규칙을 준수하기 위해 프로그램에서 설명한 데이터 유형을 강제로 변환 할 때 놀라지 마십시오. 그 행동은 … (드럼 롤) …로 알려져 있습니다. 유형 강제 있습니다.

이제 JavaScript의 몇 가지 예를 살펴 보겠습니다. 먼저 유형 강제로 이어지지 않는 표현식부터 시작하겠습니다.

5 + 5

완벽하게 유효한 두 숫자에 + 연산자를 사용합니다. 이 프로그램은 +를 “더하기”를 의미하는 것으로 취급하고 행복하게 두 숫자를 더합니다. 변환이 필요하지 않습니다.

하지만…

[] + 5

어 오. JavaScript에서 +두 개의 숫자를 추가하거나 두 개의 문자열을 연결하는 것을 의미 할 수 있습니다. 이 경우 두 개의 숫자도없고 두 개의 문자열도 없습니다. 우리는 오직 하나의 숫자와 객체를 가지고 있습니다. JavaScript의 유형 규칙에 따르면 이것은 논리적으로 의미가 없습니다. 그것은 당신이 규칙을 어기는 것을 용서하기 때문에, 충돌하는 대신 어쨌든 그것을 이해하려고 노력합니다. 그렇다면 JavaScript는 무엇을합니까? 음, 문자열을 연결하는 방법을 알고 있으므로 []와 5를 모두 문자열로 변환하고 결과는 문자열 값 “5”입니다.

비교 연산자 ==와 의 거래는 무엇입니까 ===? 두 개의 비교 연산자가있는 이유는 무엇입니까?

==JavaScript의 유형 변환 동작에 영향을받지 않습니다. 다음과 같은 표현5 == “5”will 은 JavaScript가 동일한 유형의 데이터를 비교하도록 이들 중 하나를 변환하려고 시도하기 때문에 true 평가됩니다.

대부분의 경우 비교 대상 데이터가 다른 유형인지 알고 싶어서 수행 할 작업을 결정할 수 있기 때문에 바람직하지 않습니다. 그것이 ===연산자가 들어오는 곳 입니다.를 사용하면 ===유형 변환이 발생하지 않습니다. 따라서 표현식 5 === “5”은 거짓으로 평가됩니다.


답변

Python에서 문자열과 정수를 추가하려고하면 오류가 발생합니다.

>>> "hi" + 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

그러나 JavaScript에서는 그렇지 않습니다. 는 10문자열로 변환됩니다 :

> "hi" + 10
"hi10"

“유형 강제”는 위의 이름에 대한 멋진 잘못된 이름입니다. 실제로 어떤 언어도 Java 나 C 또는 정적 유형 시스템을 사용하는 다른 언어의 의미에서 “유형”이 없습니다. 언어가 다양한 비 정적 유형 값 간의 상호 작용을 처리하는 방법은 선택과 관례의 문제입니다.


답변

다음 예제로 유형 강제를 설명하겠습니다.

Type Coercion은 Javascript가 자동으로 (즉석에서) 변수를 한 데이터 유형에서 다른 데이터 유형으로 변환 함을 의미합니다.

예 : 123 + "4"일반적으로 오류가 발생하지만 유형 강제로 인해 Javascript 1234에서는 문자열이 발생합니다.

if(23 == "23"){
    console.log(" this line is inside the loop and is executed ");
}

위의 코드에서 유형 강제로 인해 JavaScript는 23(숫자)와 "23"(문자열)이 같은 것으로 생각합니다. 이것은 조건을 true로 만들고 console.log를 인쇄합니다.

다른 경우

if(23 === "23"){
   console.log(" this line is inside the loop and is NOT executed");
}

===의 경우 자바 스크립트가 형식 강요하지 않으며, 이후이 23숫자이며 "23"문자열과의 때문에 ===이 두 가지 데이터 유형 다르고 조건에서 false로 그 리드. console.log를 인쇄하지 않습니다.

간단한 말로

이 경우 =할당 연산자- var a = 3;등의 값을 할당합니다.

(아래 연산자는 비교 용입니다)

이 경우 ==Javascript는 데이터 유형을 다른 유형으로 변환 / 강제 한 다음 비교합니다.

이 경우 === Javascript는 데이터 유형을 변환 / 강제하지 않습니다.

버그를 방지하고 디버깅 목적 ===으로 주로 사용됩니다.

위 정보의 정확성을 알려주세요.


답변

강압이란?

자바 스크립트의 유형 강제 변환은 자바 스크립트 엔진이 특정 유형의 데이터가 필요한 특정 작업을 수행해야 할 때 발생합니다. 엔진이 작업에 적용 할 수없는 특정 유형의 데이터를 발견하면 데이터를 특정 유형으로 강제 변환합니다. 이는 자바 스크립트의 변수가 동적으로 입력되기 때문에 필요합니다. 즉, 주어진 변수에 모든 유형의 값을 할당 할 수 있습니다.

예:


if(1){
  // 1 gets coerced to true
}


if(4 > '3') {
  // 3 gets coerced into a number
}


44 == "44"  // true, the string 44 gets converted to a nr

부울 강제 :

자바 스크립트 강제 변환에서는 true다음 값 을 제외하고 모든 값이로 변환됩니다 false.

console.log(!!"");         // false
console.log(!!0);          // false
console.log(!!null);       // false
console.log(!!undefined);  // false
console.log(!!NaN);        // false
console.log(!!false);      // false

또한 위의 예에서 double! 연산자가 사용됩니다. ! 마크 연산자는 값을 반대 값을 가진 부울로 강제 변환합니다. 이 연산자를 두 번 사용하여 값을 부울로 변환 할 수 있습니다.


답변

a == bjavascript는 값이 동등하게 평가 될 수 있는지 여부 ab따라 평가됩니다. 예를 들어 false == 0는 0이 Boolean false의 값이기도하므로 true로 평가됩니다. 그러나 false === 0엄격하게 비교하면 0이 거짓과 동일한 물리적 값이 아니므로 거짓으로 간주됩니다. 또 다른 예는 false == ''기본적으로 느슨한 비교와 엄격한 비교입니다. 자바 스크립트는 느슨한 형식의 언어이기 때문입니다. 즉, javascript는 코드의 컨텍스트에 따라 변수를 변환하려고 시도하며 엄격하게 비교하지 않으면 상황을 동일하게 만드는 효과가 있습니다. PHP에도이 동작이 있습니다.


답변

유형 강제 변환 은 값을 한 유형에서 다른 유형으로 변환하는 프로세스입니다 (예 : 문자열을 숫자로, 객체를 부울로). 프리미티브이든 객체이든 모든 유형은 유형 강제에 대한 유효한 주제입니다. 기억하자면, 프리미티브는 숫자, 문자열, 부울, 널, 정의되지 않음 + 기호 (ES6에 추가됨)입니다.

암시 적 대 명시 적 강제
유형 강제는 명시 적이거나 암시적일 수 있습니다.

개발자가와 같은 적절한 코드를 작성하여 유형 간 변환 의도를 표현할 때 Number(value)이를 명시 적 유형 강제 변환 (또는 유형 캐스팅)이라고합니다.

JavaScript는 약한 유형의 언어이므로 값이 다른 유형간에 자동으로 변환 될 수도 있으며이를 암시 적 유형 강제라고합니다. 서로 다른 종류의 같은 값에 연산자를 적용 할 때 그것은 보통 일이
1 == null, 2/’5', null + new Date(), 또는 그것과 마찬가지로, 주변 상황에 의해 트리거 될 수 있습니다 if (value) {…}값이 논리 값으로 강제된다.

암시 적 형식 강제 변환을 트리거하지 않는 연산자 중 하나 ===는 완전 항등 연산자라고하는입니다. 반면 느슨한 같음 연산자 ==는 필요한 경우 비교 및 ​​유형 강제를 모두 수행합니다.

암시 적 유형 강제는 양날의 검입니다. 이는 좌절감과 결함의 큰 원인 일뿐만 아니라 가독성을 잃지 않고 코드를 적게 작성할 수있는 유용한 메커니즘입니다.

세 가지 유형의 변환
알아야 할 첫 번째 규칙은 JavaScript에 세 가지 유형의 변환 만 있다는 것입니다.

  • 끈으로
  • 부울로
  • 숫자로

둘째, 프리미티브와 객체에 대한 변환 로직은 다르게 작동하지만 프리미티브와 객체는이 세 가지 방법으로 만 변환 할 수 있습니다.

먼저 프리미티브부터 시작하겠습니다.

문자열 변환

값을 문자열로 명시 적으로 변환하려면 String () 함수를 적용하십시오. 피연산자가 문자열이면 암시 적 강제 변환은 이항 + 연산자에 의해 트리거됩니다.

String(123) // explicit
123 + ''    // implicit

모든 기본 값은 예상대로 자연스럽게 문자열로 변환됩니다.

String(123)                   // '123'
String(-12.3)                 // '-12.3'
String(null)                  // 'null'
String(undefined)             // 'undefined'
String(true)                  // 'true'
String(false)                 // 'false'

기호 변환은 명시 적으로 만 변환 할 수 있지만 암시 적으로 변환 할 수 없기 때문에 약간 까다 롭습니다.

String(Symbol('my symbol'))   // 'Symbol(my symbol)'
'' + Symbol('my symbol')      // TypeError is thrown

부울 변환

값을 부울로 명시 적으로 변환하려면 Boolean()함수를 적용하십시오 . 암시 적 변환은 논리적 컨텍스트에서 발생하거나 논리적 연산자 ( || && !) 에 의해 트리거됩니다 .

Boolean(2)          // explicit
if (2) { ... }      // implicit due to logical context
!!2                 // implicit due to logical operator
2 || 'hello'        // implicit due to logical operator

참고 : 논리 연산자 (예 :|| and && 부울 변환을 내부적 으로 수행하지만 부울이 아닌 경우에도 실제로는 원래 피연산자의 값을 반환합니다.

// returns number 123, instead of returning true
// 'hello' and 123 are still coerced to boolean internally to calculate the expression
let x = 'hello' && 123;   // x === 123

부울 변환의 가능한 결과가 true 또는 false 2 개뿐이면 잘못된 값 목록을 기억하는 것이 더 쉽습니다.

Boolean('')           // false
Boolean(0)            // false     
Boolean(-0)           // false
Boolean(NaN)          // false
Boolean(null)         // false
Boolean(undefined)    // false
Boolean(false)        // false

목록에없는 임의의 값으로 변환됩니다 true포함, object, function, Array, Date, 사용자 정의 유형, 등등. 기호는 진실한 가치입니다. 빈 객체와 배열도 진실 값입니다.

Boolean({})             // true
Boolean([])             // true
Boolean(Symbol())       // true
!!Symbol()              // true
Boolean(function() {})  // true

숫자 변환

명시 적 변환의 경우 및 Number()에서와 마찬가지로 함수를 적용하십시오 .Boolean()String()

암시 적 변환은 더 많은 경우에 트리거되기 때문에 까다 롭습니다.

  • 비교 연산자 (>, <, <=,> =)

  • 비트 연산자 (| & ^ ~)

  • 산술 연산자 (-+ * / %). binary +는 피연산자가 문자열 인 경우 숫자 변환을 트리거하지 않습니다.

  • 단항 + 연산자

  • 느슨한 같음 연산자 == (포함! =).

    두 피연산자가 모두 문자열 인 경우 ==는 숫자 변환을 트리거하지 않습니다.

    Number ( ‘123’) // 명시 적 + ‘123’// 암시 적 123! = ‘456’// 암시 적 4> ‘5’// 암시 적 5 / null // 암시 적 true | 0 // 암시 적

다음은 원시 값이 숫자로 변환되는 방법입니다.

Number(null)                   // 0
Number(undefined)              // NaN
Number(true)                   // 1
Number(false)                  // 0
Number(" 12 ")                 // 12
Number("-12.34")               // -12.34
Number("\n")                   // 0
Number(" 12s ")                // NaN
Number(123)                    // 123