JavaScript è un linguaggio non tipizzato?


104

Ho scoperto che alcune persone chiamano JavaScript un linguaggio "digitato in modo dinamico, debolmente", ma alcuni dicono addirittura "non tipizzato"? Qual è veramente?

Risposte:


133

JavaScript non è tipizzato:


(fonte: no.gd )

Lo dice anche Brendan Eich. Su Twitter, ha risposto a un thread che si collegava a questa domanda:

... i tipi accademici usano "untyped" per indicare "nessun tipo statico" ...

Quindi il problema è che ci sono alcune definizioni diverse di non tipizzato .

Una definizione è stata discussa in una delle risposte precedenti: il runtime non tagga i valori e tratta semplicemente ogni valore come bit. JavaScript fa i valori delle variabili e ha un comportamento diverso in base a tali tag. Quindi JavaScript ovviamente non rientra in questa categoria.

L'altra definizione proviene dalla teoria del linguaggio di programmazione (la cosa accademica a cui si riferisce Brendan). In questo dominio, untyped significa semplicemente che tutto appartiene a un singolo tipo .

Perché? Perché un linguaggio genererà un programma solo quando potrà dimostrare che i tipi si allineano (ovvero la corrispondenza di Curry-Howard ; i tipi sono teoremi, i programmi sono prove). Ciò significa in una lingua non tipizzata:

  1. Viene sempre generato un programma
  2. Pertanto i tipi corrispondono sempre
  3. Quindi deve esserci un solo tipo

A differenza di una lingua digitata:

  1. Potrebbe non essere stato generato un programma
  2. Perché i tipi potrebbero non corrispondere
  3. Perché un programma può contenere più tipi

Quindi ecco fatto, in PLT, untyped significa solo digitato dinamicamente e digitato significa solo digitato staticamente . JavaScript è decisamente non tipizzato in questa categoria.

Guarda anche:


6
E, naturalmente, "nessun tipo statico" non è la stessa cosa di "nessuna dichiarazione di tipo".
Andreas Rossberg

+1. Forse dovresti anche collegare questo nella tua risposta. Questo bs "debolmente tipizzato" è troppo diffuso.
missingfaktor

2
La teoria del linguaggio di programmazione è corretta. Lo screenshot gigante non è corretto.
Alex W

2
Sono stato contento di vedere che questa risposta fa riferimento al post del blog di Harper, ma sarebbe bello se la comunità PLT abbandonasse "untyped" a favore di "unityped". La definizione di "non tipizzato" che significa "solo bit" ha effettivamente un senso. Usare "untyped" per descrivere un linguaggio la cui specifica formale utilizza la parola "tipo" e dice che ha sette tipi (Undefined, Null, Number, String, Boolean, Symbol e Object) è davvero fonte di confusione. La maggior parte delle persone non vuole distinguere questa nozione di tipo dalla definizione PLT.
Ray Toal

4
Il tuo 1. 2. 3.per una lingua non tipizzata non corrisponde a JavaScript. Non esiste un solo tipo - ce ne sono circa 4 - 5. Allora come dimostra che JavaScript non è tipizzato?
Don Cheadle

82

forte / debole può essere pensato in relazione a come il compilatore, se applicabile, gestisce la digitazione.

  • Se digitato in modo debole , il compilatore, se applicabile, non impone la digitazione corretta. Senza l'interiezione implicita del compilatore, l'istruzione andrà in errore durante il runtime.

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

    Fortemente tipizzato significa che c'è un compilatore e vuole che tu faccia un cast esplicito da stringa a intero .

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

    In entrambi i casi, alcune funzionalità del compilatore possono alterare implicitamente l'istruzione durante la compilazione per eseguire le conversioni per te, se è in grado di determinare che è la cosa giusta da fare.

    Finora, JavaScript può essere classificato come non tipizzato. Ciò significa che è debolmente digitato o non digitato.

dinamico / statico può essere pensato in relazione a come le istruzioni del linguaggio manipolano i tipi.

  • Digitato dinamicamente significa che iltipodel valore viene applicato, ma la variabile rappresenta semplicemente qualsiasi valore di qualsiasi tipo.

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

    Digitato staticamente significa che iltipo di variabile è fortemente applicato e il tipo di valore è applicato meno.

    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.
    

    Finora, JavaScript può essere classificato come non digitato staticamente. Inoltre, sembra essere digitato dinamicamente, se digitato affatto. Quindi dobbiamo vedere cosa significa Digitazione.

Digitato significa che la lingua distingue tra diversi tipi come stringa , numero , booleano , oggetto , matrice , null , undefined e così via. Inoltre ogni operazione è vincolata a tipologie specifiche. Quindi non puoi dividere un numero intero per una stringa .

    2 / "blah"  // produces NaN

Untyped significa che l'operazione di divisione dell'intero per stringa risulterebbe nel trattare i primi quattro byte della stringa come numero intero . Questo perché le operazioni non tipizzate avvengono direttamente sui bit, non ci sono tipi da osservare. Il risultato sarà qualcosa di abbastanza inaspettato:

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

Poiché JavaScript si comporta in base alla definizione di essere digitato, deve essere. E quindi deve essere digitato dinamicamente e debolmente.

Se qualcuno afferma che JavaScript è untyped, è solo per teoria accademica, non per applicazione pratica.


1
Ma penso che ci sia una contraddizione nell'ultima affermazione. In JavaScript, il risultato di una divisione stringa intera è ben definito, per qualsiasi valore dell'intero o della stringa. Semplicemente non è molto utile!
Deniz Dogan

Se hai una definizione / descrizione migliore, sentiti libero di modificarla. Ecco perché l'ho creato wiki della comunità.
Gumbo

@skurpur: avevi completamente scambiato i significati di digitazione dinamica e debole, corretto.
Rene Saarsoo

Oh, scusa, l'hai modificato mentre io lo stavo modificando e ho sovrascritto le tue modifiche.
Rene Saarsoo,

3
-1. Devi leggere questo .
missingfaktor

48

JavaScript è digitato in modo debole . Sicuramente non è "non tipizzato" ma la sua natura debolmente tipizzata consente molta flessibilità in termini di conversioni implicite.

Tieni presente che JavaScript è anche digitato dinamicamente. Questo metodo di digitazione consente la cosiddetta "digitazione a papera" .

Per fare un confronto, considera che JavaScript non è tipizzato fortemente né è tipizzato staticamente. A volte capire cosa non è può aiutarti a vedere meglio di cosa si tratta.


2
-1. Devi leggere questo .
missingfaktor

3
Questa risposta è molto migliore e molto più accurata della risposta votata in alto.
Alex W

3
@JimboJonny: Non corretto. A meno che in presenza di uno sviluppatore di assembly, non sarebbe troppo errato affermare che ogni lingua è digitata. Untyped significa che le uniche operazioni sono direttamente sulla manipolazione dei bit. Ma considera che Javascript ha i metodi toString () e parseInt (). Non scrivere molto di più di così.
Suamere

2
@ Suamere - Ecco una citazione da "Javascript: The Definitive Guide" di O'Reilly: "Una differenza importante tra JavaScript e linguaggi come Java e C è che JavaScript non è tipizzato. Ciò significa, in parte, che una variabile JavaScript può contenere un valore di qualsiasi tipo di dati, a differenza di una variabile Java o C, che può contenere solo un particolare tipo di dati per cui è dichiarata. "
Jimbo Jonny

3
Quindi, se credi nel BS che alcuni tizi affermano che gli accademici usano intenzionalmente la parola "non tipizzato" per significare "digitato dinamicamente". Allora sì, JavaScript non è tipizzato da tutte le tue prove. Ma se sai che "untyped" è usato in modo errato per rappresentare lingue che sono veramente "dinamicamente digitate", allora chiama semplicemente le lingue dang "dinamicamente digitate". tinyurl.com/czhcv54
Suamere

8

Secondo l'autore JavaScript è anche classificato come tipizzato dinamicamente . Wiki afferma che i linguaggi digitati dinamicamente vengono controllati in fase di esecuzione anziché in un compilatore mentre Weakly Typed si riferisce alla possibilità di cambiare tipo al volo all'interno del codice. Quindi sì, è sia digitato dinamicamente che debolmente.


6

Il problema qui che confonde molti programmatori è che definizioni come questa non sono standardizzate da qualche parte. Il termine linguaggio di programmazione non tipizzato è ambiguo. Si riferisce a una lingua che non ha tipi di dati o una lingua che è una variante non tipizzata di lambda calcolo ?

JavaScript / ECMAScript ha un sistema di tipi e tutti i domini delle sue funzioni accetteranno qualsiasi tipo di specifica di riferimento. Ciò significa che JavaScript ha un unico tipo di dati, in realtà. Questa è una questione di implementazione che è più importante per i programmatori JavaScript molto avanzati. Il programmatore JavaScript medio si preoccupa solo dei tipi di dati del linguaggio astratto che sono stati specificati da ECMAScript.

Nel contesto del programmatore quotidiano, non del ricercatore o dell'informatico teorico, il termine non tipizzato è un termine improprio perché la maggior parte delle persone non sta facendo lambda calcolo. Quindi il termine confonde le masse e sembra dichiarare che JavaScript non ha alcun tipo di dati che semplicemente non è vero. Chiunque abbia mai usato typeofsa che JavaScript ha i propri tipi di dati di linguaggio:

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

i rendimenti

"corda"

ECMAScript definisce i seguenti tipi per la lingua: undefined, null, string, boolean, number,object

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

Una designazione più accurata per JavaScript sarebbe tipizzata in modo implicito, tipizzata dinamicamente o debolmente / debolmente (o una loro combinazione), in quanto JavaScript utilizza la coercizione del tipo in alcuni casi che rende il tipo implicito perché non è necessario specificare esplicitamente il tipo delle tue variabili. Rientra in una tipizzazione debole perché, a differenza di alcuni linguaggi che distinguono tra float e integer ecc., Utilizza solo un numbertipo per racchiudere tutti i numeri e fa uso della coercizione di tipo menzionata in precedenza [Sezione 9 di ECMAScript Spec] , in forte contrasto con una linguaggio fortemente tipizzato che avrebbe tipi di dati molto specifici (cioè dovresti specificare into float).

Le definizioni di linguaggi tipizzati staticamente e dinamicamente non sono standardizzati, tuttavia nemmeno la dimensione di un byte quando i computer stavano cominciando ad evolversi. La digitazione statica e dinamica si riferisce molto spesso alla presenza di determinate caratteristiche del linguaggio. Uno dei quali è il controllo del tipo in fase di esecuzione , o quello che viene chiamato controllo dinamico del tipo . Se hai utilizzato JavaScript, sai già che attende sicuramente il runtime per controllare i tipi, motivo per cui ricevi TypeErroreccezioni durante l'esecuzione del tuo codice. Esempio qui

Penso che la risposta più votata sia confondere il polimorfismo delle funzioni JavaScript con funzioni che accetteranno letteralmente qualsiasi cosa (come con le varianti non tipizzate di Lambda Calculus) che è un errore di associazione .


Non è un termine improprio, ma il contesto è importante, vedi stackoverflow.com/questions/9154388/…
Andreas Rossberg

@AndreasRossberg E 'assolutamente è un termine improprio. Quello a cui ti riferisci, nel tuo link spudoratamente auto-promosso , è un sistema di tipi. Il motivo per cui il termine è un termine improprio è perché è ambiguo. La maggior parte dei programmatori pensa che il tipo di dati non digiti system quando sente parlare di un linguaggio non tipizzato . Penso che il commento di Konrad Rudoph porti davvero a casa questo punto.
Alex W

Non sono sicuro del motivo per cui trovi "spudorato" fare riferimento alla mia risposta precedente invece di ripeterlo qui. Inoltre, ho detto chiaramente che il contesto è importante. In contrasto con la lamentela di K. Rudolph, in letteratura ci sono definizioni perfettamente coerenti e ampiamente accettate di "sistema di tipi", e ne ho citata una. Ovviamente sei libero di trovarli confusi nel tuo contesto, ma questo non li rende "nomi impropri".
Andreas Rossberg

@AndreasRossberg Il contesto è molto importante qui. La risposta più votata dice "untyped = nessuna dichiarazione di tipo" che è chiaramente errata. Quello che sto dicendo è che è un termine improprio, in questo contesto. Nessuno ha menzionato il lambda calcolo qui e farlo è un po 'pretenzioso in questo semplice caso.
Alex W

1

Ricorda che JavaScript ti consente di chiedere qual è typeof(your_variable)e confrontare i tipi: 5==="5"ritorni false. Quindi non penso che tu possa chiamarlo non tipizzato.

È dinamicamente e (stimato come) debolmente tipizzato. Potresti voler sapere che utilizza la digitazione Duck (vedi il collegamento di andrew) e offre OOP tramite prototipazione invece di classi ed ereditarietà.


La digitazione di una variabile non ha nulla a che fare con il casting dei valori. Ha a che fare con le dichiarazioni di tipi per le variabili. Javascript non ha affatto un costrutto per questo, motivo per cui così pochi javascripters comprendono anche il concetto e perché così tanti di loro interpretano erroneamente la tipizzazione delle variabili come qualcosa che ha a che fare con il confronto o il cast di tipi di variabili. In JS non puoi dichiarare String a = "blah";o var a:String = 'blah';(cioè variabili digitate) A TUTTI. Ecco perché non è tipizzato.
Jimbo Jonny

0

Mentre è scritto (puoi chiedere "typeof someVar" e imparare il suo tipo specifico, è molto debole.

Dato:

  var a = "5";

potresti dire che a è una stringa. Tuttavia, se poi scrivi:

  var b = a + 10;

b è un int uguale a 15, quindi a ha agito proprio come un int. Certo, puoi quindi scrivere:

  var c = a + "Hello World";

ec sarà uguale a "5 Hello World", quindi a si comporta di nuovo come una stringa.


1) Casting a value! = Digitando una variabile 2) non è debole, è inesistente. Non puoi digitare una variabile in javascript.
Jimbo Jonny

Curioso perché questa risposta ha ottenuto due voti negativi. La definizione che ho trovato sulla digitazione debole dice esattamente questo: il tipo di un valore è determinato in base a come viene utilizzato.
aioobe

Ma è accurato? Ottengo bpari 510: ideone.com/BRcSW7
aioobe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.