javascript - principais conceitos

233
JavaScript Principais conceitos Prof: Sérgio Souza Costa

Upload: sergio-souza-costa

Post on 06-Jun-2015

2.330 views

Category:

Education


16 download

TRANSCRIPT

Page 1: JavaScript - Principais conceitos

JavaScriptPrincipais conceitos

Prof: Sérgio Souza Costa

Page 2: JavaScript - Principais conceitos

Sobre mim

Sérgio Souza CostaProfessor - UFMADoutor em Computação Aplicada (INPE)

[email protected]

https://sites.google.com/site/profsergiocosta/home

https://twitter.com/profsergiocosta

http://gplus.to/sergiosouzacosta

http://www.slideshare.net/skosta/presentations?order=popular

Page 3: JavaScript - Principais conceitos

Interfaces de usuário

Page 4: JavaScript - Principais conceitos

Interfaces de usuário

Estrutura

Page 5: JavaScript - Principais conceitos

Interfaces de usuário

Estrutura

Apresentação

Page 6: JavaScript - Principais conceitos

Interfaces de usuário

Estrutura

Apresentação

Comportamento

Page 7: JavaScript - Principais conceitos

Interfaces de usuário

Estrutura: HTML

Apresentação: CSS

Comportamento: JavaScript

Page 8: JavaScript - Principais conceitos

Interfaces de usuário

Estrutura: HTML

Apresentação: CSS

Comportamento: JavaScript

Page 9: JavaScript - Principais conceitos
Page 10: JavaScript - Principais conceitos

Vantagens

Acessibilidade

Portabilidade

Manutenabilidade

Page 11: JavaScript - Principais conceitos

JavaScript

Page 12: JavaScript - Principais conceitos

JavaScript

● Linguagem imperativa:○ similar a 90% das linguagens, Java, C++, Ruby,

Smalltalk, ...

Page 13: JavaScript - Principais conceitos

JavaScript

● Linguagem imperativa:○ similar a 90% das linguagens, Java, C++, Ruby,

Smalltalk, ...● Linguagem de script

○ similar a diversas linguagens, como Lua, Python, PHP ...

Page 14: JavaScript - Principais conceitos

JavaScript

● Linguagem imperativa:○ similar a 90% das linguagens, Java, C++, Ruby,

Smalltalk, ...● Linguagem de script

○ similar a diversas linguagens, como Lua, Python, PHP ...

● Linguagem dinâmica, como as maioria das linguagens de script○ Lua, Python, PHP ...

Page 15: JavaScript - Principais conceitos

JavaScript

● Linguagem imperativa:○ similar a 90% das linguagens, Java, C++, Ruby,

Smalltalk, ...● Linguagem de script

○ similar a diversas linguagens, como Lua, Python, PHP ...

● Linguagem dinâmica, como as maioria das linguagens de script○ Lua, Python, PHP ...

● Linguagem integrada aos browser, usada para manipular os "objetos html"

Page 16: JavaScript - Principais conceitos

JavaScript

Como surgiu ??

Page 17: JavaScript - Principais conceitos

JavaScript

● Inicialmente com o nome de Cmm (C menos menos) e depois ScriptEase.

Page 18: JavaScript - Principais conceitos

JavaScript

● Inicialmente com o nome de Cmm (C menos menos) e depois ScriptEase.

● Netscape usa o projeto em seu Browser, nomeando como LiveScript e depois JavaScript.

Page 19: JavaScript - Principais conceitos

JavaScript

● Inicialmente com o nome de Cmm (C menos menos) e depois ScriptEase.

● Netscape usa o projeto em seu Browser, nomeando como LiveScript e depois JavaScript.

● Não é derivada do Java, o nome pode ter sido usado como estratégia de marketing.○ Microsoft incorpora no teu browser com outro nome

- JScript.

Page 20: JavaScript - Principais conceitos

JavaScript - 1996

● Falta de padronizações entre os browser● Uso excessivo de animações com JavaScript

○ Os desenvolvedores ainda não sabiam utilizar este novo recurso

● Principal uso do JavaScript era na validação de formulários e para enviar alertas ao usuários

Page 21: JavaScript - Principais conceitos

JavaScript - 1996

● Falta de padronizações entre os browser● Uso excessivo de animações com JavaScript

○ Os desenvolvedores ainda não sabiam utilizar este novo recurso

● Principal uso do JavaScript era na validação de formulários e para enviar alertas ao usuários

Tempos depois ...Netscape apresentou o JavaScript para ECMA

International para a padronização resultando na versão padronizada chamado ECMAScript.

Page 22: JavaScript - Principais conceitos

JavaScript - 1996

Um "hello world" a la decada de 90

<html><body>

<script type="text/javascript">document.write("<p>Hello World!</p>");</script>

</body></html>

Page 23: JavaScript - Principais conceitos

JavaScript - 1996

Um "hello world" a la decada de 90

<html><body>

<script type="text/javascript">document.write("<p>Hello World!</p>");</script>

</body></html>

A forma de usar JavaScript evolui muito desde a decada de 90.

Unido com a evolução de outras tecnologias, por exemplo, DOM, CSS ...

Page 24: JavaScript - Principais conceitos

Modelo de programação JavaScript

Page 25: JavaScript - Principais conceitos

Modelo de programação JavaScript

1. Problema

Page 26: JavaScript - Principais conceitos

Modelo de programação JavaScript

1. Problema 2. Google

Page 27: JavaScript - Principais conceitos

Modelo de programação JavaScript

1. Problema 2. Google

3. Encontra

Page 28: JavaScript - Principais conceitos

Modelo de programação JavaScript

1. Problema 2. Google

3. Encontra4. Control-C e Control-V

Page 29: JavaScript - Principais conceitos

Modelo de programação JavaScript

1. Problema 2. Google

3. Encontra4. Control-C e Control-V

Page 30: JavaScript - Principais conceitos

Modelo de programação JavaScript

1. Problema 2. Google

3. Encontra4. Control-C e Control-V

Copy, paste e run

Page 31: JavaScript - Principais conceitos

Não preciso saber programar, eu uso plugins, bibliotecas.... Detalhes de programação é coisa de Nerd … Se bem ….

Page 32: JavaScript - Principais conceitos

Que tal este código ? é so JavaScript

$(document).ready(function(){$("#p1").mouseenter(function(){

$.ajax({ url: "endereco_web", success: function(html){ $("#a1").html(html); }})})

})

Conseguem entender ? ou copy and paste

Page 33: JavaScript - Principais conceitos

Que tal este código ? é so JavaScript

$(document).ready(function(){$("#p1").mouseenter(function(){

$.ajax({ url: "endereco_web", success: function(html){ $("#a1").html(html); }})})

})

Conseguem entender ? ou copy and paste

Isto não é uma sintaxe

específica do Jquery, é apenas

JavaScript

Page 34: JavaScript - Principais conceitos

Saber Java Script facilitará o uso das bibliotecas e APIs emJava Script.

Page 35: JavaScript - Principais conceitos

Saber Java Script permitira INOVAR sua interface com o usuário.

Saber Java Script facilitará o uso das bibliotecas e APIs emJava Script.

Page 36: JavaScript - Principais conceitos

Saber Java Script permitira INOVAR sua interface com o usuário.

Saber Java Script facilitará o uso das bibliotecas e APIs emJava Script.

Ou .. precisará esperar a Google fazer, e alguem copiar, e você usar.

Page 37: JavaScript - Principais conceitos

Saber Java Script permitira INOVAR sua interface com o usuário.

Saber Java Script facilitará o uso das bibliotecas e APIs emJava Script.

Ou .. precisará esperar a Google fazer, e alguem copiar, e você usar.

Se precisa focar no negocio, use bibliotecas e seja produtivos.

Page 38: JavaScript - Principais conceitos

Saber Java Script permitira INOVAR sua interface com o usuário.

Saber Java Script facilitará o uso das bibliotecas e APIs emJava Script.

Ou .. precisará esperar a Google fazer, e alguem copiar, e você usar.

Se precisa focar no negocio, use bibliotecas e seja produtivos.

Fiquem atento, usar plugins você não inova.

Page 39: JavaScript - Principais conceitos

Já ouviram falar em HTML 5 ?

Page 40: JavaScript - Principais conceitos

Já ouviram falar em HTML 5 ?

É em grande parte novas APIs Java Script

Page 41: JavaScript - Principais conceitos

Já ouviram falar em HTML 5 ?

É em grande parte novas APIs Java Script

GeoLocation

Page 42: JavaScript - Principais conceitos

Já ouviram falar em HTML 5 ?

É em grande parte novas APIs Java Script

GeoLocation Canvas

Page 43: JavaScript - Principais conceitos

Já ouviram falar em HTML 5 ?

É em grande parte novas APIs Java Script

GeoLocation Canvas

WebGL

Page 44: JavaScript - Principais conceitos

Já ouviram falar em HTML 5 ?

É em grande parte novas APIs Java Script

GeoLocation Canvas

WebGLStorage

Page 45: JavaScript - Principais conceitos

APIS google são escritas em Java Script

Page 46: JavaScript - Principais conceitos

var triangleCoords = [ new google.maps.LatLng(25.774252, -80.190262), new google.maps.LatLng(18.466465, -66.118292), new google.maps.LatLng(32.321384, -64.75737) ];

bermudaTriangle = new google.maps.Polygon({ paths: triangleCoords, strokeColor: "#FF0000", strokeOpacity: 0.8, strokeWeight: 3, fillColor: "#FF0000", fillOpacity: 0.35 });

bermudaTriangle.setMap(map);

Google Maps API

Page 47: JavaScript - Principais conceitos

APIS google são escritas em Java Script

Microsoft adotou o Java Script no Windows 8

Page 48: JavaScript - Principais conceitos

Windows 8 – Metro

Page 49: JavaScript - Principais conceitos

APIS google são escritas em Java Script

Microsoft adotou o Java Script no Windows 8

Uma alternativa para o desenvolvimento de aplicativos para dispositivos móveis

Page 50: JavaScript - Principais conceitos

Com a vantagem de ter um app compativel com o Android e IOS

Page 51: JavaScript - Principais conceitos

APIS google são escritas em Java Script

Microsoft adotou o Java Script no Windows 8

Uma alternativa para o desenvolvimento de aplicativos para dispositivos móveis

Alicerce para a "nova" Web - AJAX

Page 52: JavaScript - Principais conceitos

"Considered a “toy” language by serious web developers for most of its lifetime, Java-Script has regained its prestige in the past few years as a result of the renewed interest in Rich Internet Applications and Ajax technologies".

John Resig - jQuery in Action

Page 53: JavaScript - Principais conceitos

"Combining a functional style with prototypal inheritance JavaScript is arguably the most widely deployed language of either type. Considering that virtually every computer user has an interpreter capable of running it, JavaScript serves to be one of the best languages to learn."

John Resig - Criador do JQuery

"Considered a “toy” language by serious web developers for most of its lifetime, Java-Script has regained its prestige in the past few years as a result of the renewed interest in Rich Internet Applications and Ajax technologies".

John Resig - jQuery in Action

Page 54: JavaScript - Principais conceitos

Modelo control-c e control-v não é suficiente, precisamos saber usar e dominar a linguagem.

Page 55: JavaScript - Principais conceitos

Modelo control-c e control-v não é suficiente, precisamos saber usar e dominar a linguagem.

Vamos ver alguns conceitos que nos preparam para usar e entender o JQuery

Page 56: JavaScript - Principais conceitos

1. Saber Programar

Page 57: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

Page 58: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEMSintaxe

Page 59: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEMSintaxe Semântica

Page 60: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEMSintaxe Semântica Pragmática

Page 61: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

Sintaxe Semântica Pragmática

3. Conhecer suas APIs

Page 62: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

Sintaxe Semântica Pragmática

3. Conhecer suas APISDOM BOM

Page 63: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

3. Conhecer suas APIS

Page 64: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

3. Conhecer suas APIS

Page 65: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

3. Conhecer suas APIS

Page 66: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

3. Conhecer suas APIS

Page 67: JavaScript - Principais conceitos

Como uso o Java Script nas minhas páginas ?

Baixem o template - HTML

Page 68: JavaScript - Principais conceitos

Opção 1: Inline Javascript – Bad

<!DOCTYPE html><html><head><meta charset="utf-8" /><title></title></head><body>

<a href="javascript:alert('BOO Bad way')"> Click</a></body></html>

Page 69: JavaScript - Principais conceitos

Opção 2: Embedded Javascript – Good

<!DOCTYPE html><html><head><meta charset="utf-8" /><title></title>

<script type="text/javascript" >function faca_algo(){

alert ("OK")}</script>

</head><body><a href="#" onclick ="faca_algo()" > Click</a></body></html>

Page 70: JavaScript - Principais conceitos

Opção 2: Embedded Javascript – Good

<!DOCTYPE html><html><head><meta charset="utf-8" /><title></title>

<script type="text/javascript" >function faca_algo(){

alert ("OK")}</script>

</head><body><a href="#" onclick ="faca_algo()" > Click</a></body></html>

Page 71: JavaScript - Principais conceitos

Opção 3: Embedded Javascript – Best

<!DOCTYPE html><html><head><meta charset="utf-8" /><title></title><script type="text/javascript" src="fool.js" ></script></head><body><a href="#" onclick ="faca_algo()" > Click</a></body></html>

function faca_algo(){alert ("OK")

}

Page 72: JavaScript - Principais conceitos

Firebug: A principal ferramenta

Chrome e Safari possuem recursos nativos similares.

Page 73: JavaScript - Principais conceitos

● Funções javascript para recuperar objetos do browser

● Não é padronizado

● API DOM x API BOM○ http://www.w3schools.com/jsref/default.asp

BOM – Browser Object Model

Page 74: JavaScript - Principais conceitos

BOM – Browser Object Model

● Screen● Width● Height

● Histórico● Back● Forward● Go

● Localização● Href● Protocol

● Janelas:● Alert● Confirm● Prompt

● Navegador● Plataform● userAgent

Page 75: JavaScript - Principais conceitos

DOM

DOM CORE

DOM HTML DOM XML DOM JAVA

Page 76: JavaScript - Principais conceitos

DOM

DOM CORE

DOM HTML DOM XML DOM JAVA

Page 77: JavaScript - Principais conceitos

● O DOM apresenta documentos como uma hierarquia de objetos Nós que também implementam outras interfaces mais especializadas.

● Alguns tipos de nós pode ter nós filhos de vários tipos, e outros são nós folha que não tem nada abaixo deles na estrutura do documento.

DOM Core

Page 78: JavaScript - Principais conceitos

DOM Core

TABLE Nó raiz

Nó filho de table

Nó● filho de <TR>● neto de table

Nó folha

Page 79: JavaScript - Principais conceitos

● A interface nó é o tipo primário para todo DOM.

● Ele representa um nó na árvore de documento.

DOM Core

Page 80: JavaScript - Principais conceitos

DOM Core

Page 81: JavaScript - Principais conceitos

○ parentNode○ hasChildNodes○ firstChild○ lastChild○ previousSibling○ nextSibling○ hasAttributes○ attributes

DOM Core

○ cloneNode○ createTextNode○ removeChild○ insertBefore○ replaceChild○ appendChild

Page 82: JavaScript - Principais conceitos

○ parentNode○ hasChildNodes○ firstChild○ lastChild○ previousSibling○ nextSibling○ hasAttributes○ attributes

DOM Core

○ cloneNode○ createTextNode○ removeChild○ insertBefore○ replaceChild○ appendChild

Apenas informativo, usaremos uma

biblioteca sobre o DOM (Jquery)

Page 83: JavaScript - Principais conceitos

● Além de acessar os nós pela estrutura da árvore, é possível fazer esse acesso também utilizando as funções abaixo:○ getElementById();○ getElementsByName();○ getElementsByTagName();

Interface - Element

Usaremos apenas estes métodos nos exercicios mais a

frente.

Page 85: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

3. Conhecer suas APIS

Page 86: JavaScript - Principais conceitos

1. Saber Programar

2. Conhecer a LINGUAGEM

3. Conhecer suas APIS

Conhecer a linguagem facilita

entender e usar as APIS

Page 87: JavaScript - Principais conceitos

Conhecendo JavaScript....

Page 88: JavaScript - Principais conceitos

JavaScript é uma linguagem de programação

Page 89: JavaScript - Principais conceitos

JavaScript é uma linguagem de programação

JavaScript ≠ Java

Page 90: JavaScript - Principais conceitos

JavaScript

● Inicialmente com o nome de Cmm (C menos menos) e depois ScriptEase.

● Netscape usa o projeto em seu Browser, nomeando como LiveScript e depois JavaScript.

● Não é derivada do Java, o nome pode ter sido usado como estratégia de marketing.

● Microsoft incorpora no teu browser com outro nome - JScript.

Page 91: JavaScript - Principais conceitos

Ranking das Linguagens do lado do cliente

Page 92: JavaScript - Principais conceitos

Java Script

Principais características exploradas nas aplicações ricas da internet.

Os tipos são dinâmicos, polimorfismo “gratuito”. Não preciso de herança e nem templates.

Funções são valores de primeira classe, tratadas como qualquer outro valor.

Page 93: JavaScript - Principais conceitos

Linguagem Imperativa

Page 94: JavaScript - Principais conceitos

Linguagem Imperativa

Variáveis

Page 95: JavaScript - Principais conceitos

Linguagem Imperativa

Variáveis Valores

Page 96: JavaScript - Principais conceitos

Linguagem Imperativa

Variáveis Valores

Atribuição

Page 97: JavaScript - Principais conceitos

Linguagem Imperativa

Variáveis Valores

Atribuição

Estado

Page 98: JavaScript - Principais conceitos

Linguagem Imperativa

VariáveisValores

Atribuição

Estado

É igual a todas as outras linguagens

que conheço

Page 99: JavaScript - Principais conceitos

Sintaxe

●Inspirada em C, como Java e C++

for (var i = 0; i < 10; i++) {if (algumaCoisa) {

break;}

}

Page 100: JavaScript - Principais conceitos

Sintaxe

●Inspirada em C, como Java e C++

for (var i = 0; i < 10; i++) {if (algumaCoisa) {

break;}

}

É igual a todas as outras linguagens

que conheço

Page 101: JavaScript - Principais conceitos

Principais Elementos

●Variáveis

Page 102: JavaScript - Principais conceitos

Variáveis

●Nome●Tipo●Valor

Page 103: JavaScript - Principais conceitos

Variáveis

●Nome●Tipo●Valor

Page 104: JavaScript - Principais conceitos

Variáveis

●Nome●Tipo●Valor

Page 105: JavaScript - Principais conceitos

Tipo

Page 106: JavaScript - Principais conceitos

Tipo

●Dinamicamente tipada

Page 107: JavaScript - Principais conceitos

Tipo

●Dinamicamente tipada○Os tipos das variaveis são definidos em tempo

de execução.○Dependendo dos seus valores

Page 108: JavaScript - Principais conceitos

Tipo

●Dinamicamente tipada○Os tipos das variaveis são definidos em tempo

de execução.○Dependendo dos seus valores

A variável se “ajusta“ ao seu conteúdo

Page 109: JavaScript - Principais conceitos

Tipo

●Dinamicamente tipada○Os tipos das variaveis são definidos em tempo

de execução.○Dependendo dos seus valores

A variável se “ajusta“ ao seu conteúdo

Não era assim as linguagens que

conhecia.

Page 110: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Page 111: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Códigos menores + Funções aplicadas a diferentes

valores

Page 112: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Códigos menores + Funções aplicadas a

diferentes valores

Page 113: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Códigos menores + Funções aplicadas a diferentes

valores

= +Produtivade

Page 114: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Códigos menores + Funções aplicadas a diferentes

valores

= +Produtivade

=+Manutenabilidade

Page 115: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Códigos menores + Funções aplicadas a diferentes

valores

= +Produtivade

=+Manutenabilidade

=+Legibilidade

Page 116: JavaScript - Principais conceitos

Tipos Dinâmicos - Vantagens

Códigos menores + Funções aplicadas a diferentes

valores

= +Produtivade

=+Manutenabilidade

=+Legibilidade

Page 117: JavaScript - Principais conceitos

Tipos Dinâmicos - Desvantagens

Page 118: JavaScript - Principais conceitos

Tipos Dinâmicos - Desvantagens

Códigos poucos seguros

Page 119: JavaScript - Principais conceitos

Tipos Dinâmicos - Desvantagens

Códigos poucos seguros Baixa

eficiência

Page 120: JavaScript - Principais conceitos

Tipos Dinâmicos - Desvantagens

Códigos poucos seguros

Baixa eficiência

Mais disciplina nos testes

Page 121: JavaScript - Principais conceitos

Tipos Dinâmicos - Desvantagens

Códigos poucos seguros

Baixa eficiência

Mais disciplina nos testesSaiba o que está fazendo. O compilador nao poderá te ajudar muito.

Page 122: JavaScript - Principais conceitos

Tipos Dinâmicos - Desvantagens

Códigos poucos seguros

Baixa eficiência

Mais disciplina nos testesSaiba o que está fazendo. O compilador nao poderá te ajudar muito.

Page 123: JavaScript - Principais conceitos

Declarando

Muito fácil

var a = 12;var b = {animal:”cat”,age:10};var c = true;...

Nome Valor

Page 124: JavaScript - Principais conceitos

Declarando

Muito fácil

var a = 12;var b = {animal:”cat”,age:10};var c = true;...

Nome Valor

Tipo de uma váriavel é tipo de seu valor corrente

Page 125: JavaScript - Principais conceitos

Declarando

●Muito fácil

var a = 12;var b = {animal:”cat”,age:10};var c = true;...

Nome Valor

Tipo de uma váriavel é tipo de seu valor corrente

Qual a função do “var“

Vamos ver ....

Page 126: JavaScript - Principais conceitos

<!DOCTYPE html><html><head><meta charset="utf-8" /><script type="text/javascript" >function teste (){

a = 20b = 10

}teste()console.log (a, b)</script><title></title></head><body>

</body></html>

Page 127: JavaScript - Principais conceitos

Tipos - JavaScript

Page 128: JavaScript - Principais conceitos

Tipos - JavaScript

Sim. Uma variável pode ser do tipo função... very nice...

Page 129: JavaScript - Principais conceitos

Primitivo X Referência

Page 130: JavaScript - Principais conceitos

Primitivo X Referência

PONTEIROSSSNÂOOOOO....

Page 131: JavaScript - Principais conceitos

Cópia X Referencia

Vamos verificar ....

Page 132: JavaScript - Principais conceitos

<!DOCTYPE html><html><head><meta charset="utf-8" /><script type="text/javascript" >var p1 = {x:10, y: 20};var p2 = p1;p2.x = 50;p2.y = 80;console.log (p1, p2)</script><title></title></head><body></body></html>

Relax .. Veremos sobre objetos mais a frente …

Page 133: JavaScript - Principais conceitos

Cópia X Referencia

●Tipos primitivos○cópia

●Tipos compostos○referência

Page 134: JavaScript - Principais conceitos

Referência

Page 135: JavaScript - Principais conceitos

Referência

Similar a diversas outras linguagens como Java, Lua, Ruby ...

Page 136: JavaScript - Principais conceitos

typeof

●As vezes é necessário saber qual o tipo de uma determinada variavel

○Identificação de erros

Page 137: JavaScript - Principais conceitos

Tipos primitivos

●Numéricos → inteiro ou real○10, 10.5, 12.1, 0

●Booleanos ○False, True

●null and undefined

Page 138: JavaScript - Principais conceitos

Tipos primitivos

●Numéricos → inteiro ou real○10, 10.5, 12.1, 0

●Booleanos ○False, True

●null and undefined

Nada muito diferente das linguagens que ja conhecem.

Page 139: JavaScript - Principais conceitos

type casting – Conversão explícita

●parseFloat()●parseInt()●Object.toString()

Page 140: JavaScript - Principais conceitos

Exercício – “Somadora”Jogo dos X erros, ☺ tentem encontrar

Page 141: JavaScript - Principais conceitos

Conversão

●Conhecendo as regras de coerção

var myPi = “3.1415”;var result = myPi - 1.1;

var myPi = “3.1415”;var result = myPi + 1.1;

Page 142: JavaScript - Principais conceitos

Conversão

●Conhecendo as regras de coerção

var myPi = “3.1415”;var result = myPi - 1.1;

var myPi = “3.1415”;var result = myPi + 1.1;

Conversões automáticas são conhecidas como coerção

Page 143: JavaScript - Principais conceitos

Conversão

●Conhecendo as regras de coerção

var myPi = “3.1415”;var result = myPi - 1.1;

var myPi = “3.1415”;var result = myPi + 1.1;

Conversões automáticas são conhecidas como coerção

È um tipo de polimorfimos adhoc

Page 144: JavaScript - Principais conceitos

Conversão

●Outros exemplos

var result1 = 1 + true;var result2 = 1 + false;var result3 = “true” + true;var result4 = null + true;var result5 = undefined + 0;var result6 = undefined + “0“ ;

Page 145: JavaScript - Principais conceitos
Page 146: JavaScript - Principais conceitos

String

●Primitivo ○Não é um array de caracter○Imutável

●Métodos e propriedades como objeto○length, substring, toLowerCase, charAt, concat

var a = “alo“var b = a[0]a[0] ='o'

Page 147: JavaScript - Principais conceitos

String Funções

●charAt(x) Retorna o character da posicao "x" dentro da string.

●charCodeAt(x) Retorna o valor Unicode do caractere na posicao “x" dentro da string.

●concat(v1, v2,...) Combina uma ou mais strings (argumentos v1, v2 etc) dentro de outra sem modificar a string original.

●indexOf(substr, [start]) Procura e se encontrar retorna o indice do caractere procurado. Se não for encontrado nada, -1 será retornado. "Start" até um argumento opcional que especifica a posição inicial dentro da string que será feita a pesquisa. O valor padrão até 0.

●lastIndexOf(substr, [start]) Procura e se encontrar retorna o índice do caractere procurado, a pesquisa começa do fim para o início. Se não for encontrado nada, -1 será retornado. "Start" até um argumento opcional que especifica a posição inicial dentro da string que será feita a pesquisa. O valor padrão até -1.

●string.length - retorna o tamanho da string (quantidade de bytes)

●substring(index1, index2) - retorna o conteúdo da string que corresponde ao intervalo especificado. Começando no caracter posicionado em index1 e terminando no caracter imediatamente anterior ao valor especificado em index2.

Page 148: JavaScript - Principais conceitos

Funções

Page 149: JavaScript - Principais conceitos

Funções

function nome(args){códigos;}

function dobro(x){return 2*x;}

nome =function (args){códigos;}

dobro = function (x){return 2*x;}

Page 150: JavaScript - Principais conceitos

Funções

function nome(args]){códigos;}

function dobro(x){return 2*x;}

nome =function (args]){códigos;}

dobro = function (x){return 2*x;}

Não é muito diferente do que eu

já fazia.

Page 151: JavaScript - Principais conceitos

O que é diferente ?

Page 152: JavaScript - Principais conceitos

O que é diferente ?

Funções são valores de primeira ordem.

Page 153: JavaScript - Principais conceitos

E dái ?

Page 154: JavaScript - Principais conceitos

E dái ?

Vamos ver ...

Page 155: JavaScript - Principais conceitos

Parâmetro de função

function twice (f, a) { return f (f (a))}

function dobra (a) {return 2* a}

console.log (twice (dobra, 4))

Page 156: JavaScript - Principais conceitos

Funções anônimas

function twice (f, a) { return f (f (a))}console.log (twice(function (x) {return 2*x;}, 4 ))

Page 157: JavaScript - Principais conceitos

Funções anonimas como parametros

●Exemplo JQuery

Page 158: JavaScript - Principais conceitos

Retorno de função - Closures

●Exemplo

function add (x) {return function (y) {return y+x}}

add1 = add (1)console.log (add1(10))

Page 159: JavaScript - Principais conceitos

Retorno de função - Closures

●Exemplo

function add (x) { return function (y) { return y+x }}

add1 = add (1)console.log (add1(10))

Esses recursos é encontrado na maioria das linguagens modernas: python, ruby, lua ...

Page 160: JavaScript - Principais conceitos

Funções – Número de argumentos indefinido

function f () { for (i in arguments ) { console.log (i) }} f (1,2)

Page 161: JavaScript - Principais conceitos

Sobrecarga de funções

Sobrecarga é um tipo de polimorfismo muito útil e existente em diversas linguagens, mas não existe nativamente em JavaScript

Page 162: JavaScript - Principais conceitos

Sobrecarga de funções

Sobrecarga é um tipo de polimorfismo muito útil e existente em diversas linguagens, mas não existe nativamente em JavaScript

○Pode ser simulada

Page 163: JavaScript - Principais conceitos

Simulando sobrecarga

●Sobrecarga é um tipo de polimorfismo muito útil e existente em diversas linguagens, mas não existe nativamente em JavaScript

○Pode ser simulada■Verificando quais argumentos que foram realmente

passados■Se argumento é nulo ou verificando o numero de

argumentos (arguments.length)■Verificando os tipos dos argumentos

Page 164: JavaScript - Principais conceitos

Simulando sobrecarga

●Não existe checagem de argumentos passados a uma função, então todos argumentos são opcionais.

function f (arg) { if (arg) console.log (arg) else console.log (“ola mundo“)}f("oi") f()

Simulando sobrecarga

function f (arg) { if (arguments.length != 0) console.log (arg) else console.log ("ola mundo")}f("oi") f()

Page 165: JavaScript - Principais conceitos

Simulando sobrecarga

●Não existe checagem de argumentos passados a uma função, então todos argumentos são opcionais.

function f (arg) { if (arg) console.log (arg) else console.log (“ola mundo“)}f("oi") f()

Simulando sobrecarga

function f (arg) { if (arguments.length != 0) console.log (arg) else console.log ("ola mundo")}f("oi") f()

É possivel ainda checar os tipos para decidir qual função usar.

Page 166: JavaScript - Principais conceitos

Simulando sobrecarga

●Não existe checagem de argumentos passados a uma função, então todos argumentos são opcionais.

function f (arg) {if (arg) console.log (arg)elseconsole.log (“ola mundo“)}f("oi") f()

Simulando sobrecarga

function f (arg) {if (arguments.length != 0) console.log (arg)elseconsole.log ("ola mundo")}f("oi") f()

É possivel ainda checar os tipos para decidir qual função usar.

Page 167: JavaScript - Principais conceitos

Parametros padrão

function f(par) { par = par || 1 console.log(par)}

Page 168: JavaScript - Principais conceitos

Não sei para que tanto conceito inútil ....

Page 169: JavaScript - Principais conceitos

O Criador do Jquery (veremos logo) não pensou assim, sua biblioteca faz exausto uso de:

Closures

Funções de primeira Ordem

“Sobrecarga”

Funções anônimas

Page 170: JavaScript - Principais conceitos

Tipos Compostos

●Arrayvar a = [1,2,3]

●Objectvar o = {nome: “joao“, idade:25}

chave

valor

Não tem muitas diferenças

Page 171: JavaScript - Principais conceitos

Tipos Compostos

●Arrayvar a = [1,2,3]

●Objectvar o = {nome: “joao“, idade:25}

chave

valor

Não tem muitas diferenças

Objeto são como vetores que podem ter chave diferente de inteiro

Page 172: JavaScript - Principais conceitos

Tipos Compostos

●Arrayvar a = [1,2,3]

●Objectvar o = {nome: “joao“, idade:25}

chave

valor

Não tem muitas diferenças

Objeto são como vetores que podem ter chave diferente de inteiro

Em Lua, por exemplo, não existe essa distinção.

Page 173: JavaScript - Principais conceitos

Array

var a = [1,2,3,4]for (v in a) { console.log (v)}

Page 174: JavaScript - Principais conceitos

Funções sobre Array

●concat() Joins two or more arrays, and returns a copy of the joined arrays

●join() Joins all elements of an array into a string

●pop() Removes the last element of an array, and returns that element

●push() Adds new elements to the end of an array, and returns the new length

reverse() Reverses the order of the elements in an array

●shift() Removes the first element of an array, and returns that element

●slice() Selects a part of an array, and returns the new array

●sort() Sorts the elements of an array

●splice() Adds/Removes elements from an array

Page 175: JavaScript - Principais conceitos

Object - Valor

var o = {chave1 : valor1, chave2 : valor2 }

Valores podem ser de qualquer dos valores existentes em JavaScript: numericos, string, funções, arrays ou objetos

Page 176: JavaScript - Principais conceitos

Object

●Simular orientação a objetos

var person = new Object();person.name = “Nicholas”;person.age = 29;person.job = “Software Engineer”;

person.sayName = function(){ Console.log(this.name);};

person.sayName()

Page 177: JavaScript - Principais conceitos

Object

●Simular orientação a objetos

var person = new Object();person.name = “Nicholas”;person.age = 29;person.job = “Software Engineer”;

person.sayName = function(){ Console.log(this.name);};

person.sayName()

Sempre que criar um novo „person“, terei que escrever a função sayName ?

Page 178: JavaScript - Principais conceitos

Object

●Simular orientação a objetos

var person = new Object();person.name = “Nicholas”;person.age = 29;person.job = “Software Engineer”;

person.sayName = function(){Console.log(this.name);};

person.sayName()

Sempre que criar um novo „person“, terei que escrever a função sayName ?Crie uma

função para fazer isso.

Page 179: JavaScript - Principais conceitos

Object

●Melhorando o modelo anteriorfunction createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o;}var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);var person2 = createPerson(“Greg”, 27, “Doctor”);

Page 180: JavaScript - Principais conceitos

Object

●Melhorando o modelo anteriorfunction createPerson(name, age, job){var o = new Object();o.name = name;o.age = age;o.job = job;o.sayName = function(){alert(this.name);};return o;}var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);var person2 = createPerson(“Greg”, 27, “Doctor”);

Linguagens orientadas a objeto ja deram uma solução melhor para isso. QUAL ?

Page 181: JavaScript - Principais conceitos

Object

●Melhorando o modelo anteriorfunction createPerson(name, age, job){var o = new Object();o.name = name;o.age = age;o.job = job;o.sayName = function(){alert(this.name);};return o;}var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);var person2 = createPerson(“Greg”, 27, “Doctor”);

Linguagens orientadas a objeto ja deram uma solução melhor para isso. QUAL ?Funções

Construtoras

Page 182: JavaScript - Principais conceitos

Construindo Objetos

function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);};}

var person1 = new Person(“Nicholas”, 29, “Software Engineer”);var person2 = new Person(“Greg”, 27, “Doctor”);

Page 183: JavaScript - Principais conceitos

Construindo Objetos

function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);};}

var person1 = new Person(“Nicholas”, 29, “Software Engineer”);var person2 = new Person(“Greg”, 27, “Doctor”);

Tem algo que não me parece está ok. O que vocês acham ?

Page 184: JavaScript - Principais conceitos

Prototype

function Person(name, age, job){this.name = name;this.age = age;this.job = job;}

Person.prototype.sayName = function(){alert(this.name);};

var person1 = new Person("Nicholas", 29,"Software Engineer");var person2 = new Person("Greg", 27, "Doctor");Console.log (person1.sayName == person2.sayName )

Page 185: JavaScript - Principais conceitos

Prototype

function Person(name, age, job){this.name = name;this.age = age;this.job = job;}

Person.prototype.sayName = function(){alert(this.name);};

var person1 = new Person("Nicholas", 29,"Software Engineer");var person2 = new Person("Greg", 27, "Doctor");Console.log (person1.sayName == person2.sayName )

Prototype permite extender as funcionalidades de um objeto, ex: plugins do Jquery

Page 186: JavaScript - Principais conceitos

Prototype

function Person(name, age, job){this.name = name;this.age = age;this.job = job;}

Person.prototype.sayName = function(){alert(this.name);};

var person1 = new Person("Nicholas", 29,"Software Engineer");var person2 = new Person("Greg", 27, "Doctor");Console.log (person1.sayName == person2.sayName )

E se eu tiver varios métodos para este objeto ? Vou ter que repetir Person.prototype.x = ...

Page 187: JavaScript - Principais conceitos

Prototype – Notação compacta

●Como está construindo um novo objeto, precisamos definir o „constructor“

Person.prototype = {constructor: Person,sayName: function(){alert(this.name);}}

Page 188: JavaScript - Principais conceitos

Getters e Setters

function Pessoa (name) { this._name = name; } Pessoa.prototype = {constructor: Pessoa, getName : function(){ return (this._name); }, setName : function(name){this._name = name; }}

var p = new Pessoa ("sergio")console.log (p.getName())p.setName ("joao")console.log (p.getName())

Page 189: JavaScript - Principais conceitos

Getters e Setters

function Pessoa (name) { this._name = name; } Pessoa.prototype = {constructor: Pessoa, getName : function(){ return (this._name); }, setName : function(name){this._name = name; }}

var p = new Pessoa ("sergio")console.log (p.getName())p.setName ("joao")console.log (p.getName())

Como sobrecarga pode ajudar ?

Page 190: JavaScript - Principais conceitos

Getters e Setters

function Pessoa (name) { this._name = name; } Pessoa.prototype = {constructor: Pessoa, getName : function(){ return (this._name); }, setName : function(name){this._name = name; }name : function () {

if (arguments[0] && typeof (arguments[0]) == "string")

return this.setName (arguments[0])else

return this.getName () }

} var p = new Pessoa ("sergio")console.log (p.name())p.name ("joao")console.log (p.name())

Page 191: JavaScript - Principais conceitos

Getters e Setters

●Exemplo em jQuery

O método $.fn.html usado como setter$('h1').html('olá mundo');

O método html usado como getter$('h1').html();

Page 192: JavaScript - Principais conceitos

Getters e setters

function Person(name ){this._name = name;}

Person.prototype = {constructor: Person, get name () {return this._name;}, set name (name) {this._name = name} }

a = new Person ("jose")console.log (a.name);a.name = "joao"console.log (a.name);

A partir do JavaScript 1.5 (2000), o java script permitiu escrever getter e setters

Page 193: JavaScript - Principais conceitos

Objetos nativos

●Objetos como String e Array, utilizam prototypes para definir suas funções.

alert(typeof Array.prototype.sort);alert(typeof String.prototype.substring);

Page 194: JavaScript - Principais conceitos

Extendendo funcionalidades dos objetos nativos

String.prototype.startsWith = function (text) {return this.indexOf(text) == 0;

};var msg = "Hello world!";

alert(msg.startsWith("Hello"));

Page 195: JavaScript - Principais conceitos

Eval

●Avalia uma expressão JavaScript. Exemplos:

console.log (eval("12*15"))console.log (eval("[12,13]")[0])console.log (eval("({x:12.5,y:14.3})").x)

Objeto tem que estar entre parenteses

Page 196: JavaScript - Principais conceitos

JSON

JSON é um objeto JavaScript no formato de String

eval ('( {"skillz": {"web":[{"name": "html", "years": "5"},{"name": "css", "years": "3"}],"database":[{"name": "sql", "years": "7"}]}} )')

Page 197: JavaScript - Principais conceitos

JSON

JSON é um objeto JavaScript no formato de String

eval ('( {"skillz": {"web":[{"name": "html", "years": "5"},{"name": "css", "years": "3"}],"database":[{"name": "sql", "years": "7"}]}} )')

Problem at line 13 character 19: eval is evil. http://www.jslint.com/

Page 198: JavaScript - Principais conceitos

Eval is Evil

eval ('(

{"evilcode":function(){

window.location="http://dsfsd342d.com";}()

})')

Page 199: JavaScript - Principais conceitos

Json

●Criando e parseando JSON

p = new Object ({"nome" : "sergio","idade" : 30 })console.log (JSON.stringify (p))console.log (JSON.parse (JSON.stringify (p)))

http://www.json.org/json2.js.

Browser mais antigos não inclue esse objeto JSON

Page 200: JavaScript - Principais conceitos

JSON

●Avaliando um objeto JSON

var myObject = eval('(' + myJSONtext + ')');

console.log (eval ("({'nome':'sergio', 'idade' : 30})"))

Page 201: JavaScript - Principais conceitos

JSON

●Avaliando um objeto JSON - Parser

var myObject = JSON.parse(myJSONtext [,reviver]);

console.log (JSON.parse ('{"nome":"sergio", "idade" : 30}'))

„Parse“ é mais rápido e mais seguro que o „eval“

Page 202: JavaScript - Principais conceitos

JSON - Parse

●Tratando erro

var jsonString = "{nao eh um json}”"try {var jsonObj = JSON.parse(jsonString);} catch(e) {console.log("json invalido:", e)

Page 203: JavaScript - Principais conceitos

JSON

●Avaliando um objeto JSON - Parser

var myObject = JSON.parse(myJSONtext [,reviver]);

console.log (JSON.parse ('{"nome":"sergio", "idade" : 30}'))

Page 204: JavaScript - Principais conceitos

JSON

●Parser

var jsontext = '{"nome":"sergio", "nascimento":"05 Janeiro 1981"}';

var pessoa = JSON.parse(jsontext);

var pessoa = JSON.parse(jsontext, function (key, value) {var bDate;if (key == "nascimento") {bDate = new Date(value);return bDate;}return value;});

Page 205: JavaScript - Principais conceitos

Json

●Convertendo para string

p = new Object ({"nome" : "sergio","idade" : 30 })console.log (JSON.stringify (p))console.log (JSON.parse (JSON.stringify (p)))

http://www.json.org/json2.js.

Browser mais antigos não inclue esse objeto JSON

JSON.stringify(value [, replacer] [, space])

Page 206: JavaScript - Principais conceitos

JSON

●Melhorando a leitura

p = new Object ({"nome" : "sergio","idade" : 30 })console.log (JSON.stringify (pessoa, null, "\t"))

JSON.stringify(value [, replacer] [, space])

Space pode ser um numero ou uma sting de formatação.

Page 207: JavaScript - Principais conceitos

JSON

●Formatando a saída

console.log (JSON.stringify (pessoa, function (key, value) {var bDate;if (key == "nascimento") {bDate = new Date (value)return ( bDate.getDate() +"/"+bDate.getMonth()+1 +"/"+ bDate.getFullYear() ) } return value;}));

Page 208: JavaScript - Principais conceitos

Date

●getDate() Retorna um número inteiro entre 1 e 31, que representa o dia do mês do objeto Date.

●getDay() Retorna um número inteiro do dia da semana. Domingo 0, segunda 1, terça 2, etc.

●getFullYear() Retorna o ano do objeto Date em números absolutos, por exemplo 1998.

●getMonth() Retorna o mês do objeto Date, um inteiro entre 0 e 11 (0 janeiro, 1 fevereiro, etc).

Page 209: JavaScript - Principais conceitos

XML e JSON

<animals><dog><name>Rufus</name><breed>labrador</breed></dog><dog><name>Marty</name><breed>whippet</breed></dog><cat name="Matilda"/></animals>

Passem este XML para o formato de Object - JSON

Page 210: JavaScript - Principais conceitos

Compatibilidade

●JavaScript, Jscript, ECMAScript, ActionScript●ECMAScript é uma linguagem de programação

baseada em scripts, padronizada pela Ecma International na especificação ECMA-262.

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

●JavaScript, Jscript e ActionScript são dialetos do ECMAScript

○Usando apenas elementos do ECMAScript, você garante compatibilidade.

http://www.jslint.com

Page 211: JavaScript - Principais conceitos

Boas práticas

Page 212: JavaScript - Principais conceitos

Boas práticas

Page 213: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Page 214: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Page 215: JavaScript - Principais conceitos

Variáveis Globais

„ JavaScript's biggest problem is its dependence on global variables, particularly implied global variables. If a variable is not explicitly declared (usually with the var statement), then JavaScript assumes that the variable was global. This can mask misspelled names and other problems.“

●JSLint

Page 216: JavaScript - Principais conceitos

Variáveis Globais

„ JavaScript's biggest problem is its dependence on global variables, particularly implied global variables. If a variable is not explicitly declared (usually with the var statement), then JavaScript assumes that the variable was global. This can mask misspelled names and other problems.“

●JSLint

Use sempre o var e declare antes de usar

Page 217: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

Page 218: JavaScript - Principais conceitos

Notações curtas

if(v){var x = v;

} else {var x = 10;

}

È equivalente a:

var x = v || 10;

Page 219: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

Modularize

Page 220: JavaScript - Principais conceitos

Modularize

●Modularizar sempre é uma boa prática. Dividir para conquistar.

○Bom exemplo: JQuery

Page 221: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

Modularize

Page 222: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/

Page 223: JavaScript - Principais conceitos

Validar

●Códigos válidos são codigos que atendem a um consenso.

Page 224: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/

Page 225: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/ Use ponto e

virgula

Page 226: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/

Use ponto e virgula

Escopo

Page 227: JavaScript - Principais conceitos

Escopo

●Bloco não cria escopo, apenas funções

function f(p) {if (p) {var a = 15

}console.log (a)

}f(1)

Page 228: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/ Use ponto e

virgula

Escopo

Use blocos

Page 229: JavaScript - Principais conceitos

Blocos

●Uso de blocos evita erros, use sempre mesmo onde não é obrigatório.

if (condicao) {..}else {

}

Page 230: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/ Use ponto e

virgula

Escopo

Use blocos

Page 231: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/ Use ponto e

virgula

Escopo

Use blocos

Comprima

Page 232: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/ Use ponto e

virgula

Escopo

Use blocos

ComprimaEval is Evil

Page 233: JavaScript - Principais conceitos

Boas práticasCódigos legíveis (nome de variáveis...)

Variáveis globais

Opte por notações curtas

ModularizeValide http://www.jslint.com/ Use ponto e

virgula

Escopo

Use blocos

Comprima

Consultem o jslint

Eval is Evil