typeof new String ("aaa") === "object"?Все является объектом, но есть примитивные типы? - PullRequest
9 голосов
/ 02 февраля 2012

Будет много вопросов, требующих уточнения, поэтому я постараюсь пометить их цифрами, чтобы было легче ответить на них.

В последнее время я много изучал JavaScript. Есть тема про "все есть объект".

  1. В моей «интерпретации javascript» это означает, что все имеет «объект» в начале своей цепочки прототипов. Это правильно?

  2. Но как насчет примитивных типов (string, number, boolean, null, undefined)? Это объекты? Я могу позвонить "aaa".length например. Как это работает?

  3. Функции - это объекты, реализующие [[Call]] в соответствии с этим . Что это значит? (Я думаю, что это что-то вроде fun.call ( this , arg1 ), но помогите мне понять это.

    Также есть оператор typeof. Я связывал это раньше с MDN , но есть вещи, которые сбивают с толку.

  4. typeof "aaa" === "string" и typeof String("aaa") === "string". Это кажется вполне ожидаемым, но что возвращает String ("aaa")? Я предполагаю, что он как-то анализирует ввод и возвращает строковый примитив из него. Это правильно?

  5. typeof new String("aaa") === "object" Что? Пожалуйста, объясните мне его цепочку прототипов. Где и на каком прототипе у меня есть примитивное строковое значение "aaa"? Чем он отличается от typeof String("aaa")?

Я прочитал и посмотрел много вещей на эту тему, и я думаю, что мне нужны эти разъяснения.

Также в ваших ответах, если вы связываете внешний ресурс, пожалуйста, суммируйте его важную часть и укажите, что он означает, потому что я читал спецификации ecmascript, и они довольно длинные:).

Также, если есть разница в версиях javascript, укажите это тоже.

Ответы [ 2 ]

13 голосов
/ 02 февраля 2012

1 \ В моей «интерпретации javascript» это означает, что у всего есть «объект» в начале цепочки прототипов.Это правильно?

Да и нет.Все объекты по умолчанию наследуются от Object.Можно, используя ES5 Object.create, иметь объект, который не наследуется от Object, но это все еще объект.

2 \ Но как насчеттипы примитивов (строка, число, логическое значение, ноль, неопределенный)?Это объекты?Я могу назвать «ааа». Длина например.Как это работает?

Это заблуждение, что в JavaScript все является объектом.Примитивы не являются объектами, но они могут быть преобразованы в объекты.Когда используется оператор ., левый операнд преобразуется в объект (, если возможно ).

3 \ Функции - это объекты, реализующие [[Call]] в соответствии сэтот.Что это значит?(Я думаю, что это что-то вроде fun.call (this, arg1), но помогите мне понять это.

[[Call]] - это внутренний метод, используемый реализацией ECMAScript для маркировки объектов как функций.Он не имеет прямого отношения к Function.prototype.call, который также является функцией, помеченной [[Call]]. См. 13.2.1 [[Call]] .

4 \ typeof "aaa" === "string" и typeof String ("aaa") === "string". Это кажется вполне ожидаемым, но что возвращает String ("aaa")? Я предполагаю, что он анализируеткаким-то образом вводит и возвращает строковый примитив. Это правильно?

String(), когда не используется в качестве конструктора, преобразует свой аргумент в строковый примитив . Итак String("aaa") - это то же самое, что и "aaa".toString(). В этом случае это избыточно и не нужно.

5 \ typeof new String ("aaa") === "object" Что? Пожалуйста, объясните, что это цепочка прототипов.мне. Где и на каком прототипе у меня есть примитивное строковое значение "aaa"? Чем оно отличается от typeof Stri?ng ("aaa")?

String(), используемый в качестве конструктора, возвращает объект, который наследуется от String(), как и следовало ожидать.Существует разница между строковым примитивом и строковым объектом .

Практически на все ваши вопросы можно ответить, прочитав спецификацию, когда вы что-то путаете.Для вашего удобства есть аннотированная версия спецификации , доступная онлайн .

3 голосов
/ 02 февраля 2012

1 \ В моей «интерпретации javascript» это означает, что у всего есть «объект» в начале цепочки прототипов.Это правильно?

Ответ: Нет, существуют и примитивные типы, как вы сказали в вопросе 2.

2 \ Но как насчет примитивных типов (строка, число?, логическое, нулевое, неопределенное)?Это объекты?Я могу назвать «ааа». Длина например.Как это работает?

Ответ: Нет, это примитивные типы, а не объекты.Когда вы вызываете "aaa".length, JavaScript автоматически переносит строковый примитив на объект String и вызывает метод или выполняет поиск свойства.

3 \ Функции - это объекты, реализующие [[Call]] в соответствии с этим,Что это значит?(Я думаю, что это что-то вроде fun.call (this, arg1), но помогите мне понять это.

Ответ: Каждая функция в JavaScript на самом деле является объектом Function.

4 \ typeof "aaa" === "string" и typeof String ("aaa") === "string". Это кажется вполне ожидаемым, но что возвращает String ("aaa")? Я думаю, это анализируеткак-то вводит и возвращает строковый примитив из него. Это правильно?

Ans: String("aaa") возвращает примитивную строку.

5 \ typeof new String ("aaa ") ===" object "Что? Пожалуйста, объясните мне цепочку прототипов. Где и на каком прототипе у меня есть примитивное строковое значение" aaa "? Чем оно отличается от typeof String (" aaa ")?

Ответ: new String("aaa") возвращает объект String.

...