>  Q&A  >  본문

javascript - Array가 메소드를 직접 호출할 수 있는데 일반 객체 객체는 왜 호출할 수 없나요?

예를 들어 다음과 같이 배열을 정렬할 수 있습니다.

으아아아

그러나 다음과 같이 객체의 메서드를 호출할 수는 없습니다.

으아아아

또한 문자열에서 메서드를 직접 호출할 수 있지만 숫자 및 부울 유형에서는 메서드를 호출할 수 없는 이유는 무엇입니까?

문자열 메서드를 호출하면 임시 String 객체가 생성됩니다. 왜 숫자 및 부울 유형이 작동하지 않나요?

phpcn_u1582phpcn_u15822663일 전1310

모든 응답(3)나는 대답할 것이다

  • 欧阳克

    欧阳克2017-07-05 11:07:29

    이 불일치eval()解析'{}'道理一样,js解析代码会优先把{看成和function{}的大括号一样,会分开解析先解析{(开始),在解析}(结束)。这样的话当然会报错了。
    eval()解析'{}'时是怎么办的,加个括号'({})';这样就会把{}는 전체적으로 분석되어 하나의 대상이 됩니다.
    "문자열은 메서드를 직접 호출할 수 있지만 숫자 및 부울 유형은 호출할 수 없는 이유"에 대해서는
    Boolean 유형은 가능하고,
    숫자의 경우 메서드를 직접 호출할 수 없다는 것이 js 파싱의 이유이기도 합니다.

    으아악

    그렇다면 왜 js에는 실제 정수가 없기 때문에 정수는 부동 소수점 숫자로 표현되므로 js가 구문 분석할 때 8是发现后面还有.于是会把8.看成一个数,这样的话没加.toString물론 잘못된 것입니다.
    이렇게 써도 괜찮습니다

    으아악

    회신하다
    0
  • 学习ing

    学习ing2017-07-05 11:07:29

    우선, 당신의 생각은 틀렸습니다. 일반 객체 객체는 메소드를 호출할 수 있습니다 . 으아악

    하지만 {}.toString()에 구문 오류가 있습니다. {}.toString(){}

    로 읽혀지기 때문입니다. {}.toString()却是出现语法错误,因为{}.toString()中的{}将会被看成一个语句块,而不是对象直接量.
    因为 JavaScript 将从左到右解析{}.toString(),当遇到{时,它将会看做一个语句块的开始,之后遇到},语句块结束,在遇到.객체 리터럴

    대신에 문 블록

    을 사용합니다.
    JavaScript는 {}.toString()을 왼쪽에서 오른쪽으로 구문 분석하기 때문에 {를 만나면 다음과 같습니다. }를 만나면 문장 블록의 시작으로 간주됩니다. .를 만나면 구문 오류가 발생합니다. ({}).toString()将可以正常工作.(注意包围在{}两边的括号).
    因为当解析({}).toString()时,首先遇到(그리고 ({}).toString()을 사용하면 정상적으로 작동합니다({}를 둘러싼 괄호에 주의하세요).
    왜냐하면 구문 분석 시 ({}).toString(), 먼저 (를 만난 다음 는 대괄호 안의 부분을 표현식 으로 처리하고

    은 빈 객체를 가져오므로 🎜입니다. 이 빈 개체에 대해 메서드 호출을 수행하는 것은 합법적입니다.🎜

    회신하다
    0
  • 高洛峰

    高洛峰2017-07-05 11:07:29

    {}.toString()에 대해 누군가 이미 매우 명확하게 밝혔습니다. 이는 js 엔진이 구문 분석 시 {}를 블록 표시로 처리하기 때문입니다. 그런데 매우 이상하다는 생각이 듭니다. Mac에서 여러 브라우저를 사용해 보았는데 포스터에서 언급한 문제에는 아무런 문제가 없습니다.

    제가 추가하고 싶은 것은 포스터의 두 번째 질문입니다. 为什么字符串可以直接调用方法,Number类型、Boolean类型却不行。 어딘가에서 실수를 하신 것 같아요.

    으아악

    여기서 num은 숫자 리터럴이고 flag는 부울 값입니다. 둘 다 메서드를 호출할 수 있습니다. 작성자가 문자열에 대해 알고 있다면 기본 유형의 데이터에는 속성과 메서드가 없고 객체에만 속성과 메서드가 있다는 점을 이해해야 합니다.

    그런데 왜 객체의 메서드를 호출하는 것처럼 기본 데이터 유형의 메서드를 호출할 수 있나요? (예: 'a bc'.trim())

    기본 데이터 유형의 값에 대해 메소드가 호출되면 js가 이를 임시 래퍼 객체로 변환하기 때문입니다. 문자열 리터럴은 문자열 객체(new String('abc'))와 같은 속성과 메서드를 호출할 수 있고, 숫자 리터럴은 숫자 객체와 같은 속성과 메서드를 호출할 수 있습니다.

    물론 이 임시 래퍼 개체는 코드가 실행되는 순간에만 존재합니다. 메서드가 실행된 후 임시 개체는 즉시 삭제됩니다.

    그래서 포스터에서 말한 것은 숫자 및 부울 유형 값에 대한 메서드를 호출하는 것이 불가능하다는 것입니다.

    회신하다
    0
  • 취소회신하다