일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @Builder
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Today
- Total
기록
JavaScript/JavaScript에서 in 연산자 본문
시작하면서
운영환경에서 접속하면 "https://int-web", 개발환경에서 접속하면 "https://dev-web" 접속하도록 만드는 게 필요했다.
이를 위해서 JSP에 자바 스크립트 코드를 다음과 같이 작성하였는데, 운영환경에서도 "https://dev-web" 접속하더라;;
@Controller
public class MyController {
@GetMapping("/my-page")
public String myPage(Model model) {
model.addAttribute("environment", getEnvironment());
return "my-page";
}
}
var url = "";
var environment = "${environment}";
if (environment in ['int', 'ext']) {
url = "https://int-web";
} else {
url = "https://dev-web";
}
window.open(url);
운영환경에서 제대로 동작하지 않는다는 연락을 받고 다시 확인해보니, 'int' in ['int', 'ext']
는 false
를 반환했다. 왜 JavaScript는 의도한대로 동작하지 않았을까? 배열을 사용하려면 어떻게 수정할 수 있을까를 고민했고, 그 내용을 정리하고자 한다.
JavaScript에서 in 연산자
JavaScript에서 in 연산자는 객체의 속성을 확인하는 데 사용됩니다. 배열은 객체의 특수한 유형이며, 배열의 요소는 인덱스로 접근할 수 있는 속성으로 취급됩니다. in 연산자는 배열의 인덱스가 아닌 속성을 확인하는 데 사용되므로, 배열에서 in을 사용하여 요소의 존재를 확인하는 것은 일반적으로 의도한 동작이 아닙니다.
CHAT GPT에서는 위와 같은 답변을 얻을 수 있었다.
이해해보자면 ['int', 'ext']
는 {0:'int', 1:'ext'}
와 동일하며, 'int'는 키인 0과 1 안에 존재하지 않지 때문에 'int' in ['int', 'ext']
는 false
를 반환한다.
따라서 JavaScript에서 배열의 요소와 값의 비교를 수행하려면 다음과 같이 작성해야 한다.
var url = "";
var environment = "${environment}";
if (['int', 'ext'].includes(environment) {
url = "https://int-web";
} else {
url = "https://dev-web";
}
window.open(url);
- 테스트
- 형변환
추가로, '0' in ['int', 'ext'] 도 true를 반환한다. in도 자동형변환을 지원하는가보다. '0'도 0과 동일한 인덱스를 가리키게 되어 arr의 요소로 인정된다.
const arr = ['apple', 'banana', 'orange'];
console.log(0 in arr); // true 출력
console.log('0' in arr); // true 출력
console.log(3 in arr); // false 출력
마무리하면서
JavaScript에 익숙하지 않은 상태로, 그렇겠거니 추측하여 사용하고 있어서 위와 같은 실수들이 생긴다. 더 꼼꼼히 테스트 하고, 기초적인 개념부터 틈틈이 공부해두어야겠다.
개발중인 기능이나 위 경우와 같이 환경에 따라 다른 동작을 하도록 하는 것이 꽤 자주 요구된다. 그래서 다음번 포스팅에서는 개발환경과 운영환경을 구분하는 방법을 다루어야 겠다.
'Web > Front' 카테고리의 다른 글
HTTP GET 요청/jQuery, fetch API (0) | 2023.09.11 |
---|---|
css/블록 레벨 요소와 인라인 레벨 요소 (0) | 2023.04.17 |
JavaScript/ES6의 주요 기능 (0) | 2023.03.27 |
JSP/KendoUI/날짜 포멧 확인 (0) | 2022.12.26 |
JSP/OOM 해결방법 : 페이징 (0) | 2022.11.09 |