Post on 10-Feb-2016
description
Linguagem JavaScript
Programação na Internet Secção de Sistemas e Tecnologias de Informação
ISEL-DEETC-LEICLuis Falcão - lfalcao@cc.isel.ipl.pt
Carlos Guedes – cguedes@cc.isel.ipl.ptNuno Datia – datia@isel.ipl.pt
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
2Linguagem Javascript
Autores e contributos• Autores
– Jorge Martins– Carlos Guedes
• Contributos– Luís Falcão– Paulo Pereira– Pedro Félix
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
3Linguagem Javascript
História da JavaScript• Desenvolvida por Brendan Eich da Netscape, como a linguagem de script
para páginas no Netscape2
• Versão Standard actual: ECMAScript - Edition 3 – http
://www.ecma-international.org/publications/standards/Ecma-262.htm
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
4Linguagem Javascript
Tipos de dados
• Notas sobre o sistema de tipos:– Não existe tipo inteiro
• Divisão entre dois números produz número real (fraccional)– Não existe tipo para representar caracteres
• Um carácter é uma string de dimensão 1
Tipo Nome do tipo Descrição
Primitivos
Boolean Tipo lógico
Number Vírgula flutuante a 64 bit
String Sequência de zero ou mais caracteres Unicode. Strings literais são delimitadas por "" (aspas) ou por '' (plicas)
Objectos Tudo, excepto os tipos primitivos, são objectos
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
5Linguagem Javascript
Valores primitivos
Tipo valor Descrição Exemplo
Booleantrue Valor lógico verdadeiro var b = true;
false Valor lógico falso var b = false;
Number
NaN
Not a Number é o resultado de uma expressão com um operando que não pode ser convertido em valor numérico
var a = NaN;var a = 10 / "x"; // a assume valor NaN
Infinity Representação de um valor infinito
var a = Infinity;var a = 10/ 0; // a assume valor Infinity
undefined conteúdo de variáveis não iniciadas
var a;// a assume valor undefined
nullrepresenta o não valor, ou seja a inexistência de valor associado a uma variável
var a = null;// x tem um não valor, ou seja null
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
6Linguagem Javascript
Literais• Em JavaScript os literais são usados para representar valores. Chamam-se
literais por que são colocados literalmente no texto do programa. Existem os seguintes formatos literais:
Números (Numbers)Ex: 42, 0xFFF, -345. Literais booleanosEx: true, false. Literais floating-pointEx: 3.1415, -3.1E12, .1e12, 2E-12 Cadeias de caracteres (strings) literaisEx: "one line \n another line" 'another string literal' Arrays literaisEx: ["French Roast", "Columbian", "Kona"]Ex: ["Lion", , "Angel"] Objectos literaisapresentados mais tarde
É possível omitir valores do array colocando vírgulas sem expressão associada. Essas posições do array ficam com valor null
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
7Linguagem Javascript
Objectos• Em JavaScript um objecto é um contentor de pares nome/valor, ou seja é
uma “hashtable”• Suporta duas formas de acesso para leitura e escrita de valores
– Subscript notation e dot notation– Na dot notation é necessário que a chave seja um identificador válido
em JavaScript// Afecta a variável 'myHashtable' com uma referência para uma nova hashtablevar myHashtable = { }; // O mesmo que na linha anterior, mas com notação semelhante ao Javavar myHashtable = new Object(); myHashtable["name"] = "Carlos Guedes"; // subscript notationmyHashtable.salaCCISEL = 8; // dot notation
var s = myHashtable["salaCCISEL"]; alert("s = " + s);var n = myHashtable.name; alert("n = " + n);
// Sintaxe da instrução for para enumeração das "chaves" (nome das // propriedades) do objectofor(var key in myHashtable) { document.writeln("<p>" + key + ": " + myHashtable[key] + "</p>");}
// Afecta a variável 'myHashtable' com uma referência para uma nova hashtablevar myHashtable = { }; // O mesmo que na linha anterior, mas com notação semelhante ao Javavar myHashtable = new Object(); myHashtable["name"] = "Carlos Guedes"; // subscript notationmyHashtable.salaCCISEL = 8; // dot notation
var s = myHashtable["salaCCISEL"]; alert("s = " + s);var n = myHashtable.name; alert("n = " + n);
// Sintaxe da instrução for para enumeração das "chaves" (nome das // propriedades) do objectofor(var key in myHashtable) { document.writeln("<p>" + key + ": " + myHashtable[key] + "</p>");}
var myHashtable = { };var myHashtable = new Object();var myHashtable = { };var myHashtable = new Object();
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
8Linguagem Javascript
Objectos – notação literal• Outra forma de criar objectos é através da notação literal
– Forma compacta de criar objectos• A descrição de um objecto é um conjunto de pares nome-valor separados por
vírgula, dentro de chavetas. – Os nomes podem ser identificadores ou strings seguidos de ':' (dois pontos). Devido a um
erro na definição da linguagem, as palavras reservadas da linguagem não podem ser usadas na forma de identificadores, mas podem ser usados na forma de string.
– Os valores podem ser literais ou expressões de qualquer tipo.
var myHashtable = { name : "Carlos Guedes", salaCCISEL : 8 };
return { event: event, op: event.type, to: event.srcElement, x: event.clientX + document.body.scrollLeft, y: event.clientY + document.body.scrollTop};
var emptyObject = { };
var myHashtable = { name : "Carlos Guedes", salaCCISEL : 8 };
return { event: event, op: event.type, to: event.srcElement, x: event.clientX + document.body.scrollLeft, y: event.clientY + document.body.scrollTop};
var emptyObject = { };
• Os objectos literais são a base do formato JavaScript Object Notation (JSON)
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
9Linguagem Javascript
Arrays (1)
• São objectos, logo hash tables• São esparsos e heterogéneos• Não é necessário indicar a dimensão na construção• Crescem automaticamente (como vectores em java ou ArrayList e .NET)• Os valores são obtidos através de uma chave numérica (para as posições do array,
para as restantes chaves é usada a notação normal dos objectos)• A principal diferença relativamente aos objectos é a existência da propriedade
length– Tem um valor superior em uma unidade ao maior índice atribuído
• Índices começam em 0• Não são tipificados• Quando um novo item é adicionado a uma posição ‘n’ superior à maior existente, a
propriedade length fica com o valor ‘n’+1• Suportam duas formas de criação: literal e comum para objectos
var arr1 = [ ];var arr2 = new Array();var arr1 = [ ];var arr2 = new Array();
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
10Linguagem Javascript
Arrays (2)// Criação de arraysvar myArray = []; // notação literalvar myArray = new Array(); // notação de objecto (igual à linha anterior)var arrayWithSize = new Array(10); // O Array é iniciado 10 valores undefined
// Notação literalvar myList = ['oats', 'peas', 'beans', 'barley'];var month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];var slides = [ {url: 'slide0001.html', title: 'Looking Ahead'}, {url: 'slide0021.html', title: 'Summary', soccerClub: 'SLB'},
5];
// Adição de um elemento por afectaçãomyList[i + 6] = "SLB";
// Exemplovar diasDaSemana = [ "domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado" ];var dias = "";for(var i = 0; i < diasDaSemana.length; ++i) dias += diasDaSemana[i] + "\n"; alert(dias);
// Criação de arraysvar myArray = []; // notação literalvar myArray = new Array(); // notação de objecto (igual à linha anterior)var arrayWithSize = new Array(10); // O Array é iniciado 10 valores undefined
// Notação literalvar myList = ['oats', 'peas', 'beans', 'barley'];var month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];var slides = [ {url: 'slide0001.html', title: 'Looking Ahead'}, {url: 'slide0021.html', title: 'Summary', soccerClub: 'SLB'},
5];
// Adição de um elemento por afectaçãomyList[i + 6] = "SLB";
// Exemplovar diasDaSemana = [ "domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado" ];var dias = "";for(var i = 0; i < diasDaSemana.length; ++i) dias += diasDaSemana[i] + "\n"; alert(dias);
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
11Linguagem Javascript
Funções (1)• Funções em JavaScript são como as funções da linguagem C
– Na chamada a funções não é necessário passar todos os parâmetros indicados na definição da função
– Os parâmetros actuais em falta ficam com valor undefined– Os parâmetros actuais adicionais estão acessíveis via array arguments
• Facilita a criação de funções com parâmetros opcionais
– Suportam a definição de funções internas– Em JavaScript as funções são “first class objects”
• Podem ser guardados em objectos e passados como parâmetros
// Função de recebe qualquer número de argumentosfunction sum() { var total = 0; for (var i = 0; i < arguments.length; ++i) { total += arguments[i]; } return total;}
// Função de recebe qualquer número de argumentosfunction sum() { var total = 0; for (var i = 0; i < arguments.length; ++i) { total += arguments[i]; } return total;}
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
12Linguagem Javascript
Funções (2)• Existem três formas de definir funções
• operador function– Operador prefixo que produz um objecto função– O nome é opcional
• Útil para realizar funções recursivas• Quando é omitido a função designa-se por função anónima• Útil quando é necessário passar uma função como parâmetro (callbacks)
function name (argumentList) blockfunction name (argumentList) block
function visitInArray(arrayObject, observer) { for(var i = 0; i < arrayObject.length; ++i) { var elem = arrayObject[i]; if(typeof(elem) == "number") observer(elem); }}
visitInArray([1, 2, "3", 4, 5], function (x) { alert(x * x); });
function visitInArray(arrayObject, observer) { for(var i = 0; i < arrayObject.length; ++i) { var elem = arrayObject[i]; if(typeof(elem) == "number") observer(elem); }}
visitInArray([1, 2, "3", 4, 5], function (x) { alert(x * x); });
Utilização de uma função anónima (function operator)
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
13Linguagem Javascript
Funções (3)
• Instrução function
– Cria uma função, com determinado nome, no contexto actual– É possível criar funções dentro de outras (ver mais em Closures)– É uma forma compacta de utilização do function operator (com nome)
• Construtor de function
– Recebe strings com os argumentos e o corpo da função, retornado um objecto função
• Não é fácil definir o corpo da função em termos de uma string– Principalmente quando este tem strings
• É ineficiente, pois é necessário ser compilada de cada vez que é utilizada
function name (argumentList) blockfunction name (argumentList) block
var name = function name (argumentlist) block ;var name = function name (argumentlist) block ;
new Function(strings...)new Function(strings...)
! Esta forma não deve ser utilizada !
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
14Linguagem Javascript
Objectos e a keyword this• Uma função é um objecto (logo, uma hashtable)• Pode conter membros (propriedades)
– Pode conter os seus próprios dados– Pode ter o papel de classe, de construtor e de contentora de métodos
relacionados– Pode ser membro de outro objecto (quando é membro de um objecto designa-
se de método)– Existe uma variável de nome this que contém a referência para o objecto
usado para chamar a função
– Numa chamada “global”, this é uma referência para o Objecto Global
foo.bar(); // em bar, this é foodo.re.mi.fa(); // em fa o objecto é do.re.mifoo.bar(); // em bar, this é foodo.re.mi.fa(); // em fa o objecto é do.re.mi
function f1() { . . . };f1(); // em f1, this é o Objecto Globalfunction f1() { . . . };f1(); // em f1, this é o Objecto Global
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
15Linguagem Javascript
Funções Construtoras• As funções usadas na iniciação de objectos são designadas de “Funções Construtoras”• Numa chamada a uma função construtora, a sequência de chamadas é ligeiramente
diferente de uma chamada normal– A chamada é realizada com o operador prefixo new– O operador new altera o significado de this na função.
Nesta situação representa o objecto que foi criado // Definição de um Pontofunction Point(x,y1) { this.x = x; this.y = y1; this.add = function(p) { this.x += p.x; this.y += p.y; return this; }}
// Testevar p = new Point(2,3);var p1 = new Point(4,5);p.add(p1); // p.x = 6; p.y = 8;
// Definição de um Pontofunction Point(x,y1) { this.x = x; this.y = y1; this.add = function(p) { this.x += p.x; this.y += p.y; return this; }}
// Testevar p = new Point(2,3);var p1 = new Point(4,5);p.add(p1); // p.x = 6; p.y = 8;
• O construtor do objecto deve iniciar (criar) os seus membros (dados e/ou funções)
• O construtor retorna implicitamente o novo objecto (this) a não ser que exista retorno explicito
• Os objectos criados têm uma ligação (não acessível directamente) para o protótipo da função construtora (ver protótipos à frente)
• É convenção as funções construtoras terem um nome iniciado por maiúscula
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
16Linguagem Javascript
Objectos e Funções construtoras nativas da linguagem
Função construtora
Disponível? Descrição
Object Função construtora de objectos genéricos
Function Função construtora de objectos função
Array Função construtora de objectos array
String Função construtora de objectos string
Boolean Função construtora de objectos booleanos
Number Função construtora de objectos numéricos
Date Função construtora de objectos que representam um instante temporal com precisão até aos milissegundos
RegExp Função construtora de objectos que representam expressões regulares
Error Função construtora de objectos que representam erros
Math X Objecto cujas propriedades são funções e constantes matemáticas
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
17Linguagem Javascript
Protótipos• Os objectos função têm a propriedade prototype• Quando uma função é usada como função construtora, os objectos
construídos ficam com uma ligação implícita (não acessível programaticamente) para o protótipo da função construtora
• No acesso às propriedades de um objecto, se esta não for encontrada, é percorrida a cadeia de protótipos até ser encontrada, ou até a cadeia terminar (ver à frente)
• A utilização da cadeia de protótipos disponibiliza o mecanismo herança baseada em protótipos (objectivos semelhantes à herança das linguagens OO - ver à frente).
• É possível acrescentar novas propriedades aos protótipos das funções construtoras nativas (ex: String)
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
18Linguagem Javascript
Diagrama de protótiposfunction CF() { this.a = "aaa"; this.b = "bbb";}CF.c = "ccc";CF.prototype.foo = "foo";
var c1 = new CF();var c2 = new CF();var c3 = new CF();
function CF() { this.a = "aaa"; this.b = "bbb";}CF.c = "ccc";CF.prototype.foo = "foo";
var c1 = new CF();var c2 = new CF();var c3 = new CF();
CFCF
prototypeprototype
cc “ccc”“ccc”
CFprototypeCFprototype
prototypeprototype
foofoo “foo”“foo”
c1c1
constructorconstructor
aa “aaa”“aaa”
bb “bbb”“bbb”
c2c2
constructorconstructor
aa “aaa”“aaa”
bb “bbb”“bbb”
c3c3
constructorconstructor
aa “aaa”“aaa”
bb “bbb”“bbb”
Protótipo explícito
Protótipo implícito
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
19Linguagem Javascript
Acesso às propriedades de um objecto
objecto contém ‘p’?
object tem prototype?
objecto prototype tem
construtor?
Retorna valor ‘p’ do objecto
Sim
retorna valor undefined
Não
Não
Sim
Usar o prototype do objecto prototype
Não
Sim
Exemplo:Acesso à propriedade p
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
20Linguagem Javascript
Protótipos: exemplo
• Para ver este exemplo utilizem a extensão firebug para o browser firefox.
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
21Linguagem Javascript
Herança em JavaScript
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
22Linguagem Javascript
Herança baseada em protótipos// Definição da classe basefunction Base() { }Base.prototype.m1 = function () { alert("Base.m1"); } Base.prototype.m2 = function () { alert("Base.m2"); }
// Definição da classe derivadafunction Derived() { }Derived.prototype = new Base();Derived.prototype.m3 = function () { alert("Derived.m3"); }
// Redefinição de um método com chamada ao método baseDerived.prototype.m2 = function () { alert("Derived.m2"); this.constructor.prototype.m2();}
// Testevar o = new Derived();o.m1();o.m2();o.m3();
// Definição da classe basefunction Base() { }Base.prototype.m1 = function () { alert("Base.m1"); } Base.prototype.m2 = function () { alert("Base.m2"); }
// Definição da classe derivadafunction Derived() { }Derived.prototype = new Base();Derived.prototype.m3 = function () { alert("Derived.m3"); }
// Redefinição de um método com chamada ao método baseDerived.prototype.m2 = function () { alert("Derived.m2"); this.constructor.prototype.m2();}
// Testevar o = new Derived();o.m1();o.m2();o.m3();
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
23Linguagem Javascript
Herança baseada em chamada à cadeia de f. construtoras
function Base1() { this.m1 = function () { alert("Base1.m1"); } this.m2 = function () { alert("Base1.m2"); }}
function Derived1() { //this.base = Base1; //this.base(); Base1.call(this); // sintaxe alternativa às linhas anteriores
this.m3 = function () { alert("Derived1.m3"); } // Redifinição de m2 this.m2base = this.m2; this.m2 = function () { alert("Derived1.m2"); this.m2base(); }}var o = new Derived1();o.m1();o.m2();o.m3();
function Base1() { this.m1 = function () { alert("Base1.m1"); } this.m2 = function () { alert("Base1.m2"); }}
function Derived1() { //this.base = Base1; //this.base(); Base1.call(this); // sintaxe alternativa às linhas anteriores
this.m3 = function () { alert("Derived1.m3"); } // Redifinição de m2 this.m2base = this.m2; this.m2 = function () { alert("Derived1.m2"); this.m2base(); }}var o = new Derived1();o.m1();o.m2();o.m3();
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
24Linguagem Javascript
Variáveis• As variáveis são definidas com a instrução var
• Apenas existem dois contextos para as variáveis– Global
– Funções• Quando definidas numa função, apenas são válidas nesse contexto
• Variáveis definidas numa função sem a utilização do prefixo var, assume-se que existe num contexto superior (possivelmente o do Objecto Global)
• Variáveis não iniciadas assumem o valor undefined
• Numa função, por cada chamada é criado um novo conjunto de variáveis com o contexto dessa função (suporte para chamadas recursivas)
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
25Linguagem Javascript
Closures• Funções podem ser definidas dentro de outras funções• As funções internas têm acesso às variáveis e parâmetros formais da função
externa (no exemplo, têm acesso à variável ‘x’)
• Se existir uma referência para uma função interna após a função externa terminar, todas as variáveis e parâmetros continuam a existir (mas apenas acessíveis no contexto da função interna)
• Podem ser usados na criação de membros privados na função construtora
function Demo(x) { var a = x + 1; this.m1 = function () { alert(a + "," + x); } }
var d1 = new Demo(5); var d2 = new Demo(8);
d1.m1(); // alerts 6,5d2.m1(); // alerts 9,8
function Demo(x) { var a = x + 1; this.m1 = function () { alert(a + "," + x); } }
var d1 = new Demo(5); var d2 = new Demo(8);
d1.m1(); // alerts 6,5d2.m1(); // alerts 9,8
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
26Linguagem Javascript
Retorno de uma função• Todas as funções retornam um valor (não existe tipo void)• O valor de retorno por omissão é:
– undefined – chamada normal a funções– this – funções construtoras ( new X() )
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
27Linguagem Javascript
InstruçõesTipo de
instruçãoInstrução Notas
Condicionalif ... [else]
switch ... case ... Default
As labels podem ser expressões e strings (não necessitam de ser constantes)
Ciclos
whileA expressão da condição é convertida para bool (ver regras à frente)for
do ... while
continue
Quebra de fluxobreak
return
Excepçõestry ... catch
throw
Expressão As expressões são instruções quando terminadas por “;”
Variáveis var
Composta { ... }
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
28Linguagem Javascript
Tabela de operadores e prioridadePrioridade
+
_
Operador Descrição
. [] () Acesso a propriedades, indexação, chamadas a funções e sub-expressões
++ — - ~ ! new delete typeof
Operadores unários e criação de objectos
* / % Multiplicação, divisão, divisão módulo
+ - Adição, subtracção, concatenação de strings
<< >> >>> Deslocação de Bit
< <= > >= instanceof Menor, menor ou igual, maior, maior ou igual, instanceof
== != === !== Igualdade, desigualdade, igualdade estrita, e desigualdade estrita
& AND bit a bit
^ XOR bit a bit
| OR bit a bit
&& AND lógico
|| OR lógico
? : Operador condicional (ternário)
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
29Linguagem Javascript
Conversão para bool• Sempre que há uma conversão para booleano (explícita ou implícita):
– Valor lógico false• false, null, undefined, “”, 0
– Valor lógico true• restantes
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
30Linguagem Javascript
Notas sobre operadores• Operador +
– Usado na adição e concatenação de strings• Se um dos operandos são strings, faz concatenação depois de converter o outro
operando para string• Pode ser usado como operador prefixo para converter uma string para número
– Ex.º: +"1"
• Operador && (And lógico)– Usado em expressões de guarda
• Ex.º: var value = p && p.name;
• Operador || (Or lógico) – Usado para atribuir valores por omissão
• Ex.º: var value = v || 10;
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
31Linguagem Javascript
Operador typeof: informação sobre o tipo de dados
• O operador typeof retorna uma string de acordo com o tipo do operando
• Sintaxe: var tipoDoOperador = typeof(operador);Object 'object'
Array 'object'
Function 'function'
String 'string'
Number 'number'
Boolean 'boolean'
null 'object'
undefined 'undefined'
Atenção !
Atenção !
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
32Linguagem Javascript
Palavras Reservadas
abstractboolean break bytecase catch char class const continuedebugger default delete do doubleelse enum export extendsfalse final finally float for functiongotoif implements import in instanceof int interfacelongnative new nullpackage private protected publicreturnshort static super switch synchronizedthis throw throws transient true try typeofvar volatile voidwhile with
Legenda: Usadas na linguagem Não usadas na linguagem
2008 - 2009©ISEL/DEETC/STI – Programação na Internet
33Linguagem Javascript
Referências
• Douglas Crockford: “A Survey of the JavaScript Programming Language”http://javascript.crockford.com/http://javascript.crockford.com/survey.html
• Versão Standard actual: ECMAScript - Edition 3 http://www.ecma-international.org/publications/standards/Ecma-262.htm
• Referências Online: “JScript @ MSDN” http://msdn.microsoft.com/en-us/library/4yyeyb0a.aspx
• Flanagan, David, “JavaScript: The definitive guide”, O'Reilly Media; 5 edition, 2006