Строки могут быть либо примитивами, либо объектами, в зависимости от того, как они были объявлены.
var str = 'yes';
Дает вам примитив, а
var str = new String('yes');
даст вам объект String.
Все массивы одинаковы (независимо от того, были они определены с помощью [] или new Array ()), относятся к типу объекта и наследуются от прототипа объекта "Array".В Javascript нет реальных классов, все является объектом, и существует системный объект, называемый Array.У него есть свойство с именем «prototype» (типа object), и когда вы используете ключевое слово new для объекта со свойством prototype, оно создает экземпляр со ссылкой на содержимое прототипа и сохраняет его в вашей переменной.Таким образом, все массивы, которые вы когда-либо использовали в Javascript, являются объектами и экземплярами свойства прототипа массива.
В любом случае, хотя массивы действительно являются объектами, они ведут себя как массивы из-за своих полезных свойств и функций (таких как длина, slice, push и т. д.).
Еще одно замечание, хотя я и сказал, что когда вы сделаете это, классов не будет:
console.log(Object.prototype.toString.call(your_object));
он выдаст вам строку в форме [object Object].Но что полезно, так это то, что когда вы вызываете его с массивом, вы получаете [object Array] то же самое с функциями, которые предоставляют [object Function] и ряд других типов, определенных системой, что помогает различать обычные объекты и массивы (так как typeofоператор всегда будет просто возвращать строку 'object').
Попробуйте это
var a = Array;
и зайдите в firebug и изучите содержимое a, особенно его свойства 'prototype'.
Редактировать: Немного изменили формулировку, чтобы быть более корректной.Фактически, когда вы используете ключевое слово new, он создает экземпляр, который ссылается на объект-прототип.Таким образом, любые изменения, внесенные в прототип после объявления экземпляра, все равно будут влиять на экземпляр.
Редактировать: В ответ на ваш последний исправленный вопрос (действительно ли массивы / объекты являются замаскированными строками):Нет. Это объекты, как я объяснил.Строки являются либо примитивным типом, либо типом объекта (экземпляр объекта String), который содержит примитивный эквивалент в качестве одного из своих свойств.