문제

즉, 다음 코드는 어떻게됩니까?

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");

당신이 한 모든 일이 다양한 요소를 설정할 때 길이에 대해 '5'출력?

이 코드의 내 '문제'는 어떻게 이해가되지 않는다는 것입니다. length 전화하지 않고 변경됩니다 getLength() 또는 a setLength() 방법. 다음을 수행 할 때 :

a.length
a['length']
a.length = 4
a['length'] = 5

비 어류 객체에서는 dict / 연관 배열처럼 작동합니다. 배열 객체 에서이 작업을 수행하면 특별한 의미가 있습니다. JavaScript의 어떤 메커니즘이 이런 일이 발생할 수 있습니까? JavaScript에는 번역하는 일부 유형의 속성 시스템이 있습니까?

a.length
a['length']

"얻기"방법으로

a.length = 4
a['length'] = 5

"세트"방법으로?

도움이 되었습니까?

해결책

JavaScript의 모든 것은 객체입니다. An의 경우 Array,, length 속성은 배열의 인덱스 항목에 대해 내부 저장 영역의 크기를 반환합니다. 혼란의 일부는 [] 연산자는 숫자와 문자열 인수 모두에서 작동합니다. 배열의 경우 숫자 인덱스와 함께 사용하면 예상 된 인덱스 항목을 반환/설정합니다. 문자열과 함께 사용하면 배열 객체에서 지명 된 속성을 반환/설정합니다. 문자열이 숫자 값에 해당하지 않는 한 인덱스 된 항목을 반환합니다. JavaScript 배열 인덱스에서 암시 적으로 문자열에 강요되기 때문입니다. toString() 전화. 솔직히, 이것은 당신이 머리를 긁고 "JavaScript, 이것이 그들이 당신을 비웃는 이유입니다."라고 말하는 것 중 하나 일뿐입니다.

실제 기본 표현은 브라우저마다 다를 수 있습니다 (또는 그렇지 않을 수도 있음). 나는 작업 할 때 제공되는 인터페이스 이외의 다른 것에 의존하지 않을 것입니다.

JavaScript Array에 대한 자세한 내용을 확인할 수 있습니다 MDN.

다른 팁

TVANFOSSON의 답변에 추가하려면 : ECMA-262 (3.0 사양)에서 배열은 단순히 속성을 설정하기위한이 동작으로 정의됩니다 (15.4.5.1 참조). 그 기본 메커니즘은 (적어도 현재로서는), 이것이 정의 된 방식과 JavaScript 통역사가 어떻게 행동 해야하는지입니다.

이것은 실제로 당신이 그것으로 무엇을하려고하는지에 달려 있습니다.

[].length "마법"입니다.
실제로 배열의 항목 수를 반환하지 않습니다. 배열에서 가장 큰 인덱스 인덱스를 반환합니다.

var testArr = [];  testArr[5000] = "something";  testArr.length; // 5000

그러나 세터 뒤의 방법은 엔진 자체에 숨겨져 있습니다.
일부 브라우저의 일부 엔진은 해당 매직 메드의 구현에 액세스 할 수 있습니다. 다른 사람들은 모든 것을 완전히 잠긴 상태로 유지할 것입니다.

따라서 DefineGetter 및 DefineEtter 방법에 의존하지 마십시오. __proto__ 방법, 당신이 목표로하는 브라우저와 당신이하지 않는 브라우저를 알지 않는 한.

이는 ECMAScript/6에 작성된 옵트 인 응용 프로그램이 더 많은 액세스 권한을 갖는 미래에 변경 될 것입니다.

ECMAScript 5 호환 브라우저가 이미 제공하기 시작했습니다 get 그리고 set 물체의 마법 방법과 앞으로 더 많은 것이 있습니다 ... ... 그러나 당신이 Oldie와 Smartphones, et cetera에 대한 지원을 덤프하기 전에 시간이 오래 걸릴 것입니다 ...

당신이 할 때 그것을 아는 것이 중요합니다 sup['look'] = 4; 연관 배열을 사용하지 않고 오히려 객체 SUP의 속성을 수정합니다. 그것은 동일합니다 sup.look = 4; 언제든지 JavaScript 객체에 속성을 동적으로 추가 할 수 있습니다. sup['length'] 첫 번째 예제에서 인스턴스 출력 5에 대한 것입니다.

배열과 같은 액세스로 객체를 구현하려는 경우 배열 모질라 데브 센터 기사 훌륭한 자원입니다. 불행히도 배열 구현의 깊이 세부 사항을 모르지만 해당 기사에는 많은 세부 사항이 있습니다.

Array 물체가 상속됩니다 caller, constructor, length, 그리고 name 속성 Function.prototype.

JavaScript 배열은 다른 객체와 마찬가지로 객체이지만 JavaScript는 특수 구문을 제공합니다.

arr[5] = "yo"

위의 것입니다 구문 설탕 ~을 위한

arr.insert(5,"yo")

일반 물체에 물건을 추가하는 방법입니다. 그것은 내부에있는 것입니다 끼워 넣다 arr.length의 값을 변경하는 메소드

여기에서 CustomArray 유형의 구현을 참조하십시오. http://jsfiddle.net/vfm3vkxy/4/

다른 사람들이 언급했듯이 JavaScript의 속성은 기본적으로 배열의 세트 (또는 문자열 또는 다른 입력)로 작용할 수 있습니다.

사실, 당신은 이것을 직접 시도 할 수 있습니다.

const test=[1,2,3,4,5]
test.length = 3
console.log(test) // [1,2,3]
test.length = 5
console.log(test) // guess what happens here!

내가 아는 한, JS의 배열은 연관 어레이와 똑같이 작동하지 않으며 메모리에 넣는 요소가 있습니다. 가능한 한 연속적으로 고려중인 JS 엔진에 따라 (혼합 객체의 배열을 가질 수 있음).

부수적으로, 나는 가장 투표 된 답변이 "JavaScript의 대상이되는 모든 것"에 대한 과도한 단순화 된 신화 (또는 반 진실)를 계속 퍼뜨리는 것에 대해 약간 당황했다. 그것은 정확히 사실이 아닙니다, 그렇지 않으면 예를 들어 프리미티브를 공부하지 않습니다.

이것을 시도하십시오 :

const pippi = "pippi"
pippi.cat = "cat"
console.log(pippi.cat) // will it work? Throw an error? Guess why again

스포일러 : 문자열은 두 번째 줄에서 해당 특정 작업을 위해 버려진 객체로 싸여 있으며 다음과 같은 원시의 속성에 액세스 할 수 있습니다 (연주하지 않은 경우. String.prototype 또는 같은), 그래서 당신은 얻습니다 undefined.

JavaScript 배열의 특성

  1. 동적 - JavaScript의 배열은 동적으로 성장할 수 있습니다
  2. 드문 일 수 있습니다 - 예를 들어 배열 [50000] = 2;
  3. 조밀 할 수 있습니다 - 예를 들어 배열 = [1, 2, 3, 4, 5

JavaScript에서는 런타임이 배열이 조밀한지 여부를 알기가 어렵습니다. 그래서 그것이 할 수있는 일은 추측하는 것입니다. 모든 구현은 휴리스틱을 사용하여 어레이가 조밀한지 여부를 결정합니다. 예를 들어, 위의 포인트 2의 코드는 JavaScript 런타임에 이것이 드문 어울린 구현 일 가능성이 있음을 나타낼 수 있습니다. 배열이 초기 카운트로 초기화되면 이것이 조밀 한 배열 일 가능성이 있음을 나타낼 수 있습니다.

런타임이 배열이 드물다는 것을 감지하면 객체와 유사한 방식으로 구현됩니다. 따라서 인접한 배열을 유지하는 대신 키/값 맵이 구축됩니다.

자세한 내용은 -https://www.quora.com/how-are-javaScript-arrays-implemented-internally

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top