JavaScript é uma linguagem sem tipo?


104

Descobri que algumas pessoas chamam o JavaScript de uma linguagem "dinamicamente e fracamente digitada", mas algumas até dizem "não digitada". Qual é realmente?

Respostas:


133

JavaScript não está tipificado:


(fonte: no.gd )

Até Brendan Eich diz isso. No Twitter, ele respondeu a um tópico relacionado a esta pergunta:

... tipos acadêmicos usam "sem tipo" para significar "sem tipos estáticos" ...

Portanto, o problema é que existem algumas definições diferentes de não tipado .

Uma definição foi mencionada em uma das respostas acima - o tempo de execução não marca valores e apenas trata cada valor como bits. JavaScript faz valores de tag e tem comportamento diferente com base nessas tags. Portanto, obviamente, o JavaScript não se encaixa nessa categoria.

A outra definição vem da Teoria da Linguagem de Programação (a coisa acadêmica a que Brendan está se referindo). Nesse domínio, sem tipo significa apenas que tudo pertence a um único tipo .

Por quê? Porque uma linguagem só irá gerar um programa quando puder provar que os tipos estão alinhados (também conhecida como a correspondência de Curry-Howard ; tipos são teoremas, programas são provas). Isso significa em uma linguagem não digitada:

  1. Um programa é sempre gerado
  2. Portanto, os tipos sempre correspondem
  3. Portanto, deve haver apenas um tipo

Em contraste com uma linguagem digitada:

  1. Um programa pode não ser gerado
  2. Porque os tipos podem não corresponder
  3. Porque um programa pode conter vários tipos

Então aí está, em PLT, não tipado significa apenas digitado dinamicamente e digitado apenas significa digitado estaticamente . JavaScript definitivamente não é tipificado nesta categoria.

Veja também:


6
E, claro, "nenhum tipo estático" também não é o mesmo que "nenhuma declaração de tipo".
Andreas Rossberg

+1. Talvez você também deva vincular isso em sua resposta. Este bs de "digitação fraca" é muito difundido.
missingfaktor

2
A Teoria da Linguagem de Programação está correta. A imagem gigante está incorreta.
Alex W

2
Fiquei feliz em ver que esta resposta referenciava a postagem do blog de Harper, mas seria bom se a comunidade PLT abandonasse o termo "não digitado" em favor de "unificado". A definição de "não digitado" que significa "apenas pedaços" realmente faz sentido. Usar "sem tipo" para descrever uma linguagem cuja especificação formal usa a palavra "tipo" e diz que ela tem sete tipos (indefinido, nulo, número, string, booleano, símbolo e objeto) é realmente confuso. A maioria das pessoas não deseja distinguir essa noção de tipo da definição PLT.
Ray Toal

4
Seu 1. 2. 3.para uma linguagem não digitada não corresponde a JavaScript. Não existe apenas um tipo - existem cerca de 4 - 5. Então, como isso demonstra que o JavaScript não está tipado?
Don Cheadle

82

forte / fraco pode ser considerado em relação a como o compilador, se aplicável, lida com a digitação.

  • Tipo fraco significa que o compilador, se aplicável, não impõe a digitação correta. Sem a interjeição implícita do compilador, a instrução apresentará um erro durante o tempo de execução.

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

    Fortemente tipado significa que há um compilador e ele deseja uma conversão explícita de string para inteiro .

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

    Em ambos os casos, alguns recursos do compilador podem alterar implicitamente a instrução durante o tempo de compilação para fazer conversões para você, se puder determinar que é a coisa certa a fazer.

    Até agora, o JavaScript pode ser categorizado como Não fortemente tipado. Isso significa que está mal digitado ou não digitado.

dinâmico / estático pode ser pensado em relação a como as instruções de linguagem manipulam tipos.

  • Digitado dinamicamente significa que otipodo valor é imposto, mas a variável simplesmente representa qualquer valor de qualquer tipo.

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

    Com tipagem estática significa que otipo de variável é fortemente imposto e o tipo de valor é menos imposto.

    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.
    

    Até agora, o JavaScript pode ser classificado como Não estático. Além disso, parece ser digitado dinamicamente, se for digitado. Portanto, precisamos ver o que significa digitação.

Digitado significa que a linguagem distingue entre diferentes tipos, como string , número , booleano , objeto , array , nulo , indefinido e assim por diante. Além disso, cada operação está vinculada a tipos específicos. Portanto, você não pode dividir um inteiro por uma string .

    2 / "blah"  // produces NaN

Sem tipo significa que a operação de divisão de inteiro por string resultaria no tratamento dos primeiros quatro bytes da string como inteiros . Isso ocorre porque as operações sem tipo ocorrem diretamente nos bits, não há tipos a serem observados. O resultado será algo bastante inesperado:

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

Visto que o JavaScript se comporta de acordo com a definição de ser digitado, ele deve ser. E, portanto, deve ser digitado dinamicamente e fracamente.

Se alguém afirma que o JavaScript não é tipado, é apenas para teoria acadêmica, não para aplicação prática.


1
Mas acho que há uma contradição na última afirmação. Em JavaScript, o resultado de uma divisão de string inteiro é bem definido, para qualquer valor do inteiro ou string. Simplesmente não é muito útil!
Deniz Dogan

Se você tiver uma definição / descrição melhor, sinta-se à vontade para editá-la. É por isso que o tornei wiki da comunidade.
Gumbo

@skurpur: Você trocou completamente os significados de digitação Dinâmica e Fraca - corrigiu isso.
Rene Saarsoo

Oh, desculpe, você editou enquanto eu também estava editando e sobrescrevi suas alterações.
Rene Saarsoo

3
-1. Você precisa ler isso .
missingfaktor

48

JavaScript é mal digitado . Certamente não é "sem tipo", mas sua natureza fracamente digitada permite muita flexibilidade em termos de conversões implícitas.

Lembre-se de que o JavaScript também é digitado dinamicamente. Este método de digitação permite o que é conhecido como "digitação de pato" .

Para comparação, considere que o JavaScript não é fortemente tipado nem estático. Às vezes, entender o que algo não é pode ajudá-lo a ver melhor o que é.


2
-1. Você precisa ler isso .
missingfaktor

3
Essa resposta é muito melhor e muito mais precisa do que a resposta mais votada.
Alex W

3
@JimboJonny: Incorreto. A menos que na presença de um desenvolvedor de Assembly, não seria muito incorreto afirmar que todos os idiomas são digitados. Sem tipo significa que as únicas operações são diretamente sobre a manipulação de bits. Mas considere que o Javascript tem os métodos toString () e parseInt (). Não digite muito mais do que isso.
Suamere

2
@Suamere - Aqui está uma citação de “Javascript: The Definitive Guide” de O'Reilly: “Uma diferença importante entre JavaScript e linguagens como Java e C é que o JavaScript não tem tipo. Isso significa, em parte, que uma variável JavaScript pode conter um valor de qualquer tipo de dados, ao contrário de uma variável Java ou C, que pode conter apenas um tipo específico de dados para o qual é declarada. ”
Jimbo Jonny

3
Então, se você acreditar no BS, um cara afirma que os acadêmicos usam propositalmente a palavra "não digitados" para significar "digitados dinamicamente". Então sim, JavaScript não é tipificado por todas as suas provas. Mas se você sabe que "não tipado" é incorretamente usado para representar linguagens que são realmente "tipadas dinamicamente", então apenas chame as linguagens dang de "tipadas dinamicamente". tinyurl.com/czhcv54
Suamere

8

Na opinião do autor, o JavaScript também é classificado como digitado dinamicamente . O Wiki afirma que as linguagens dinamicamente digitadas são verificadas por tipo em tempo de execução, em vez de em um compilador, enquanto a Digitação Fraca refere-se à capacidade de alterar o tipo em tempo real em seu código. Então, sim, ele é digitado dinamicamente E fracamente.


6

O problema aqui que está confundindo muitos programadores é que definições como essa não são padronizadas em algum lugar. O termo linguagem de programação sem tipo é ambíguo. Isso se refere a uma linguagem que não possui tipos de dados ou a uma linguagem que é uma variante sem tipo de cálculo lambda ?

JavaScript / ECMAScript tem um sistema de tipos e todos os domínios de suas funções aceitarão qualquer tipo de especificação de referência. Isso significa que o JavaScript tem um único tipo de dados, na realidade. Essa é uma questão de implementação que é mais importante para os programadores JavaScript muito avançados. O programador de JavaScript médio só se preocupa com os tipos de dados da linguagem abstrata que foram especificados pelo ECMAScript.

No contexto do programador cotidiano, não do pesquisador ou cientista da computação teórico, o termo não digitado é um nome impróprio porque a maioria das pessoas não está fazendo cálculo lambda. Assim, o termo confunde as massas e parece declarar que o JavaScript não tem nenhum tipo de dados, o que simplesmente não é verdade. Qualquer pessoa que já usou typeofsabe que JavaScript tem seus próprios tipos de dados de linguagem:

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

rendimentos

"corda"

ECMAScript define os seguintes tipos para o idioma: undefined, null, string, boolean, number,object

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

Uma designação mais precisa para JavaScript seria digitada implicitamente, digitada dinamicamente ou fracamente / vagamente digitada (ou alguma combinação disso), em que JavaScript usa coerção de tipo em alguns casos, o que torna o tipo implícito porque você não tem que especificar explicitamente o tipo de suas variáveis. Ele se enquadra na tipagem fraca porque, ao contrário de algumas linguagens que distinguem entre float e inteiro etc, ele apenas usa um numbertipo para abranger todos os números e faz uso da coerção de tipo mencionada anteriormente [Seção 9 das especificações ECMAScript] , em forte contraste com um linguagem fortemente tipada que teria tipos de dados muito específicos (ou seja, você teria que especificar intou float).

As definições de linguagens tipadas estaticamente e dinamicamente não são padronizadas, mas o tamanho de um byte também não era normal quando os computadores estavam começando a evoluir. A tipagem estática e dinâmica geralmente se refere à presença de certos recursos de linguagem. Uma delas é a verificação de tipo em tempo de execução , ou o que é chamado de verificação dinâmica de tipo . Se você usou JavaScript, já sabe que ele definitivamente espera até o tempo de execução para verificar os tipos, e é por isso que você obtém TypeErrorexceções durante a execução do seu código. Exemplo aqui

Acho que a resposta mais votada está confundindo o polimorfismo das funções JavaScript com funções que aceitarão literalmente qualquer coisa (como as variantes não digitadas do cálculo Lambda), o que é uma falácia de associação .


Não é um nome impróprio, mas o contexto é importante, consulte stackoverflow.com/questions/9154388/…
Andreas Rossberg

@AndreasRossberg É absolutamente é um equívoco. Aquilo a que você se refere, em seu link autopromovido descaradamente , é um sistema de tipos. O motivo pelo qual o termo é um nome impróprio é porque ele é ambíguo. A maioria dos programadores pensa em tipo de dados, não em sistema de tipo, quando ouve falar de uma linguagem não digitada . Acho que o comentário de Konrad Rudoph realmente mostra esse ponto.
Alex W

Não sei por que você acha "vergonhoso" referir-se à minha resposta anterior em vez de repeti-la aqui. Além disso, eu disse claramente que o contexto é importante. Em contraste com a reclamação de K. Rudolph, existem definições perfeitamente consistentes e amplamente aceitas de "sistema de tipos" na literatura, e eu citei uma. Claro, você é livre para considerá-los confusos em seu contexto, mas isso não os torna "equivocados".
Andreas Rossberg

@AndreasRossberg O contexto é muito importante aqui. A resposta mais votada diz "sem tipo = sem declarações de tipo", o que é claramente incorreto. O que estou dizendo é que é um nome impróprio, neste contexto. Ninguém mencionou cálculo lambda aqui e fazer isso é um tanto pretensioso neste caso simples.
Alex W

1

Lembre-se de que o JavaScript permite que você pergunte o que é typeof(your_variable)e compare os tipos: 5==="5"retorna false. Portanto, não acho que você possa chamá-lo de não digitado.

Ele é dinamicamente e (estimado como) fracamente digitado. Você pode querer saber que ele usa a digitação Duck (veja o link de Andrew) e oferece OOP por meio de prototipagem em vez de classes e herança.


A digitação de uma variável não tem nada a ver com a conversão de valores. Tem a ver com declarações de tipos de variáveis. Javascript não tem uma construção para isso, razão pela qual tão poucos javascripters sequer entendem o conceito, e por que tantos deles interpretam incorretamente a tipagem de variável como algo relacionado à comparação ou conversão de tipos de variáveis. Em JS você não pode declarar String a = "blah";ou var a:String = 'blah';(isto é, variáveis ​​digitadas) AT ALL. É por isso que não foi tipado.
Jimbo Jonny

0

Enquanto é digitado (você pode perguntar "typeof someVar" e aprender seu tipo específico, é muito fraco.

Dado:

  var a = "5";

você pode dizer que a é uma string. No entanto, se você escrever:

  var b = a + 10;

b é um int igual a 15, então a agiu exatamente como um int. Claro, você pode escrever:

  var c = a + "Hello World";

ec será igual a "5Hello World", então a está agindo novamente como uma string.


1) Fundir um valor! = Digitar uma variável 2) não é fraco, é inexistente. Você não pode digitar uma variável em javascript.
Jimbo Jonny

Curioso por que essa resposta obteve dois votos negativos. A definição que encontrei sobre tipagem fraca diz exatamente isso: O tipo de um valor é determinado com base em como ele é usado.
aioobe,

Isso é preciso? Recebo biguais 510: ideone.com/BRcSW7
aioobe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.