마치 객체 인 것처럼 지명 된 속성을 배열에 추가 할 수있는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/874205

문제

다음 두 가지 코드 스 니펫은 나와 동일하게 보입니다.

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

그리고

var myObject = {'A': 'Athens', 'B':'Berlin'};

그들은 둘 다 동일하게 행동하기 때문입니다 typeof(myArray) == typeof(myObjects) (양보 '대상').

이 변형 사이에 차이가 있습니까?

도움이 되었습니까?

해결책

JavaScript의 거의 모든 것이 객체이므로 "학대"를 할 수 있습니다. 정렬 임의 속성을 설정하여 객체. 이것 유해한 것으로 간주되어야합니다 그렇지만. 배열은 수치 적으로 인덱싱 된 데이터 용입니다 - 숫자가 아닌 키의 경우 객체를 사용하십시오.

숫자가 아닌 키가 배열에 "맞지 않는"이유가 더 구체적인 예입니다.

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

alert(myArray.length);

이것은 '2'가 표시되지 않지만 '0' - 효과적으로 배열에 요소가 추가되지 않았으며 배열 객체에 새로운 특성이 추가되었습니다.

다른 팁

JS 배열에는 객체가 있으며 약간 수정되었습니다 (몇 가지 기능이 더 있습니다).

다음과 같은 기능 :

concat
every   
filer
forEach
join
indexOf
lastIndexOf
map
pop
push
reverse
shift
slice
some
sort
splice
toSource
toString
unshift
valueOf 

나는 이전 답변으로 너무 은유적이고 비밀스러운 생각을합니다. 설명이 따릅니다.

배열 인스턴스, 부울, 날짜, 함수, 번호, regexp, 문자열은 객체이지만 각 유형에 특정한 방법과 속성으로 향상됩니다. 예를 들어, 배열은 사전 정의되어 있습니다 length 속성은 일반적인 개체가 아닙니다.

javascript:alert([].length+'\n'+{}.length)

디스플레이

0
undefined

본질적으로, FF Gecko 통역사는 언어 구성을 평가하는 뚜렷한 차이를 가진 배열과 일반 객체를 구별합니다.

javascript:
  ra=[  "one",   "two",   "three"]; ra.a=4;
  ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
  alert(
    ra            +"\n\n"+
    ob            +"\n\n"+
    ra.toSource() +"\n\n"+
    ra.a          +"\t .toSource() forgot me! \n\n"+
    ra.length     +"\t and my length! \n\n"+
    ob.toSource());
  ps=""; for(i in ra)ps+=i+" "; alert(ps);  /* NB .length is missing! */
  ps=""; for(i in ob)ps+=i+" "; alert(ps);

표시

one,two,three

[object Object]

["one", "two", "three"]

4    .toSource() forgot me! 

3    and my length! 

({0:"one", 1:"two", 2:"three", a:4})

그리고 0 1 2 a 그리고 0 1 2 a.

모든 객체가 함수라는 진술과 관련하여 :

임의의 객체 인스턴스를 기능으로 사용하는 것은 구문 적으로나 의미 적으로 정확하지 않습니다. 123() 또는 "abc"() 또는 []() 또는 {}() 또는 obj() 어디 obj 다른 유형 이외입니다 Function, 임의의 객체 인스턴스는 Function. 그러나 대상이 주어졌습니다 obj 그리고 그것은 유형입니다 Array, Boolean, Date, ..., 어떻게 obj 그대로 오게됩니다 Array, Boolean, Date, ...? 무엇입니까 Array, Boolean, Date, ...?

javascript:
    alert([Array, Boolean, Date, Function, 
              Number, Object, RegExp, String] . join('\n\n') );

디스플레이

function Array() {
    [native code]
}

function Boolean() {
    [native code]
}

function Date() {
    [native code]
}

function Function() {
    [native code]
}

function Number() {
    [native code]
}

function Object() {
    [native code]
}

function RegExp() {
    [native code]
}

function String() {
    [native code]
}

모든 경우에, equivocation없이 객체 유형은 function 정의, 따라서 모든 객체가 함수라는 진술! (혀는 뺨은 내가 의도적으로 가려지고 객체 인스턴스의 차이를 유형의 구별을 흐리게하고 흐리게했다는 것입니다! 그래도 "다른 사람 없이는 하나를 가질 수 없습니다", 객체 및 기능! 자본화는 유형을 강조합니다. 인스턴스에 반대합니다.)

기능적 및 객체 패러다임은 모두 JS 통역사 저 레벨 내장 프리미티브 (예 : Math 그리고 JSON 그리고 true.

 javascript:alert([Math, JSON, true.toSource()].join("\n\n"));

디스플레이

[object Math]

[object JSON]

(new Boolean(true))

JavaScript가 개발 당시, 객체 중심 프로그래밍 스타일 (OOP의 - 객체 지향 프로그래밍 스타일 - " ''"는 내 말장난이었다)은 유행했고 통역사는 더 큰 신뢰를 제공하기 위해 Java와 비슷하게 세례를 받았다. . 기능적 프로그래밍 기술은 오토마타, 재귀 기능, 공식 언어 등의 이론을 연구하는보다 추상적이고 난해한 시험으로 강등되었습니다. 그러나 이러한 공식적인 고려 사항의 강점은 특히 FF의 Gecko Engine (IE)에서 구현 된 바와 같이 JavaScript로 명확하게 나타납니다. .toSource()).


기능에 대한 객체 정의는 특히 재발 관계로 정의되기 때문에 특히 만족합니다! 자체 정의를 사용하여 정의되었습니다!

function Function() { [native code] }
그리고 함수는 객체이기 때문에 같은 감정이
function Object() { [native code] }.

다른 정의의 대부분은 정적 터미널 값으로 정지합니다. 하지만, eval() 특히 강력한 원시적이므로 문자열은 임의의 기능을 포함시킬 수 있습니다.

다시, 위에 사용 된 언어는 객체 유형과 인스턴스 구별을 가리킨다.

JavaScript의 모든 것은 원시 유형 외에 객체입니다.

코드

var myArray = Array();

배열 객체의 인스턴스를 만듭니다

var myObject = {'A': 'Athens', 'B':'Berlin'};

객체 객체의 인스턴스를 만듭니다.

다음 코드를 시도하십시오

alert(myArray.constructor)
alert(myObject.constructor)

따라서 차이가 객체 생성자 유형에 있음을 알 수 있습니다.

배열 객체의 인스턴스에는 배열 프로토 타입의 모든 속성과 방법이 포함됩니다.

실질적인 차이점 중 하나는 사용할 때입니다 JSON.stringifyarray 모두 비수체 인덱스는 무시됩니다.

var arr = [];
var obj = {};

arr['name'] = 'John';
obj['name'] = 'John';

console.log(arr);    // will output [name: "John"]
console.log(obj);    // will output {name: "John"}

JSON.stringify(arr); // will return []
JSON.stringify(obj); // will return {"name":"John"}

자바 스크립트의 배열과 다른 객체의 차이. 배열에는 마술처럼 업데이트되는 길이 속성이 있지만 배열 이외의 개체의 경우 그러한 속성을 구현할 방법이 없습니다.

var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6

배열은 서수 색인으로 물건을 저장하는 데 사용됩니다. 전통적인 배열, 스택 또는 큐처럼 사용하십시오. 객체는 해시입니다 - 뚜렷한 키가있는 데이터에 사용하십시오.

그만큼 {}-코드를 더 좋게 만드는 구문 설탕 일뿐입니다. ;-)

JavaScript는 함수 구성과 같은 많은 유사한 구성이 있습니다.

var Func = new Function("<params>", "<code>");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top