2011-12-20 4 views
0

자바 스크립트로 작성된 일부 코드를 이해하려고하는데 구문이 다소 복잡합니다.객체 배열에 대한 자바 스크립트 리터럴 표기법

var connections = {}; // I know '{}' means new Object() 
var messages = {}; 

오브젝트에는 변수 경로, ​​버전 등이 포함되어 있지만 다음 코드에는 어떤 코드가 있습니까?

connections[ path ] = connections[ path ] || []; 
messages[ path ] = messages[ path ] || { version: 0, body: ''}; 
+0

pendantic이기 때문에'{}}는 ('Object'가 덮어 쓰기되지 않은 경우에도)'new Object()'와 같지 않습니다. 그러나 충분히 가깝습니다. 차이는 미묘하며 차이점을 결코 눈치 채지 못할 것입니다. –

+2

@ tri : 차이점이 무엇인지 실제로 말하지 않으면 작은 pedantic 세부 오류를 지적하는 것이 도움이되는지 확신 할 수 없습니다. –

+2

@ trinithis-do tell. ES5 11.1.5는 다음과 같이 말합니다 :'Production ObjectLiteral : {}은 다음과 같이 평가됩니다 : 1. 새로운 Object()라는 표현식에 의해 생성 된 새로운 객체를 반환합니다. Object는 그 이름을 가진 표준 내장 생성자입니다. 그렇다면 "미묘한 차이"란 무엇입니까? – RobG

답변

0
connections[ path ] = connections[ path ] || []; 

은 약이 (즉이 []로 설정 값은 값이 이미 설정되어 있지 않은 경우)

connections[path]에 대한 기본 값을 설정하는 편리한 방법이다이 경우

connections[ path ] = connections[ path ] != null ? connections[ path] : []; 

로 변환

일부 언어 (예 : 루비)에서는이 값이 더 짧게 쓸 수도 있습니다.

그 전에 초기화되어 있지 않은 경우
connections[path] ||= [] 
2

(3210)는 기본적으로 경로 속성을 초기화하거나이 null 또는 허위 즉 0

(또는 다른 코드)를 포함에 대한

if (connections[path] === null || connections[path] === undefined || connections[path] === 0 || connections[path] === false) { 
    connections[path] = []; 
} else { 
    connections[path] = connections[path]; 
} 

동일 messages [path] 만 객체를 초기화하고 빈 배열은 초기화하지 않습니다.

4

이후 connectionsmessages 어레이 인덱스를 나타내지 않는 개체의 [] 있지만, 변수가 변수의 이름을 찾는 데 사용되는 접속 부재의 구문 않고있다. path = 'x' 이후

var path = 'x' 
connections[path] = connections[path] || []; 

위를

은, path의 값으로 명명 된 두 개체의 회원이 그것을 계속 존재하는 경우, (그 자체로 현재의 값을 할당) 말하는

connections.x = connections.x || []; 

같다 그렇지 않으면 (||이 여기에 병합에 사용됨) 새 비어있는 배열 또는 각각 { version: 0, body: '' }을 새로 만듭니다.

병합/논리 OR은 왼쪽에서 오른쪽으로 쉽게 연결될 수 있습니다. 이는 경우, connections[ path ] === null 경우 또는 connections[ path ] === undefined 있는지 확인하기 위해 우리가 검사를 수행하는 connections[ path ] = connections[ path ] || [];

너무

function createItem(color) { 

    // if a color is specified in the arguments, use that 
    // otherwise, if a color is specified in the settings object for this instance 
    // of the current user control, use that. otherwise, fall back to the global 
    // default values. if none of these settings have been defined, use black. 

    color = color || instanceSettings.defaultColor 
       || globalSettings.defaultColor 
       || '#000000'; 

    ... 

} 
0

|| 운영자 수단 OR : 당신은 어떤 경우에 예를 들어이 같은 작업을 수행 할 수 있습니다 우리는 connections[ path ]을 빈 배열에 할당합니다. messages[ path ] 함께

우리는 같은 검사를 수행하고 널 불확정 인 경우, 우리는 연결 메시지는 아래와 같은 목적을하자, 그것을 예를 들어 { version: 0, body: ''}

+1

코드가 실제로 위조 *인지 확인하고 있습니다. 조건으로 사용될 때 거짓으로 해석되는 모든 것. 'null'과'undefined'를 넘어서, 이것은 또한 '0',''','false'와'NaN'을 검사합니다. –

+0

@David Hedlund - 좋은 지적이고 위의 내용에 동의합니다. 여기에 대한 답변을 얻으려고 서둘러서, 수행 된 전체 점검을 나열하지 않았습니다. –

0

의 값을 할당한다.

var connections={ 
    "path":"http://www.xyz.com", 
    "version":"1.2.0" 
}; 
var messages={ 
    "text':"This is message", 
    "path":"http://www.xyz.com", 
    "version":'1.2.0', 
    "body":"" 
}; 

이제 아래의 코드는 다음과 같이 작동합니다 : 그것은 위에서 언급 한 목적에없는 경우 1.path이 빈 문자열이 할당됩니다. 2. 마찬가지로 메시지 경로는 개체 '경로'에있는 경로입니다. 그렇지 않으면

connections[ path ] = connections[ path ] || []; 
messages[ path ] = messages[ path ] || { version: 0, body: ''}; 

연결 및 메시지 자바 스크립트 객체의 단지 JSON 표현이다 '버전'과 '몸'의 대상이 될 것입니다. 따라서 connections [path]는 connections.path와 같습니다. 서명 || 객체에 실제 값이 없거나 정의되지 않은 경우 공백 값을 할당하는 데 사용됩니다.

+0

이 예제는'messages' 자체가'version'과'body'를 포함하고있어서 독자가 이것이 변경 될 수있는 멤버라고 생각하도록 유도한다는 점에서 다소 혼란 스럽다고 생각합니다. (사실이 아닙니다. 당신이 그것을 말하고 있다고 생각하지 않는다.) 또한, 'path ='path ''는 변수가 처음부터 사용되었다는 것이 명백하다고 생각하기 때문에 항상 그렇지는 않다. –

+0

감사합니다. David! 사실, 당신의 설명이 더 정확한 것 같습니다. –

0

나는 상상을 자극해야합니다.

a || b는 어떤 종류의 false 값도 포함하지 않는 첫 번째 요소를 반환합니다.

connections[ path ] || []; 
// return [] (empty array) if connections[ path ] is return false (or undefined, 0, [], "", NaN etc) 
1

키는 논리 OR (||) 연산자를 이해하는 것이다. 자바 스크립트에서 연산자의 왼쪽에있는 표현식이 먼저 테스트됩니다. true로 해석되면 해당 표현식이 반환됩니다. 거짓으로 해석되면 오른쪽에있는 표현식이 반환됩니다. 변수에 기본값을 할당하는 좋은 방법입니다.

두 번째로 connections[path]은 배열 요소에 액세스하지 않습니다. path이 문자열로 해석되면 connections[path]connections.path과 동일하며 connections 개체의 해당 요소에 액세스하는 것입니다. 아무것도, 하늘의 배열 경우이 코드를 작성

connections[path] = connections[path] || [];

사람이 될 수있는 경로 멤버를 원했다. 이 행은 기본적으로 connections[path]truthy인지 확인합니다. path 회원 중에 뭔가가 있다면, 그것은 혼자 남습니다. 그렇지 않으면 빈 배열이됩니다.

messages[path] = messages[path] || { version: 0, body: '' };

이 기본값을 제외하고 이전 행과 동일한 방식으로 기능이 거기에 회원이 아닌 하늘의 배열을 가진 객체입니다.