2012-08-15 2 views
1

이 질문은 실제로 다른 실험 결과를 얻은 다른 question의 결과입니다. 결과는 더 혼란 스럽습니다. 나는 실제로 내부적으로 일어나는 일을 설명하는 해답을 기대하고 있습니다. 내가 시도 인 것을놀랍게도 동작하는 JavaScript 변수 할당

, 내가 어떤 명확한 설명 here을 얻었 기 때문에

내가 기본 가정으로 이것을 유지,

var a = []; 
a['a1'] = []; 
a['a2'] = []; 

console.log(a); // [] 
console.log(a['a1']); // [] 
console.log(a['a2']); // [] 

TEST 1

이 나를 혼란 b[0]a으로 인쇄하고에 액세스 할 수 있으므로 많은 작업이 필요합니다.속성, 나는 var b 문자 배열로 간주 될 수 있으므로 다른 값을 할당하려고했으나 성공하지 못했다고 생각했습니다. 기본 가정에서이 배열을 char 배열 (더 일반적으로 배열)로 처리 할 수 ​​있으면 할당이 성공한 것입니다. 그것은 기본 가정을 깨뜨린다.

var b = 'abcd'; 
b['b1'] = []; 

console.log(b); // abcd 
console.log(b.length); // 4 
console.log(b['b1']); // undefined 

TEST 2

하지만 난 이렇게 만들 경우, 할당이 발생, 이로부터

var bb = ['a', 'b', 'c', 'd']; 
bb[4] = []; 

console.log(bb); // ["a", "b", "c", "d", []] 
console.log(bb.length); // 4 
console.log(bb[0]); // a 
console.log(bb[4]); // [] 

, 난 b[4] = []; 성공하지만,

수 있다는 생각
var b = 'abcd'; 
b[4] = []; 

console.log(b); // abcd 
console.log(b.length); // 4 
console.log(b[4]); // undefined 

제 질문은 왜 변수들이 몇 가지 공통적 인 기능을 공유하는 동안 이러한 할당이 다르게 작동하는 것입니까? 여기

이 (가) demo

사람이 나에게 실제로 내부에서 일어나는 일에 대해 명확한 설명을 적어주세요 수있다?

추가 테스트

내가 수치 할당에 노력한다면, 그것은 매우 다른 두를 형성 동작합니다.

var c = 1234; 
c[4] = []; 

console.log(c); //1234 
console.log(c.length); // undefined 
console.log(c[0]); //undefined 
console.log(c[4]); //undefined 
+0

문자열이 문자 배열이라고 가정합니다. 그것은 아닙니다, 그래서 그 가정에서 파생되는 것은 아무것도 작동하도록 보장되지 않습니다. – JJJ

+0

@Juhana는 결과가 혼동되기 때문에 문자 배열로 취급 될 수 있습니다. –

답변

0

추론

귀하의 a가 배열이기 때문에 "기본 가정은"작동합니다. "Test 2"는 어레이를 사용하는 유일한 다른 테스트 케이스이며, 이것이 다른 테스트 케이스가 유일한 이유입니다.

당신은 대괄호 표기법을 제공하고 length 방법을 갖는 객체가 배열임을 나타낸다고 가정 할 것으로 보인다. 이것은 사실이 아닙니다. 다음과 같이 객체가 배열 인 경우, 당신은 자바 스크립트의 instanceof 방법을 사용할 수 있습니다보고 테스트하려면 :

var a = []; 
var b = 'abcd'; 
var bb = ['a', 'b', 'c', 'd']; 
var c = 1234; 

a instanceof Array // => true 
b instanceof Array // => false 
bb instanceof Array // => true 
c instanceof Array // => false 

공지 사항 당신이 노력하고 있기 때문에 instanceof Array 반환 true, 당신은 예상대로 행동하는 사람있는 경우 배열 작업을 수행합니다.


왜 "테스트 1"를

는 "테스트 1", 문자열 대괄호 표기법 문자열 클래스의 charAt 기능을 수행하지 못했습니다. b = 'abcd'이 주어진 경우 b[0]을 수행하는 b.charAt(0)을 수행하는 것과 같습니다. 읽기 전용이며 해당 색인에서 "a"인 문자를 반환합니다.

자세한 내용은 the Mozilla Developer Network documentation for Strings을 참조하십시오.


는 "추가 테스트"를 "추가 시험"에 대한

실패 이유는, 정수는 대괄호 표기법 또는 길이 방법을 제공하지 않으며, 따라서 이러한 호출은 모두 실패했습니다.

+0

나는 추론을 받아들이지 만,'b' 나'c'가 배열 타입이 아니라면, 배정이 어떻게 성공적 이었는지, 어떤 예외도 던지지는 않을지 궁금합니다. –

+0

그들은 실패하지 않았습니다. 리터럴은 속성을 제공하지 않지만 자동 인스턴스화 된 객체는 속성을 제공하지 않습니다. 'alert (42 [ "constructor"])'를 시도하십시오. 이러한 호출은 실패하지 않았습니다. 단순히 숫자 인스턴스가 숫자 속성에 의미있는 데이터를 갖고 있지 않다는 것입니다. 또한 대괄호는 모든 객체를 색인하는 데 사용되며 배열에만 적용됩니다. –

1

테스트 1 : 당신이 b 위치에서 뭔가를 할당 할 수b는 내부적으로 문자열이 아닌 배열입니다.

시험 2 : 물론 지금은 bb이 배열입니다.

제 질문은 왜이 할당이 다른 공통적 인 기능을 공유하는 변수인데 반해, 왜 다른 방식으로 동작합니까?

유형이 다르므로

시험 3 : c 다수되지 배열이다.

은 아마 당신은 문자열이 널 문자 (\0)에 의해 종료 문자 배열 일부 C 배경을 가지고있다. 자바 스크립트 문자열에서는 int 타입이 내장되어 있으며 배열과 다르게 동작합니다. [] 연산자는 Jonathan이 말했듯이 하나의 특별한 char에 액세스하는 데 편리합니다. 여기에 몇 가지 링크입니다, 한번보세요 :

+0

두 번째 줄에 작은 오타가 있습니다. 'b'는'bb'여야합니다. –

+0

@sogeek : 수정 됨. 고맙습니다! – davidbuzatto

0

나는 귀하의 질문에 따르지 않는 것 같아요. Javascript는 문자열, 배열 및 정수를 다르게 취급합니다. 당신은 그들이 같은 방식으로 행동 할 것이라고 기대해서는 안됩니다. 또한 귀하의 첫 번째 예제가 작동 할 자바 스크립트에서 연관 배열과 같은 것은 없습니다. a['a1'] 형식의 표기법은 실제로는 개체 속성에 액세스하기위한 대체 방법이며 문자열의 컨텍스트에서 의미가 없습니다.

1

[]으로 개체 이외의 항목에 액세스하면 올바른 프로토 타입 (예 : String 또는 Number)으로 인스턴스화 된 임시 개체가 제공됩니다. 이 객체의 속성을 다른 객체와 마찬가지로 읽고 쓸 수 있습니다 (예 : alert(3["constructor"])). 그러나이 객체는 색인을 생성하고 다음 번에 방금 설정 한 동일한 속성을 읽으려고하면 아무 데나 참조되지 않으므로 실제로 새 임시 객체의 속성에 액세스합니다. 자연적으로 비어 있습니다.