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.