될때까지

데이터타입, null병합연산자, falsy값, 논리연산자 본문

학습/JavaScript, TypeScript

데이터타입, null병합연산자, falsy값, 논리연산자

랖니 2022. 9. 7. 10:57
728x90

 데이터타입

if({}=={}){
    console.log(1)
};

자바스크립트 엔진은 memory heapcall stack으로 구성되어있다. 자바스크립트의 데이터 타입에는 2가지가 있다.

  1. 기본형 : boolean, null, undefined, number, bigint, string, symbol
  2. 참조형 : object, array, function, 정규표현식 

기본형불변값, 참조형가변값이다. 여기서 불변과 가변의 기준은 "메모리 영역"과 관련이 있는데 해당 키워드에 대해선 추후 정리하도록 하자. 위의 코드에서 object는 가변형이라고 했다.

-> 따라서 비교중인 두 object는 각각 다른 값을 가르키기 때문에 if안의 조건이 false가 되어 콘솔에 1이 찍히지 않는다.

 

truthy and falsy

if({}){
    console.log(2) 
};

if([]){
    console.log(3)
};
  1. falsy값 : false, 0, -0, 0n, "", null, undefined, NaN
  2. (헷갈리는)truthy값 : true, {}, [], "0", "false", -42 등

자바스크립트에서 빈 객체는 truthy로 인식한다. (파이썬에서 [], (), {} falsy!!)

-> 따라서 if안의 조건은 truthy니까 콘솔에 2가 찍힌다.

 

-> 빈 배열도 truthy기 때문에 콘솔에 3이 찍힌다.

if(0==false){
    console.log(4)
}

-> 자바스크립트에서 0은 falsy다. falsy == false는 true가 되서 콘솔에 4가 찍힌다.

if(0===false){
    console.log(5)
}
  1. == : 값을 비교한다
  2. === : 값과 자료형까지 비교한다.

-> 두 피연산자의 유형이 다르기 때문에 콘솔에 5가 안찍힌다.

 

<미해결> 

if([0]==false){
    console.log(5)  
}

[]은 truthy인데 안에 0이 있네? 값이 있다. 그러면 truth고 truth와 false는 같지 않으니 콘솔에 5가 안찍힐 것 같은데 콘솔에 5가 찍힌다 왤까???!!! 아직 이유를 모르겠지만 나중을 위해 정리해두자.

if ([0] == false) {
    console.log(5)
}

console.log(!![0]) // true
console.log(true == false) // false

if (true == false) {
    console.log(6)
}    // 6 안찍힘

 

null병합연산자

console.log(0??1)  
console.log(1??0)  
console.log(1??1)

nullish 병합연산자 : a??b a가 null이나 undefined가 아니면 a를 반환하고 그 외의 경우에는 b를 반환한다.

-> 0은 falsy지만 null이나 undefined가 아니기 때문에 0을 찍는다.

-> 1을 찍는다.

-> 1을 찍는다.

 

논리연산자

console.log(1&&2) 
console.log(1&&0)
  1. AND (&&) : 모두가 참일 때 true반환, 첫번째 falsy를 찾고 마지막 truthy를 반환한다.
  2. OR (||) : 하나라도 참일 때 true반환, 첫번째 truthy를 찾고 마지막 falsy를 반환한다.

-> 2

-> 0

console.log(1||0)  
console.log(0||3||2)

-> 1

-> 3

728x90