Typeof new String ( "aaa" ) === "object"? Все это объект, но есть примитивные типы?

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

В последнее время я много изучаю javascript. Существует тема о том, что "все является объектом".

  • В моей "интерпретации javascript" это означает, что у всего есть "объект" в начале своей прототипной цепочки. Правильно ли это?

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

3\Функции - это объекты, реализующие [[Call]] в соответствии с этим. Что это значит? (Я думаю, что это что-то о fun.call(это, 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 String ( "aaa" )?

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

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

Ответ 2

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

Ans: Нет, есть также примитивные типы, как вы сказали в вопросе 2.

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

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

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

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

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

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

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

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