여기서 주목할 점은 Javascript는 동적 언어이므로 모든 객체는 본질적으로 영광스러운 해시 맵입니다 ( 몇 가지 예외는 있음 ). 그리고 자바 스크립트 객체의 모든 것은 브라켓 표기법과 도트 표기법의 두 가지 방식으로 액세스 할 수 있습니다.
질문의 첫 번째 부분에 답하는 두 가지 표기법을 빠르게 살펴보고 두 번째 부분으로 넘어갑니다.
대괄호 표기법
이 모드는 다른 프로그래밍 언어로 해시 맵 및 배열에 액세스하는 것과 유사합니다. 이 구문을 사용하여 모든 구성 요소 (데이터 (다른 개체 포함) 또는 함수)에 액세스 할 수 있습니다 .
이것은 귀하의 예에서 정확히하는 일입니다. 당신은 'a'
문자열입니다 ( C ++과 같은 언어에있는 것처럼 문자 리터럴은 아닙니다 ).
대괄호 표기법을 사용하여 해당 toUpperCase
방법에 액세스합니다 . 그러나 액세스하는 것만으로는 충분하지 않습니다. alert
예를 들어 Javascript로 간단히 입력 하면 메소드가 호출되지 않습니다. 간단한 진술 일뿐입니다. 함수를 호출하려면 괄호를 추가해야합니다 . 매개 변수가 alert()
없으므로을 포함하는 간단한 대화 상자가 표시 undefined
됩니다. 이제이 지식을 사용하여 코드를 해독 할 수 있습니다.
alert('a'.toUpperCase());
훨씬 더 읽기 쉽습니다.
실제로 이것을 조금 더 잘 이해하는 좋은 방법은 다음 Javascript를 실행하는 것입니다.
alert(alert)
이것은 또한 두 번째 경고를 실행하지 않고 alert
함수 객체를 전달하여 호출 alert
합니다. Chrome 26 이상에 표시되는 내용은 다음과 같습니다.
function alert() { [native code] }
부름:
alert(alert())
를 포함하는 두 개의 연속 메시지 상자를 표시 undefined
합니다. 이것은 설명하기 쉽습니다 : 내부 alert()
가 먼저 실행되고 undefined
(매개 변수가 없기 때문에) 표시되고 아무것도 반환하지 않습니다. 외부 경보는 내부 경보의 리턴 값을 수신합니다. 이는 아무것도 아니며 undefined
메시지 상자 에도 표시 됩니다.
jsFiddle의 모든 사례를 사용해보십시오!
점 표기법
이것은 좀 더 표준적인 접근 방식으로 도트 ( .
) 연산자를 사용하여 객체 멤버에 액세스 할 수 있습니다 . 다음은 점 표기법으로 코드가 표시되는 모습입니다.
alert('a'.toUpperCase())
훨씬 더 읽기 쉽습니다. 그러면 언제 점 표기법을 사용해야하고 언제 대괄호 표기법을 사용해야합니까?
비교
두 방법의 주요 차이점은 의미 론적입니다. 다른 세부 사항도 있지만 잠시 후에 설명하겠습니다. 가장 중요한 것은 실제로하고 싶은 것입니다. 경험상 규칙은 객체가 잘 확립 된 필드와 메소드에 도트 표기법 을 사용하고 실제로 객체를 해시 맵으로 사용할 때 의 괄호 표기법 을 사용한다는 것입니다 .
이 규칙이 왜 중요한지에 대한 훌륭한 예가 예제에 표시 될 수 있습니다. 코드는 점 표기법이 훨씬 현명한 장소에서 대괄호 표기법을 사용하기 때문에 코드를 읽기 어렵게 만듭니다. 코드가 작성된 것보다 여러 번 읽혀지기 때문에 이는 나쁜 일 입니다 .
점 표기법 을 사용하는 것이 더 합리적인 경우에도 대괄호 표기법 을 사용해야하는 경우 가 있습니다.
예:
for(var i = 0; i < 10; ++i) {
foo["method" + i]();
}
결론은 객체를 해시 맵 ( foods["burger"].eat()
) 으로 사용할 때는 대괄호 구문을 사용하고 "실제"필드 및 메소드 ( enemy.kill()
)로 작업 할 때는 점 구문 을 사용해야한다는 것 입니다. 자바 스크립트가 동적 인 언어이기 때문에 객체의 "실제"필드와 메소드와 "기타"데이터 사이의 경계선이 매우 흐릿해질 수 있습니다. 그러나 혼란스러운 방식으로 혼합하지 않는 한 괜찮습니다.
이제 나머지 질문에 (최종! : P).
메소드가 항상 obj의 멤버인지 확인하는 방법
당신은 할 수 없습니다. 시도 해봐. derp
문자열 을 불러보십시오 . 다음 줄에 오류가 발생합니다.
Uncaught TypeError: Object a has no method 'derp'
ANY 객체에서 ANY 메소드를 호출하는 일반적인 함수입니다. 그러나 이것이 지정된 메소드가 이미 지정된 객체의 암시 적 멤버라는 것을 의미합니까?
예, 귀하의 경우에는 그렇습니다. 그렇지 않으면 위에서 언급 한 오류가 발생합니다. 그러나, 당신은하지 않습니다 이 사용하는 return obj[method]();
에서 callMethod()
기능. 고유 한 기능을 추가 한 다음 맵 기능에서 사용할 수 있습니다. 다음은 모든 문자를 대문자로 바꾸는 하드 코딩 된 방법입니다.
function makeCap()
{
return function(obj) {
return obj.toUpperCase();
}
}
var caps2 = map(['a', 'b', 'c'], makeCap()); // ['A','B','C']
console.log(caps2)
링크 된 학습서의 코드는 부분 함수 를 사용 합니다 . 그들은 스스로 까다로운 개념입니다. 그 주제에 대해 더 많이 읽으면 내가 할 수있는 것보다 더 명확하게하는 데 도움이됩니다.
참고 : 이것은 질문의 코드에서 사용하는 map 함수의 코드입니다 . 소스 here .
function map(arr, iterator) {
var narr = [];
for (var i = 0; i < arr.length; i++) narr.push(iterator(arr[i], i));
return narr;
}
arr[5]
있습니다. 유효한 식별자 이름이 숫자 인 경우 점 표기법을 사용할 수 있습니다arr.5
.