여러분들 이 코드 간단하니까 한번만 보세여
<script>
const items = [
{ name: 'Coconut', value: 45 },
{ name: 'Banana', value: 37 },
{ name: 'Five', value: 37 },
{ name: 'Donut', value: -12 },
{ name: 'Apple', value: 21 },
{ name: 'Egg', value: 13 },
];
console.log(items); // ----------------------------------1
items.sort(function (a, b) {
return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;
});
console.log(items); //-----------------------------------2
</script>
자바스크립트는 코드를 위에서부터 한줄 한줄씩 해석하고,
sort함수는 원본 배열을 바꿔버리니까
상식적으로 생각해보면 1번 콘솔로그는 원본 items 를 출력하고
2번 콘솔로그는 sort 된 items 를 출력할거 같지 않음 ?
근데요

콘솔에서 배열 펼쳐보면 같다고 나옴
엥? 콘솔 이새끼 이거 구라치네 내 언젠간 걸릴줄 알았다
여러분들 컴터는 거짓말 안함 그냥 입력되있는대로, 설정되있는대로 계산 해 줄뿐
그냥 내가 모르는거였음
여기에 Array(6) i 되있는 부분에 하늘색 네모 안에 있는 i 에다가 마우스 올려보면 이런글이 나옵니다.

영어 이런거 잘 모르지만 대충 읽어보면
이 값은 처음 펼칠때 검사되었습니다. 값이 변했을 수 있습니다.
라고 하는거 같네요
이게 정확히 왜 그런거냐면 브라우저가 스크립트를 한줄한줄 해석하는건 맞는데요
콘솔이 객체나 배열의 참조를 받는거는 동기적으로 처리되는데 그 값을 바로 보여주지는 않아요
우리 왜 객체나 배열 콘솔찍어보면 항상 닫혀있어서 값 볼려면 마우스로 클릭해서 열어봐야 되잖아요 ?
근데 객체나 배열의 값을 검사하는 행위는 비동기적으로 동작해서 그렇습니다.
그래서 객체나 배열의 값을 콘솔에서 검사하기전에 데이터가 바뀌면 바뀐 값을 보여줍니다.
근데 그냥 다 동기적으로 처리해서 한번에 보여주면 되지 왜 이렇게 귀찮게 굳이 비동기적으로 하느냐면
lazy evaluation (지연 평가)를 하면 성능이 좋아지기 때문에 그렇습니다.
'javascript' 카테고리의 다른 글
정규 표현식 - RegExp (0) | 2022.06.20 |
---|---|
콜백 함수, promise, async await 그리고 동기와 비동기 (0) | 2022.03.30 |
js sort 함수로 정렬해버리기 (0) | 2022.03.24 |
js this (javascript this)가 가리키는 3가지 (0) | 2022.03.24 |
for문 삼대장 - for ...of , for ...in, forEach (0) | 2022.03.10 |
댓글