예를 들어 다음과 같이 배열을 정렬할 수 있습니다.
으아아아그러나 다음과 같이 객체의 메서드를 호출할 수는 없습니다.
으아아아또한 문자열에서 메서드를 직접 호출할 수 있지만 숫자 및 부울 유형에서는 메서드를 호출할 수 없는 이유는 무엇입니까?
문자열 메서드를 호출하면 임시 String 객체가 생성됩니다. 왜 숫자 및 부울 유형이 작동하지 않나요?
欧阳克2017-07-05 11:07:29
이 불일치eval()
解析'{}'
道理一样,js解析代码会优先把{
看成和function{}
的大括号一样,会分开解析先解析{
(开始),在解析}
(结束)。这样的话当然会报错了。
而eval()
解析'{}'
时是怎么办的,加个括号'({})'
;这样就会把{}
는 전체적으로 분석되어 하나의 대상이 됩니다.
"문자열은 메서드를 직접 호출할 수 있지만 숫자 및 부울 유형은 호출할 수 없는 이유"에 대해서는
Boolean 유형은 가능하고,
숫자의 경우 메서드를 직접 호출할 수 없다는 것이 js 파싱의 이유이기도 합니다.
그렇다면 왜 js에는 실제 정수가 없기 때문에 정수는 부동 소수점 숫자로 표현되므로 js가 구문 분석할 때 8
是发现后面还有.
于是会把8.
看成一个数,这样的话没加.
的toString
물론 잘못된 것입니다.
이렇게 써도 괜찮습니다
学习ing2017-07-05 11:07:29
우선, 당신의 생각은 틀렸습니다. 일반 객체 객체는 메소드를 호출할 수 있습니다 . 으아악
하지만{}.toString()
에 구문 오류가 있습니다. {}.toString()
의 {}
가 로 읽혀지기 때문입니다. {}.toString()
却是出现语法错误,因为{}.toString()
中的{}
将会被看成一个语句块,而不是对象直接量.
因为 JavaScript 将从左到右解析{}.toString()
,当遇到{
时,它将会看做一个语句块的开始,之后遇到}
,语句块结束,在遇到.
객체 리터럴
을 사용합니다.
JavaScript는 {}.toString()
을 왼쪽에서 오른쪽으로 구문 분석하기 때문에 {
를 만나면 다음과 같습니다. }
를 만나면 문장 블록의 시작으로 간주됩니다. .
를 만나면 구문 오류가 발생합니다.
({}).toString()
将可以正常工作.(注意包围在{}
两边的括号).
因为当解析({}).toString()
时,首先遇到(
그리고 ({}).toString()
을 사용하면 정상적으로 작동합니다({}
를 둘러싼 괄호에 주의하세요).
왜냐하면 구문 분석 시 ({}).toString()
, 먼저 (
를 만난 다음 는 대괄호 안의 부분을 표현식 으로 처리하고
高洛峰2017-07-05 11:07:29
{}.toString()
에 대해 누군가 이미 매우 명확하게 밝혔습니다. 이는 js 엔진이 구문 분석 시 {}를 블록 표시로 처리하기 때문입니다. 그런데 매우 이상하다는 생각이 듭니다. Mac에서 여러 브라우저를 사용해 보았는데 포스터에서 언급한 문제에는 아무런 문제가 없습니다.
제가 추가하고 싶은 것은 포스터의 두 번째 질문입니다. 为什么字符串可以直接调用方法,Number类型、Boolean类型却不行。
어딘가에서 실수를 하신 것 같아요.
여기서 num은 숫자 리터럴이고 flag는 부울 값입니다. 둘 다 메서드를 호출할 수 있습니다. 작성자가 문자열에 대해 알고 있다면 기본 유형의 데이터에는 속성과 메서드가 없고 객체에만 속성과 메서드가 있다는 점을 이해해야 합니다.
그런데 왜 객체의 메서드를 호출하는 것처럼 기본 데이터 유형의 메서드를 호출할 수 있나요? (예: 'a bc'.trim())
기본 데이터 유형의 값에 대해 메소드가 호출되면 js가 이를 임시 래퍼 객체로 변환하기 때문입니다. 문자열 리터럴은 문자열 객체(new String('abc'))와 같은 속성과 메서드를 호출할 수 있고, 숫자 리터럴은 숫자 객체와 같은 속성과 메서드를 호출할 수 있습니다.
물론 이 임시 래퍼 개체는 코드가 실행되는 순간에만 존재합니다. 메서드가 실행된 후 임시 개체는 즉시 삭제됩니다.
그래서 포스터에서 말한 것은 숫자 및 부울 유형 값에 대한 메서드를 호출하는 것이 불가능하다는 것입니다.