js로 배열을 빠르게 초기화하는 방법
태그(공백으로 구분): call apply
참고 버전
일반적으로 코드를 작성할 때 배열을 빠르게 초기화해야 하는 경우가 있습니다. 예를 들어 zeros
와 유사한 함수가 필요합니다. matlab. 여기에 필요한 경우 하루 24시간을 나타내는 0-23의 배열을 생성합니다. zeros
函数,假如这里我们需要生成一个0-23的数组用于表示一天24小时。
最基本的做法如下:
function(){ let hours = []; for(let k = 0; k < 24; k++ ) hours.push(k); return hours; }
下面我们来思考如何用更优雅的方式实现。
考虑使用new Array(24)
+ map
的方法来实现。
代码如下:
Array(24).map((_, h) => h);
注意,这里map
的第二个参数是索引,平时用的少,这里把索引作为数值。
结果与预期并不符合,为啥呢?
简单搜索了一下,发现时因为js里的稀疏数组的逻辑导致的。
我们先看一下下面的代码:
let a = []; a[1000] = 2; console.log(a.length);// 1000a.forEach(x => console.log("hello"));// only one "hello"
js的处理逻辑是,对于没有主动赋值的位置进行“空置”处理,对于这些“空置”未知,迭代器是不会理会的,这么做最主要的目的就是避免不合理的赋值操作导致的bug。
假设没有这种逻辑,我们写下了new Array(Date.now())
,这将导致系统新建一个非常大的数组,而实际上啥也没存。
我们可以吧new Array(len)
干的事情简单理解为下面的过程:
function(len){ let r = []; r.length = len; return r;
这就是为什么对new Array(len)
调用map
或者forEach
的时候跟预期不一致了。
如何解决这一问题呢,除了使用new Array(len)
的形式,我们还可以使用new Array(1,2,3)
这种写法来初始化数组,但是这么写就没法实现我们编写初始化数组的目的了。
这个时候我们想到了apply
,这个函数的第二个参数正好就是一个数组,于是我们写下了下面的代码。
// 借用apply Array.apply(null, Array(24)).map((_, h) => h); // [0, 1, ..., 24]
得到了我们希望的结果。这就说明,Array(24)
在apply
中作为参数的时候是被当做24个值对待的,因为这一点就保证了最后得到的数组长度是24。
既然如此,我们当然同样可以使用apply
的姊妹函数call
。
// 借用call Array.call(null, ...Array(24)).map((_, h) => h); // [0, 1... 23]
这也更确认了一件事,Array(len)
解构会得到len
个参数而非一个参数,当然call
的使用必须在支持解构操作符的环境中。
在熟悉了call
和apply
的原理后,我们可以进一步写出下面的代码:
// Array本身 Array(...Array(24)).map((_, h) => h); // [0, 1, ..., 24]
这种形式已经足够优雅了。
另外,在ES6
中,Array
提供了新方法fill
,借用该方法填充那些“空置”位,进而保证后续的操作能顺利进行。
具体代码如下:
// 推荐 Array(24).fill(null).map((_, h) => h);
现在也比较推荐最后一种写法,这种方法也最为直观。
不过需要注意fill
가장 기본적인 접근 방식은 다음과 같습니다.
// no-fillconsole.time("no-fill");let t = Array(5e7);console.timeEnd("no-fill");// fillconsole.time("fill");let q = Array(5e7).fill(null);console.timeEnd("fill");// => no-fill: 0.240ms// => fill: 3247.921ms
이를 달성하려면 new Array(24)
+ map
메서드를 사용하는 것이 좋습니다.
map
의 두 번째 매개변수는 인덱스이며 거의 사용되지 않습니다. 여기서 인덱스는 숫자 값으로 사용됩니다. 🎜결과가 기대에 미치지 못하는데요, 이유는 무엇인가요? 🎜간단한 검색 끝에 js의 희소 배열 논리로 인해 발생하는 것으로 나타났습니다. 🎜먼저 다음 코드를 살펴보겠습니다. 🎜rrreee🎜js의 처리 논리는 값이 적극적으로 할당되지 않은 위치에 대한 "공석"을 처리하는 것입니다. 알 수 없는 "공석"에 대해서는 반복자가 처리하지 않습니다. 가장 중요한 것은 불합리한 할당 작업으로 인해 발생하는 버그를 방지하는 것입니다. 🎜그런 논리가 없고 new Array(Date.now())
를 작성한다고 가정해 보겠습니다. 그러면 시스템이 매우 큰 배열을 생성하지만 실제로는 아무것도 저장하지 않게 됩니다. 🎜다음 프로세스를 통해 new Array(len)
가 수행하는 작업을 간단히 이해할 수 있습니다. 🎜rrreee🎜이것이 new Array(len)
에서 map이 호출되는 이유입니다. /code> 또는 <code>forEach
가 예상과 일치하지 않습니다. 🎜이 문제를 해결하려면 new Array(len)
를 사용하는 것 외에도 new Array(1,2,3)
를 사용하여 Array를 초기화할 수도 있습니다. 이 방법으로는 초기화된 배열을 작성하려는 목적을 달성할 수 없습니다. 🎜이때 우리는 apply
를 생각했는데 이 함수의 두 번째 매개변수가 배열이여서 다음과 같은 코드를 작성했습니다. 🎜rrreee🎜원하는 결과를 얻었습니다. 이는 apply
에서 매개변수로 사용될 때 Array(24)
가 24개의 값으로 처리된다는 의미입니다. 이렇게 하면 최종 배열의 길이가 24개가 되도록 보장되기 때문입니다. 🎜이 경우 물론 apply
의 자매 함수인 call
을 사용할 수도 있습니다. 🎜rrreee🎜이것은 또한 한 가지를 확인합니다. Array(len)
의 분해는 하나의 매개변수 대신 len
매개변수를 얻습니다. 물론 call
은 필수입니다. 구조 분해 연산자를 지원하는 환경에서 사용됩니다. 🎜🎜호출
및 적용
원칙에 익숙해지면 다음 코드를 더 작성할 수 있습니다. 🎜rrreee🎜이 형식은 충분히 우아합니다. 🎜또한, ES6
에서 Array
는 새로운 메소드 fill
을 제공합니다. 이 메소드는 "빈" 비트를 채워 후속 작업을 보장하는 데 사용할 수 있습니다. 원활하게 업무를 진행할 수 있습니다. 🎜구체적인 코드는 다음과 같습니다. 🎜rrreee🎜이제 마지막 작성 방법도 권장되는데, 이 방법이 가장 직관적이기도 합니다. 🎜그러나 fill
메서드 사용에 주의해야 하며, 블라인드 채우기를 피해야 합니다. 이렇게 하면 js의 "비어 있는" 논리가 설계되었다는 위에서 언급한 버그가 발생할 수 있기 때문입니다. 피하기 위해. 🎜관심 있으신 분은 다음 코드를 시도해 보세요. 🎜rrreee🎜 브라우저에서 시도해 보면 기본적으로 브라우저가 응답하지 않습니다. 결과가 나오지 않는 것을 방지하기 위해 더 큰 값을 설정하지 않았습니다. int가 4바이트의 메모리를 차지한다고 가정하면 이 채우기는 200M의 메모리를 차지하며 5천만 번 반복되어야 합니다. 이는 필연적으로 많은 양의 CPU와 메모리를 차지하게 되며 이는 단일 스레드 js에서는 절대 허용되지 않습니다. 🎜🎜🎜위 내용은 js로 배열을 빠르게 초기화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

해결 방법: 1. 응용 프로그램을 다시 설치합니다. 3. 시스템 복원 또는 검사점 복구를 수행합니다. 5. 시작 항목 및 서비스를 사용합니다. 8. 보안 소프트웨어를 확인합니다. 9. 이벤트 뷰어를 확인합니다. 10. 전문가의 도움을 구합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

win7 시스템은 매우 우수한 고성능 시스템입니다. win7을 계속 사용하는 동안 많은 친구들이 win7에서 컴퓨터를 초기화하는 방법을 묻습니다! 오늘 편집자는 win7 컴퓨터의 공장 설정을 복원하는 방법을 알려 드리겠습니다. win7에서 컴퓨터를 초기화하는 방법에 대한 관련 정보: 그림과 텍스트가 포함된 자세한 지침 단계: 1. "시작 메뉴"를 열고 들어갑니다. 2. 좌측 하단의 설정을 클릭하여 진입합니다. 3. Win10 업데이트 및 복구 설정 인터페이스에서 다음을 선택합니다. 4. 아래의 "모든 콘텐츠를 제거하고 Windows를 다시 설치하세요"를 클릭하세요. 5. 다음과 같은 "초기화" 설정을 확인한 후 클릭하세요. 6. "컴퓨터에 드라이브가 여러 개 있습니다" 설정 옵션을 입력합니다. 여기에는 두 가지 옵션이 있으며 상황에 따라 선택할 수 있습니다.

많은 게이머들이 그래픽 시스템을 초기화하지 못하는 게임의 실망스러운 문제에 직면했습니다. 이 글에서는 이 문제의 일반적인 이유를 자세히 알아보고, 즉시 다시 보드로 돌아가서 레벨을 깨뜨릴 수 있는 간단하면서도 효과적인 솔루션을 찾을 것입니다. 따라서 Rollercoaster Tycoon, Assassin's Creed, Tony Hawk's Pro Skater 등에서 그래픽 시스템을 초기화할 수 없다는 오류 메시지가 나타나면 이 문서에 언급된 해결 방법을 따르십시오. 초기화 오류 그래픽 시스템을 초기화할 수 없습니다. 그래픽 카드는 지원되지 않습니다. 그래픽 시스템을 초기화할 수 없음 오류 메시지 수정 Rollercoaster Tycoon, Assassin's Creed, Tony Hawk's Pro Skater 등과 같은 게임에서 그래픽 시스템을 초기화할 수 없음 오류를 해결하려면 다음 해결 방법을 시도할 수 있습니다. 호환 모드

win7 시스템은 매우 우수한 고성능 시스템입니다. 최근 win7 시스템의 많은 친구들이 win7에서 네트워크 설정을 초기화하는 방법을 찾고 있습니다. 오늘은 win7 컴퓨터 네트워크 초기화에 대한 세부 사항을 알려드리겠습니다. 튜토리얼을 보세요. win7에서 네트워크 설정을 초기화하는 방법에 대한 자세한 튜토리얼: 그래픽 단계: 1. "시작" 메뉴를 클릭하고 "제어판"을 찾아서 연 다음 "네트워크 및 공유 센터"를 클릭합니다. 2. 그런 다음 "어댑터 장치 변경"을 찾아서 클릭하세요. 3. 다음으로 열리는 창에서 "로컬 영역 연결"을 마우스 오른쪽 버튼으로 클릭한 후 "속성"을 클릭합니다. 4. 연 후 "인터넷 프로토콜 버전(TCP/IPv4)"을 찾아 두 번 누릅니다.

SpringBoot와 SpringMVC를 비교하고 차이점을 이해하십시오. Java 개발의 지속적인 개발로 인해 Spring 프레임워크는 많은 개발자와 기업에서 첫 번째 선택이 되었습니다. Spring 생태계에서 SpringBoot와 SpringMVC는 매우 중요한 두 가지 구성 요소입니다. 둘 다 Spring 프레임워크를 기반으로 하지만 기능과 사용법에 약간의 차이가 있습니다. 이 기사에서는 SpringBoot와 Spring을 비교하는 데 중점을 둘 것입니다.

Win11에서 "내 컴퓨터" 경로의 차이점은 무엇입니까? 빨리 찾는 방법! Windows 시스템이 지속적으로 업데이트됨에 따라 최신 Windows 11 시스템도 몇 가지 새로운 변경 사항과 기능을 제공합니다. 일반적인 문제 중 하나는 사용자가 Win11 시스템에서 "내 컴퓨터"에 대한 경로를 찾을 수 없다는 것입니다. 이는 일반적으로 이전 Windows 시스템에서는 간단한 작업이었습니다. 이 기사에서는 Win11 시스템에서 "내 컴퓨터"의 경로가 어떻게 다른지, 그리고 이를 빠르게 찾는 방법을 소개합니다. Windows1에서

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리
