리액트 공부중인데
const [ persons , setPersons ] = useState( [
{ },
{ },
{ }
]
);
이런 State 배열에서 새로운 배열 원소를 추가 할 때
setPersons ( [
...persons,
person
]
);
이렇게 하거나
setPersons ( persons .concat ( person ) );
이런식으로 spread 나 concat 방식으로 하라고 공부했는데
궁금한건 concat 함수도 새 배열을 만든 후에 복붙하는 방식인거지?
연산속도 측면에서 스프레드나 concat 이나 똑같다고 봐야하나?
아니면 concat 함수에 내가 모르는게 또 있을까?
예를 들면 저런식으로 배열을 push 할 때 좀 더 메모리를 더 확보한다던지?
golang 같은 경우는 Array를 push 할 때마다 기존 배열의 메모리보다 2배 더 메모리를 확보해서
속도를 개선했다고 배워서 물어보는거임.
똥스 Array는 연속된 배열공간에 저장 안함. 그러니까 아마 미리 공간 안잡아놓을꺼야.
연속되게 저장함 - dc App
연속되게 저장 하지 않을 수도 있음
https://github.com/v8/v8/blob/master/src/objects/js-array.h#L20
> 배열의 길이가 언제든지 늘어나거나 줄어들 수 있고 데이터를 연속적이지 않은 곳에 저장할 수 있으므로, JavaScript 배열은 밀집성을 보장하지 않습니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array
push pop 같이 뮤테이션 들어가야 슬로우 모드로 진입함 - dc App
내가 글에서 나온 상황만 얘기해서 잘못전달 될 수 있을것같은데 모든상황에서 연속된다는 뜻이 아니고
저런 형태로 일정한 타입을 스프레드로 넣으면 최적의 배열이 나옴
https://v8.dev/blog/fast-properties
이 링크도 제대로 안나와있는데 히든 클래스랑 엮여서 들어가는거라 순회할때 빠름
오 너 좀 똑똑해보인다
그런거 신경쓰는거 아님 - dc App
아 그래? 그러면 실무에서 둘중에 어떤걸 많이 쓰는편임?
스프레드를 더 많이쓰는것 같음 코드가 보기 편하니까 - dc App
concat은 인자로 배열 넣어도 펼쳐서 들어가는 차이 있음 배열에 Symbol.isConcatSpread였나 있어서 - dc App
스프레드 쓰면되고 concat은 거의 안쓰는듯 Array.from도 가끔쓰고