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