Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

242
Views
Javascript: ¿por qué `const number = 0; number.foo` devuelve `undefined`, pero `0.foo` lanza `Token no válido o inesperado`

Durante una sesión de depuración, después de cambiar el retorno de un método de 0 a null , comencé a ver una excepción que no ocurría antes.

Profundizando más, me di cuenta de que si una variable contiene un Número, puede llamar a una propiedad como si fuera cualquier otro objeto; Sin embargo, no sucede lo mismo si intenta llamar directamente a una propiedad al número.

Por ejemplo:

 const number = 0; console.log(number.foo) // undefined 0.foo // throws SyntaxError: Invalid or unexpected token

¿Qué causa esta distinción y dónde puedo leer más al respecto?

ACTUALIZAR

Me acabo de dar cuenta de que (0).foo devuelve undefined, por lo que hay al menos algo de coherencia allí, pero no sabía que Numbers podría tener propiedades en javascript.

En realidad, solo puede intentar leer, pero nunca asignar a estas propiedades:

 const number = 3; number.someProperty = true; number.someProperty // returns `undefined`
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

. se toma como el punto decimal opcional directamente después de un número. Agregar un espacio, usar corchetes o agregar otro . ser el punto decimal (para que el segundo . se interprete como un descriptor de acceso a la propiedad) resolverá el error.

Puede acceder a las propiedades de los números primitivos porque intentar invocar métodos o buscar propiedades en los primitivos hará que se envuelvan en el objeto correspondiente para realizar la operación.

 console.log(0 .foo); console.log(0..foo); console.log((0).foo);

about 4 years ago · Juan Pablo Isaza Report

0

0.foo lanza SyntaxError: Invalid or unexpected token y el código no se ejecuta porque no es un programa válido.

El analizador léxico encuentra 0 y sabe que un número comienza allí. Después de 0 hay un . eso le dice que el número es un número real, no un número entero. Si después . hay más dígitos que son la parte decimal del número.

En este caso no hay más dígitos después de . y el número es 2. . Los siguientes caracteres después de . ( foo ) no son parte del número pero son un identificador.

En total, el "programa" de entrada 0.foo se analiza en dos tokens: 2. , que es un número seguido de foo , que es un identificador.

Esta combinación (número seguido inmediatamente por el identificador) no es un fragmento de programa válido. En un programa correcto, un número puede ir seguido de un espacio, un operador, un punto y coma, un paréntesis cerrado y probablemente varios otros tokens léxicos, pero no un identificador.

El fragmento de código no es un programa JavaScript válido; no se puede compilar y por lo tanto no se ejecuta.

Hay varias maneras de hacer que funcione. Por ejemplo (0).foo .

Si intenta ejecutar 0.foo en la consola de desarrolladores en Firefox, arroja un error que resume lo que expliqué anteriormente: Uncaught SyntaxError: identifier starts immediately after numeric literal

about 4 years ago · Juan Pablo Isaza Report

0

Esto se debe a la naturaleza de JS OOP y su modelo de creación de prototipos. Todo, incluso los valores primitivos, tiene un prototipo, que suele ser un Objeto. Entonces, cualquier primitivo, String, Boolean, BigInt, etc. tiene propiedades, con la excepción de null e undefined .

 (1).toString() (1n).toString() (true).toString()

Puede acceder a prototipos de valores como este:

 Number.prototype Boolean.prototype String.prototype

Por lo tanto, puede agregar propiedades a las primitivas (pero no debe hacerlo debido a problemas de compatibilidad y la naturaleza propensa a errores de tales modificaciones). Pero aquí hay un ejemplo de esto:

 Number.prototype.negative = function () { return Number(this * -1) }; (1).negative(); // -1

En el caso de los números, obtuvo un error de sintaxis debido a las reglas de análisis de JS, no debido a su modelo OOP. JS interpreta 0. como un número con mantisa, por lo que espera un número después del punto.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!