Нет, не все это объект в JavaScript. Многие вещи, с которыми вы регулярно взаимодействуете (строки, числа, булевы), являются примитивами, а не объектами. В отличие от объектов, примитивные значения неизменяемы. Ситуация осложняется тем, что эти примитивы имеют обертки объектов (String
, Number
и Boolean
); эти объекты имеют методы и свойства, а примитивы - нет, но у примитивов, как представляется, есть методы, потому что JavaScript молча создает объект-оболочку, когда код пытается получить доступ к любому свойству примитива.
Например, рассмотрим следующее Код:
var s = "foo";
var sub = s.substring(1, 2); // sub is now the string "o"
За кулисами s.substring(1, 2)
ведет себя так, как если он выполняет следующие (приблизительные) шаги:
String
объект из s
, эквивалентный использованию new String(s)
substring()
с соответствующими параметрами объекта String
, возвращенного на шаг 1 String
object Следствием этого является то, что, хотя кажется, что вы можете назначать свойства примитивам, это бессмысленно потому что вы не можете их получить:
var s = "foo";
s.bar = "cheese";
alert(s.bar); // undefined
Это происходит потому, что свойство эффективно определено на объекте String
, который сразу же отбрасывается.
Номера и булевы также ведут себя таким образом. Функции, однако, являются полностью реализованными объектами и наследуются от Object
(фактически Object.prototype
, но это еще одна тема). Таким образом, функции могут выполнять любые объекты, включая наличие свойств:
function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea
Это почти наверняка будет быстрее, если вы просто загрузите файл (возможно, в облачное хранилище) и выполните операции с базой данных в облачных функциях или каком-либо другом бэкэнде, и он завершится, даже если пользователь выйдет из приложения.