Ho scoperto che alcune persone chiamano JavaScript un linguaggio "digitato in modo dinamico, debolmente", ma alcuni dicono addirittura "non tipizzato"? Qual è veramente?
Ho scoperto che alcune persone chiamano JavaScript un linguaggio "digitato in modo dinamico, debolmente", ma alcuni dicono addirittura "non tipizzato"? Qual è veramente?
Risposte:
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:
A differenza di una lingua digitata:
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:
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?
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.
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.
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.
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 typeof
sa 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 number
tipo 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 int
o 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 TypeError
eccezioni 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 .
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à.
String a = "blah";
o var a:String = 'blah';
(cioè variabili digitate) A TUTTI. Ecco perché non è tipizzato.
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.