¿Es JavaScript un lenguaje sin tipo?

104

He descubierto que algunas personas llaman a JavaScript un lenguaje "dinámicamente escrito débilmente", pero algunos incluso dicen "sin tipo". ¿Cuál es realmente?

Deniz Dogan
fuente

Respuestas:

133

JavaScript no está escrito:


(fuente: no.gd )

Incluso Brendan Eich lo dice. En Twitter, respondió a un hilo que enlazaba con esta pregunta:

... los tipos académicos usan "sin tipo" para significar "sin tipos estáticos" ...

Entonces, el problema es que hay algunas definiciones diferentes de sin tipo .

Se ha hablado de una definición en una de las respuestas anteriores: el tiempo de ejecución no etiqueta los valores y solo trata cada valor como bits. JavaScript tiene valores de variables y tiene un comportamiento diferente en función de esas etiquetas. Entonces JavaScript, obviamente, no encaja en esta categoría.

La otra definición proviene de la teoría del lenguaje de programación (lo académico al que se refiere Brendan). En este dominio, sin tipo solo significa que todo pertenece a un solo tipo .

¿Por qué? Porque un lenguaje solo generará un programa cuando pueda probar que los tipos se alinean (también conocida como correspondencia Curry-Howard ; los tipos son teoremas, los programas son demostraciones). Esto significa en un idioma no escrito:

  1. Siempre se genera un programa
  2. Por lo tanto, los tipos siempre coinciden
  3. Por lo tanto, solo debe haber un tipo

En contraste con un lenguaje mecanografiado:

  1. Es posible que no se genere un programa
  2. Porque los tipos pueden no coincidir
  3. Porque un programa puede contener varios tipos

Así que ahí lo tienes, en PLT, sin tipo solo significa escrito y escrito dinámicamente solo significa escrito estáticamente . JavaScript definitivamente no está escrito en esta categoría.

Ver también:

Brian McKenna
fuente
6
Y, por supuesto, "sin tipos estáticos" tampoco es lo mismo que "sin declaraciones de tipo".
Andreas Rossberg
+1. Quizás también debería vincular esto en su respuesta. Esta bs "débilmente escrita" está demasiado extendida.
missingfaktor
2
La teoría del lenguaje de programación es correcta. La captura de pantalla gigante es incorrecta.
Alex W
2
Me alegré de ver que esta respuesta hacía referencia a la publicación del blog de Harper, pero sería bueno que la comunidad PLT descartara "sin tipo" en favor de "unificado". La definición de "sin tipo" que significa "solo bits" tiene sentido. Usar "sin tipo" para describir un lenguaje cuya especificación formal usa la palabra "tipo" y dice que tiene siete tipos (Indefinido, Nulo, Número, Cadena, Booleano, Símbolo y Objeto) es realmente confuso. La mayoría de la gente no quiere distinguir esta noción de tipo de la definición de PLT.
Ray Toal
4
Su 1. 2. 3.para un idioma sin tipo no coincide con JavaScript. No hay solo un tipo, hay alrededor de 4 a 5. Entonces, ¿cómo demuestra eso que JavaScript no tiene tipo?
Don Cheadle
82

Se puede pensar en fuerte / débil en relación con cómo el compilador, si corresponde, maneja la escritura.

  • Tipeado débilmente significa que el compilador, si corresponde, no impone el tipado correcto. Sin la interjección implícita del compilador, la instrucción generará un error durante el tiempo de ejecución.

    "12345" * 1 === 12345  // string * number => number

    Fuertemente tipado significa que hay un compilador, y quiere una conversión explícita de cadena a entero .

    (int) "12345" * 1 === 12345

    En cualquier caso, algunas características del compilador pueden alterar implícitamente la instrucción durante el tiempo de compilación para realizar conversiones por usted, si puede determinar que es lo correcto.

    Hasta ahora, JavaScript se puede clasificar como no muy tipado. Eso significa que está escrito débilmente o sin escribir.

Se puede pensar en dinámico / estático en relación con cómo las instrucciones del lenguaje manipulan los tipos.

  • Tipeado dinámicamente significa quese aplica el tipodel valor , pero la variable simplemente representa cualquier valor de cualquier tipo.

    x = 12345;    // number
    x = "string"; // string
    x = { key: "value" }; // object
    y = 123 + x; // error or implicit conversion must take place.
    

    Tipado estáticamente significa que eltipo de variable se aplica con fuerza y ​​el tipo de valor no se aplica tanto.

    int x = 12345; // binds x to the type int
    x = "string";  // too late, x is an integer - error
    string y = 123; // error or implicit conversion must take place.
    

    Hasta ahora, JavaScript se puede categorizar como no escrito estáticamente. Además, parece que se escribe dinámicamente, si es que se escribe. Así que necesitamos ver qué significa escribir.

Mecanografiado significa que el lenguaje distingue entre diferentes tipos, como cadena , número , booleano , objeto , matriz , nulo , indefinido ,etc. Además, cada operación está vinculada a tipos específicos. Entonces no puede dividir un número entero por una cadena .

    2 / "blah"  // produces NaN

Sin tipo significa que la operación de dividir un número entero por una cadena daría como resultado tratar los primeros cuatro bytes de la cadena como un número entero . Esto se debe a que las operaciones sin tipo se realizan directamente en bits, no hay tipos para observar. El resultado será algo bastante inesperado:

    2 / "blah"  // will be treated as  2 / 1500275048

Dado que JavaScript se comporta de acuerdo con la definición de Typed, debe ser. Y por lo tanto, debe tener un tipo dinámico y un tipo débil.

Si alguien afirma que JavaScript no tiene tipo, es simplemente para la teoría académica, no para una aplicación práctica.

Gumbo
fuente
1
Pero creo que hay una contradicción en la última declaración. En JavaScript, el resultado de una división de cadena de números enteros está bien definido, para cualquier valor del número entero o cadena. ¡Simplemente no es muy útil!
Deniz Dogan
Si tiene una mejor definición / descripción, no dude en editarla. Por eso lo hice comunidad wiki.
Gumbo
@skurpur: Habías cambiado completamente los significados de tipeo dinámico y débil, lo corrigiste.
Rene Saarsoo
Oh, lo siento, lo editaste mientras yo también lo estaba editando y sobrescribí tus cambios.
Rene Saarsoo
3
-1. Necesitas leer esto .
missingfaktor
48

JavaScript tiene un tipo débil . Ciertamente, no está "sin tipo", pero su naturaleza de tipo débil permite mucha flexibilidad en términos de conversiones implícitas.

Tenga en cuenta que JavaScript también se escribe dinámicamente. Este método de escritura permite lo que se conoce como "escritura pato" .

A modo de comparación, tenga en cuenta que JavaScript no tiene un tipo fuerte ni estático. A veces, comprender qué no es algo puede ayudarlo a ver mejor qué es.

Andrew Hare
fuente
2
-1. Necesitas leer esto .
missingfaktor
3
Esta respuesta es mucho mejor y mucho más precisa que la respuesta más votada.
Alex W
3
@JimboJonny: No es correcto. A menos que esté en presencia de un desarrollador de Ensamblador, no sería demasiado incorrecto afirmar que se escriben todos los idiomas. Sin tipo significa que las únicas operaciones se realizan directamente en la manipulación de bits. Pero considere que Javascript tiene métodos toString () y parseInt (). No escribas mucho más que eso.
Suamere
2
@Suamere - Aquí hay una cita de “Javascript: La guía definitiva” de O'Reilly: “Una diferencia importante entre JavaScript y lenguajes como Java y C es que JavaScript no tiene tipo. Esto significa, en parte, que una variable de JavaScript puede contener un valor de cualquier tipo de datos, a diferencia de una variable de Java o C, que solo puede contener el tipo particular de datos para el que se declara ".
Jimbo Jonny
3
Entonces, si acepta el BS que algún tipo afirma que los académicos usan deliberadamente la palabra "sin tipo" para significar "dinámicamente escrito". Entonces sí, JavaScript no está escrito en todas sus pruebas. Pero si sabe que "sin tipo" se usa incorrectamente para representar idiomas que realmente están "escritos dinámicamente", entonces simplemente llame a los dang idiomas "escritos dinámicamente". tinyurl.com/czhcv54
Suamere
8

Para el punto del autor, JavaScript también se clasifica como de tipo dinámico . Wiki afirma que los lenguajes de tipo dinámico se verifican en tiempo de ejecución en lugar de en un compilador, mientras que los de tipo débil se refieren a la capacidad de cambiar el tipo sobre la marcha dentro de su código. Entonces sí, se escribe dinámicamente Y se escribe débilmente.

Darren Newton
fuente
6

El problema aquí que confunde a muchos programadores es que definiciones como esta no están estandarizadas en alguna parte. El término lenguaje de programación sin tipo es ambiguo. ¿Eso se refiere a un lenguaje que no tiene tipos de datos o un lenguaje que es una variante sin tipo de cálculo lambda ?

JavaScript / ECMAScript tiene un sistema de tipos y todos los dominios de sus funciones aceptarán cualquier tipo de especificación de referencia. Eso significa que JavaScript tiene un solo tipo de datos, en realidad. Esa es una cuestión de implementación que es más importante para los programadores de JavaScript muy avanzados. El programador de JavaScript promedio solo se preocupa por los tipos de datos de lenguaje abstracto que han sido especificados por ECMAScript.

En el contexto del programador cotidiano, no del investigador o informático teórico, el término no tipificado es un nombre inapropiado porque la mayoría de la gente no está haciendo cálculo lambda. Por lo tanto, el término confunde a las masas y parece declarar que JavaScript no tiene ningún tipo de datos, lo que simplemente no es cierto. Cualquiera que haya usado alguna vez typeofsabe que JavaScript tiene sus propios tipos de datos de idioma:

var test = "this is text";
typeof(test);

rendimientos

"cuerda"

ECMAScript define los siguientes tipos de lenguaje: undefined, null, string, boolean, number,object

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Una designación más precisa para JavaScript se escribiría implícitamente, se escribiría dinámicamente o se escribiría débilmente / libremente (o alguna combinación de los mismos), ya que JavaScript usa la coerción de tipos en algunos casos, lo que hace que el tipo sea implícito porque no tiene que especificar explícitamente el tipo de sus variables. Se incluye en la tipificación débil porque, a diferencia de algunos lenguajes que distinguen entre float y integer, etc., solo usa un numbertipo para abarcar todos los números, y hace uso de la coerción de tipo mencionada anteriormente [Sección 9 de ECMAScript Spec] , en fuerte contraste con una lenguaje fuertemente tipado que tendría tipos de datos muy específicos (es decir, tendría que especificar into float).

Las definiciones de lenguajes tipados estática y dinámicamente no están estandarizadas, sin embargo, tampoco lo estaba el tamaño de un byte cuando las computadoras comenzaban a evolucionar. La escritura estática y dinámica se refiere con mayor frecuencia a la presencia de determinadas características del idioma. Uno de los cuales es la verificación de tipos en tiempo de ejecución , o lo que se denomina verificación dinámica de tipos . Si ha usado JavaScript, ya sabe que definitivamente espera hasta el tiempo de ejecución para verificar los tipos, razón por la cual obtiene TypeErrorexcepciones durante la ejecución de su código. Ejemplo aquí

Creo que la respuesta más votada es confundir el polimorfismo de las funciones de JavaScript con funciones que aceptarán literalmente cualquier cosa (como con las variantes no tipificadas de Lambda Calculus), que es una falacia de asociación .

Alex W
fuente
No es un nombre inapropiado, pero el contexto importa, consulte stackoverflow.com/questions/9154388/…
Andreas Rossberg
@AndreasRossberg Es absolutamente es un nombre inapropiado. A lo que te refieres, en tu enlace auto promovido descaradamente , es un sistema de tipos. La razón por la que el término es un nombre inapropiado es porque es ambiguo. La mayoría de los programadores piensan que el tipo de datos, no el sistema de tipos, cuando escuchan sobre un lenguaje sin escribir . Creo que el comentario de Konrad Rudoph realmente lleva este punto a casa.
Alex W
No estoy seguro de por qué le parece "descarado" referirse a mi respuesta anterior en lugar de repetirla aquí. Además, dije claramente que el contexto importa. En contraste con la queja de K. Rudolph, hay definiciones perfectamente consistentes y ampliamente aceptadas de "sistema de tipos" en la literatura, y he citado una. Por supuesto, puede encontrarlos confusos en su contexto, pero eso no los convierte en "nombres inapropiados".
Andreas Rossberg
@AndreasRossberg El contexto es muy importante aquí. La respuesta más votada dice "sin tipo = sin declaraciones de tipo", lo cual es claramente incorrecto. Lo que estoy diciendo es que es un nombre inapropiado en este contexto. Nadie mencionó el cálculo lambda aquí y hacerlo es algo pretencioso en este simple caso.
Alex W
1

Recuerde que JavaScript le permite preguntar qué es typeof(your_variable)y comparar tipos: 5==="5"devoluciones false. Por lo tanto, no creo que pueda llamarlo sin tipo.

Es dinámicamente y (estimado como) débilmente tipado. Es posible que desee saber que usa Duck typing (ver enlace de andrew) y ofrece OOP a través de Prototyping en lugar de clases y herencia.

instancia de mi
fuente
Escribir una variable no tiene nada que ver con la conversión de valores. Tiene que ver con declaraciones de tipos para variables. Javascript no tiene una construcción para esto en absoluto, razón por la cual tan pocos javascripters incluso entienden el concepto, y por qué muchos de ellos malinterpretan la escritura de variables como algo relacionado con la comparación o conversión de tipos de variables. En JS no puede declarar String a = "blah";o var a:String = 'blah';(es decir, variables escritas) EN TODO. Por eso no está mecanografiado.
Jimbo Jonny
0

Mientras está escrito (puede preguntar "typeof someVar" y aprender su tipo específico, es muy débil.

Dado:

  var a = "5";

podría decirse que a es una cadena. Sin embargo, si luego escribe:

  var b = a + 10;

b es un int igual a 15, por lo que a actuó como un int. Por supuesto, luego puede escribir:

  var c = a + "Hello World";

yc será igual a "5Hello World", por lo que a vuelve a actuar como una cadena.

James Curran
fuente
1) ¡Lanzar un valor! = Escribir una variable 2) no es débil, no existe. No puede escribir una variable en javascript.
Jimbo Jonny
Curioso por qué esta respuesta obtuvo dos votos en contra. La definición que encontré sobre escritura débil dice precisamente esto: el tipo de valor se determina en función de cómo se usa.
aioobe
Sin embargo, ¿es esto exacto? Tengo biguales 510: ideone.com/BRcSW7
aioobe