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?
fuente
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?
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:
En contraste con un lenguaje mecanografiado:
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:
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?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.
Fuertemente tipado significa que hay un compilador, y quiere una conversión explícita de cadena a entero .
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.
Tipado estáticamente significa que eltipo de variable se aplica con fuerza y el tipo de valor no se aplica tanto.
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 .
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:
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.
fuente
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.
fuente
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.
fuente
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
typeof
sabe que JavaScript tiene sus propios tipos de datos de idioma:rendimientos
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
number
tipo 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 especificarint
ofloat
).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
TypeError
excepciones 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 .
fuente
Recuerde que JavaScript le permite preguntar qué es
typeof(your_variable)
y comparar tipos:5==="5"
devolucionesfalse
. 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.
fuente
String a = "blah";
ovar a:String = 'blah';
(es decir, variables escritas) EN TODO. Por eso no está mecanografiado.Mientras está escrito (puede preguntar "typeof someVar" y aprender su tipo específico, es muy débil.
Dado:
podría decirse que a es una cadena. Sin embargo, si luego escribe:
b es un int igual a 15, por lo que a actuó como un int. Por supuesto, luego puede escribir:
yc será igual a "5Hello World", por lo que a vuelve a actuar como una cadena.
fuente
b
iguales510
: ideone.com/BRcSW7