목차
참고 버전
웹 프론트엔드 JS 튜토리얼 js로 배열을 빠르게 초기화하는 방법

js로 배열을 빠르게 초기화하는 방법

Sep 09, 2017 am 10:43 AM
javascript 초기화 빠른

태그(공백으로 구분): 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的使用必须在支持解构操作符的环境中。

在熟悉了callapply的原理后,我们可以进一步写出下面的代码:

// 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 메서드를 사용하는 것이 좋습니다.

코드는 다음과 같습니다.
rrreee
여기서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

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

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

동적 링크 라이브러리 초기화 루틴이 실패하는 경우 수행할 작업 동적 링크 라이브러리 초기화 루틴이 실패하는 경우 수행할 작업 Dec 29, 2023 am 10:30 AM

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

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

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

win7에서 컴퓨터를 초기화하는 방법 win7에서 컴퓨터를 초기화하는 방법 Jan 07, 2024 am 11:53 AM

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

PC에서 그래픽 시스템 오류를 초기화할 수 없는 문제 수정 PC에서 그래픽 시스템 오류를 초기화할 수 없는 문제 수정 Mar 08, 2024 am 09:55 AM

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

win7 네트워크 설정을 재설정하는 방법 win7 네트워크 설정을 재설정하는 방법 Dec 26, 2023 pm 06:51 PM

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

SpringBoot와 SpringMVC의 차이점과 비교 이해 SpringBoot와 SpringMVC의 차이점과 비교 이해 Dec 29, 2023 am 09:20 AM

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

Win11에서 '내 컴퓨터' 경로의 차이점은 무엇입니까? 빨리 찾는 방법! Win11에서 '내 컴퓨터' 경로의 차이점은 무엇입니까? 빨리 찾는 방법! Mar 29, 2024 pm 12:33 PM

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

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

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

See all articles