9

En varias respuestas en este sitio he leído afirmaciones contradictorias acerca de si todo en JavaScript es un objeto o no.

¿Cuál es la verdad?

La idea es que las respuestas estén fundamentadas en fuentes confiables, preferentemente en la ECMAScript 2016 (versión 7) pero bien puede ser en la que se ha haya introducido un elemento de especificación al respecto.

A continuación un par de ejemplos de cada caso

Todo es un objeto

No todo es un objeto

Ambiguos

Nota general:

Aunque esta pregunta cuenta con una respuesta de mi parte la idea es tener la mejor explicación sobre esto para beneficio de la comunidad.

Notas específicas:

1: Se ha marcado esta pregunta como duplicada debido a que se opinaba que en la respuesta referida está la respuesta a esta pregunta, sin embargo, precisamente se está señalando la controversia que hay considerando las respuestas a otras preguntas. Por otro lado esta respuesta no fundamenta sus argumentos en fuentes externas.

Rubén
  • 10,857
  • 6
  • 35
  • 79
  • Posible duplicado de [¿Cómo funciona el prototipo de un objeto?](https://es.stackoverflow.com/questions/68559/c%c3%b3mo-funciona-el-prototipo-de-un-objeto) – A. Cedano Jul 10 '17 at 02:02
  • La respuesta ya la tienes [aquí](https://es.stackoverflow.com/a/68692/29967): _Me parece que estás pensando Javascript como lenguaje orientado objetos según el paradigma de clases. No es así el asunto. En Javascript no hay clases. Todo es un objeto..._ Por otra parte, la respuesta hace pensar que estamos en Stackoverflow en inglés. – A. Cedano Jul 10 '17 at 02:04
  • La respuesta que señalas, ya está referida en la pregunta. Como se señala esa respuesta indica "en JavaScript todo es un objeto" pero no fundamenta esa afirmación que es lo que aquí se está pidiendo. Como podrás ver en la respuesta a esta pregunta, esa afirmación es incorrecta con base tanto en MDN y ECMASCript 2016. Quizás quieras publicar una respuesta a esta pregunta en la fundamentes en fuentes confiables la afirmación de que "en JavaScript todo es un objeto". – Rubén Jul 10 '17 at 02:07
  • La [doc](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Object) dice esto: _En JavaScript todos los objetos provienen de Object; todos los objetos heredan métodos y propiedades de Object.prototype, aunque pueden ser sobrecargados. Por ejemplo, los constructores de otros prototipos sobrescriben la propiedad constructor y proporcionan sus propios métodos toString. Los cambios en el prototipo de Object se propagan a todos los objetos aunque las propiedades y métodos sujetos a estos cambios sean sobrescritos posteriormente a lo largo de la cadena de prototipos._ – A. Cedano Jul 10 '17 at 02:12
  • 1
    Los primitivos son elementos de JavaScript y no son objetos. – Rubén Jul 10 '17 at 02:13
  • Lee bien en [tu enlace sobre Primitivos](https://developer.mozilla.org/es/docs/Glossary/Primitivo), por ejemplo. Lo que se da al principio es una definición _genérica_ de lo que es un primitivo y luego te pone bien en negritas: **Objetos primitivos en JavaScript** – A. Cedano Jul 10 '17 at 02:16
  • Ya entiendo donde está tu confusión, estás entendiendo Objeto primitivo como lo mismo que primitivo, pero no lo son. – Rubén Jul 10 '17 at 02:21
  • 1
    @A.Cedano Según el enlace, los objetos lo están rodeando a los valores primitivos. _los valores primitivos tienen objetos equivalentes que se envuelven alrededor de los valores primitivos_ –  Jul 10 '17 at 03:00

1 Answers1

6

Respuesta corta

En lo que a tipos de datos se refiere, en JavaScript hay dos clases básicas, primitivos y objetos, así que no todo es un objeto en JavaScript, pero cuidado, este podría convertir los primitivos en un objeto de forma temporal.

Demostración

Explicación

Con código

instanseof es un operador para probar si el primer operando, un objeto, es una instancia del segundo, un constructor. Sigue toda la cadena de prototipos, si lo encuentra devuelve true, si no lo encuentra devuelve false.

console.log(1 instanceof Object); //Devuelve false
console.log(Object(1) instanceof Object); //Devuelve true

Con base en la documentación

La siguiente es una declaración proveniente del glosario de Mozilla Developer Network, la cual de forma muy sintética aclara que no todo en JavaScript es un objeto, énfasis mío.

De Primitivo

Un primitivo (valor primitivo, tipo de datos primitivo) es un dato que no es un objeto y no tiene métodos. En JavaScript hay 6 tipos de datos primitivos: string , number , boolean , null , undefined , symbol (nuevo en ECMAScript 2015).

De Gramática y Tipos

Literales Booleanos

Los literales de tipo Booleanos tienen 2 valores posibles: true y false.

NO confundir los valores primitivos Booleanos true y false con los valores true y false del Objeto Booleano. El objeto Booleano es un contenedor alrededor del tipo de dato Primitivo Booleano. Para más información revisa Booleano .


Literales String

Un literal String corresponde a Cero o mas caracteres, encerrados dentro de comillas dobles (") o sencilla (') . Un string debe estar delimitado por comillas del mismo tipo; esto quiere decir que, siempre ambas son dobles o sencillas en cada uno de los casos. Los siguientes son ejemplos de literales String:

  • "foo"
  • 'bar'
  • "1234"
  • "Una linea \n otra linea"
  • "El gato de Jhon"

Puedes utilizar cualquiera de los métodos del objeto String en un literal de tipo string—JavaScript automáticamente convierte el literal string en un objeto String de manera temporal, llama al método, y finalmente destruye el objeto temporal de tipo String. También puedes usar la propiedad String.length con un literal string:

A continuación lo que me parece son las secciones de la ECMAScript 2016 (Versión 7) que aclaran esto

§4.3.2 primitive value

member of one of the types Undefined, Null, Boolean, Number, Symbol, or String as defined in clause 6

NOTE
A primitive value is a datum that is represented directly at the lowest level of the language implementation.

§4.3.3 object

member of the type Object

NOTE
An object is a collection of properties and has a single prototype object. The prototype may be the null value.

Nótese que un objeto no está al nivel más bajo de la implementación del lenguaje, contrario a lo que ocurre con los primitivos.

La explicación completa sobre los tipos de datos y valores en ECMAScript 2016 (versión 7) está en §6 ECMAScript Data Types and Values


Sobre las diferencias entre primitivos y objetos primitivos
Rubén
  • 10,857
  • 6
  • 35
  • 79