Les funcions s贸n uns dels blocs de construcci贸 elementals en JavaScript. Una funci贸 茅s un procediment de JavaScript鈥攗n conjunt de sent猫ncies que performa una tasca o calcula un valor. Per tal de fer servir una funci贸, primer s'ha de defnir en alguna part de l'谩mbit en que es vol cridar.
Definir funcions
Una definici贸 de funci贸 (tamb茅 anomenada declaraci贸 de funci贸) consta de la paraula clau function
, seguit per:
- El nom de la funci贸.
- Una llista de par脿metres de la funci贸, continguts entre par猫ntesis i separats per comes.
- Les sent猫ncies de JavaScript que defineixen la funci贸, contingudes entre claus,
{ }
.
Per exemple, el codi seg眉ent defineix una funci贸 simple anomenada square
:
function square(number) {
return number * number;
}
La funci贸 square
t茅 un par脿metre, anomenat number
. Aquesta funci贸 consisteix d'una sent猫ncia que retorna l'argument de la funci贸 ( number
) multiplicat per ell mateix. La sent猫ncia return
especifica el valor retornat per la funci贸.
return number * number;
Els par脿metres primitius (com ara un nombre) s贸n passat a les funcions per valor; el valor 茅s passat a la funci贸, per貌 si la funci贸 canvia el valor del par脿metre, aquest canvia sense reflectir-se globalment o en la funci贸 de crida.
Si es pasa un objecte (p.ex. un valor no primitiu, com ara un Array
o un objecte definit per l'usuari) com a par脿metre i la funci贸 canvia les propietats de l'objecte, aquest canvi 茅s visible fora de la funci贸, com es mostra en l'exemple seg眉ent:
function myFunc(theObject) {
theObject.make = "Toyota";
}
var mycar = {make: "Honda", model: "Accord", year: 1998},
x,
y;
x = mycar.make; // x gets the value "Honda"
myFunc(mycar);
y = mycar.make; // y gets the value "Toyota"
// (the make property was changed by the function)
Nota: Assignar un nou objecte als par脿metres no t茅 cap efecte fora de la funci贸, ja que aquest canvia el valor del par脿metre i no del valor d'una de les propietats de l'objecte:
function myFunc(theObject) {
theObject = {make: "Ford", model: "Focus", year: 2006};
}
var mycar = {make: "Honda", model: "Accord", year: 1998},
x,
y;
x = mycar.make; // x gets the value "Honda"
myFunc(mycar);
y = mycar.make; // y still gets the value "Honda"
Mentre que la declaraci贸 de la funci贸 d'adalt 茅s sint脿cticament una sent猫ncia, les funcions tamb茅 poden ser creades per l' expressi贸 d'una funci贸. Aquesta funci贸 pot ser an貌nima; no t茅 cap nom. Per exemple, la funci贸 square
podria 茅sser definida com:
var square = function(number) {return number * number};
var x = square(4) //x gets the value 16
Tanmateix, un nom es pot proporcionar amb una expressi贸 d'una funci贸 i es pot utilitzar dins la funci贸 per referir-se a si mateix, o en un depurador per identificar la funci贸 en la tra莽a de la pila.
var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};
console.log(factorial(3));
Les expressions d'una funci贸 s贸n convenients quan es passa una funci贸 com a argument d'una altra funci贸. El seg眉ent exemple mostra la definici贸 d'una funci贸 de mapa, i la posterior crida amb una funci贸 an貌nima com a primer par脿metre.
function map(f,a) {
var result = [], // Create a new Array
i;
for (i = 0; i != a.length; i++)
result[i] = f(a[i]);
return result;
}
El codi seg眉ent:
map(function(x) {return x * x * x}, [0, 1, 2, 5, 10]);
retorna [0, 1, 8, 125, 1000].
En JavaScript, una funci贸 pot ser definida basant-se en una condici贸. Per exemple, la seg眉ent definici贸 de la funci贸 defineix myFunc
nom茅s si num
茅s igual 0:
var myFunc;
if (num == 0){
myFunc = function(theObject) {
theObject.make = "Toyota"
}
}
A m茅s de definir les funcions com ho fem aqu铆, podeu utilitzar el constructor de funci贸 per crear funcions d'una cadena en temps d'execuci贸, igual que eval()
.
Un m猫tode 茅s una funci贸 que es propietat d'un objecte. Podeu llegir m茅s sobre m猫todes i funcions a Treballar amb objectes.
Crida de funcions
Definir una funci贸 no l'executa. Definir una funci贸 simplement anomena la funci贸 i especifica que fer quan es crida la funci贸. Cridar la funci贸 en realitat realitza les accions especificades amb els par脿metres indicats. Per exemple, si es defineix la funci贸 square
, aquesta es cridaria de la seg眉ent manera:
square(5);
La sent猫ncia anterior crida la funci贸 amb un argument de 5. La funci贸 executa executes les seves sent猫ncies i retorna el valor 25.
Les funcions han de ser en un 脿mbit quan son cridades, per貌 la declaraci贸 de la funci贸 pot estar abans de la crida, com 茅s en aquest exemple:
console.log(square(5)); /* ... */ function square(n){return n*n}
L'脿mbit de la funci贸 es troba en la funci贸 en la qual s'ha declarat, o en el programa complet si s'ha declarat is the function in which it is declared, or the entire program if it is declared a nivell global.
Nota: Aix貌 nom茅s funciona quan definim la funci贸 fent servir la sintaxis d'adalt (p.ex. function funcName(){}
). El codi d'abaix no funcionaria.
console.log(square(5));
square = function (n) {
return n * n;
}
Els arguments d'una funci贸 no estan limitats a cadenes o nombres. Es pot passar objectes sencers a una funci贸. La funci贸 show_props
(definida a Treballant amb Objectes) 茅s un exemple d'una funci贸 que pren un objecte com a argument.
Una funci贸 pot cridar-se a si mateixa. Per exemple, aqu铆 baix trobem una funci贸 que is a function that calcula factorials recursivament:
function factorial(n){
if ((n == 0) || (n == 1))
return 1;
else
return (n * factorial(n - 1));
}
D'aquesta manera es podria calcular els factorials de l'煤 al cinc de la forma seg眉ent:
var a, b, c, d, e;
a = factorial(1); // a gets the value 1
b = factorial(2); // b gets the value 2
c = factorial(3); // c gets the value 6
d = factorial(4); // d gets the value 24
e = factorial(5); // e gets the value 120
Hi ha altres maneres de cridar funcions. Sovint hi ha casos en que s'ha de cridar la funci贸 din脿micament, o casos en que el nombre d'arguments d'una funci贸 pot variar o en els que el context de la crida a la funci贸 de s'ha d'establir a un objecte espec铆fic determinat en temps d'execuci贸. Resulta que les funcions s贸n per elles mateixes, objectes, i aquests objectes, al seu torn, tenen m猫todes (vegeu l'objecte funci贸). Un d'aquests, el m猫tode apply()
, pot ser usat per aconseguir aquest objectiu.
脌mbit d'una funci贸
Les variables definides dins d'una funci贸 no s贸n accessibles des de llocs de fora de la funci贸, ja que la variable es defineix nom茅s en l'脿mbit de la funci贸. No obstant aix貌, una funci贸 pot accedir a totes les variables i funcions definides dins de l'脿mbit en el qual es defineix. En altres paraules, una funci贸 definida en l'脿mbit global pot tenir acc茅s a totes les variables definides en l'脿mbit global. Una funci贸 definida dins d'una altra funci贸 pot accedir a totes les variables definides en la funci贸 pare i qualsevol altra variable a la qual la funci贸 pare t茅 acc茅s.
// The following variables are defined in the global scope
var num1 = 20,
num2 = 3,
name = "Chamahk";
// This function is defined in the global scope
function multiply() {
return num1 * num2;
}
multiply(); // Returns 60
// A nested function example
function getScore () {
var num1 = 2,
num2 = 3;
function add() {
return name + " scored " + (num1 + num2);
}
return add();
}
getScore(); // Returns "Chamahk scored 5"
脌mbit d'aplicaci贸 i la pila de la funci贸
Recursivitat
Una funci贸 pot referir-se i cridar-se a ella mateixa. Hi ha tres formes per a que una funci贸 es refereixi a ella mateixa:
- El nom de la funci贸
arguments.callee
- Una variable continguda en l'脿mbit que refereixi a la funci贸
Per exemple, la definici贸 de funci贸 seg眉ent:
var foo = function bar() {
// statements go here
};
Dins del cos de la funci贸, els seg眉ent s贸n tots equivalents:
bar()
arguments.callee()
foo()
Una funci贸 que es pot cridar a ella mateixa 茅s una funci贸 recursiva. En certa manera, la recursi贸 茅s an脿leg a un bucle. En ambd贸s casos el codi s'executa m煤ltiples vegades, i els dos requereixen d'una condici贸 (per evitar el bucle infinit, o m茅s aviat, la infinita recursi贸 en aquest cas). Per exemple, en el seg眉ent bucle:
var x = 0;
while (x < 10) { // "x < 10" is the loop condition
// do stuff
x++;
}
Es pot converitr en una funci贸 recursiva i una crida a una funci贸:
function loop(x) {
if (x >= 10) // "x >= 10" is the exit condition (equivalent to "!(x < 10)")
return;
// do stuff
loop(x + 1); // the recursive call
}
loop(0);
Tanmateix, alguns algorismes no poden ser bucles iteratius simples. Per exemple, obtenir tots els nodes de l'estructura d'arbre (e.x. el DOM) 茅s fa m茅s f脿cilment usant la recursi贸:
function walkTree(node) {
if (node == null) //
return;
// do something with node
for (var i = 0; i < node.childNodes.length; i++) {
walkTree(node.childNodes[i]);
}
}
Comparat amb la funci贸 loop
, cada crida recursiva que es crida a si mateixa fa varies crides recursives aqu铆.
脡s possible convertir qualsevol algorisme recursiu a un no recursiu, per貌 sovint la ll貌gica 茅s molt m茅s complexa i fer-ho requereix l'煤s d'una pila. De fet, la recursi贸 per si mateixa fa servir una pila: la funci贸 stack.
El comportament de l'stack es pot veure en el seg眉ent exemple:
function foo(i) {
if (i < 0)
return;
document.writeln('begin:' + i);
foo(i - 1);
document.writeln('end:' + i);
}
foo(3);
El qual mostra:
begin:3 begin:2 begin:1 begin:0 end:0 end:1 end:2 end:3
Funcions aniuades i closures
Es pot aniuar una funci贸 dins d'una altra funci贸. El contingut de la funci贸 aniuada (la de dins) 茅s privada a la funci贸 que la cont茅 (la de fora). Tamb茅 forma un closure.
- Un closure 茅s una expressi贸 (normalment una funci贸) que pot tenir variables lliures juntes amb un 脿mbit que lliga aquestes variables (que "closes" l'expresi贸).
Ja que una funci贸 aniuada 茅s un closure, aix貌 significa que una funci贸 aniuada pot "heredar" els arguments i variables de la funci贸 que la cont茅. En altres paraules, la funci贸 de dins cont茅 l'脿mbit de la funci贸 de fora.
Resumint:
- Es pot accedir a la funci贸 de dins nom茅s des de sent猫ncies que es troben dins la funci贸 de fora.
- La funci贸 de dins forma un closure: la funci贸 de dins pot usar els arguments i les variables de la funci贸 de fora, mentre que la funci贸 de fora no pot usar els arguments i les variables de la funci贸 de dins.
El seg眉ent exemple mostra funcions aniuades:
function addSquares(a,b) {
function square(x) {
return x * x;
}
return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41
At猫s que la funci贸 interior forma un closure, es pot cridar la funci贸 exterior i especificar els arguments per ambdues funcions, l'exterior i l'interior:
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3); // Think of it like: give me a function that adds 3 to whatever you give it
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
Preservaci贸 de les variables
Vegeu com 茅s preserva x
quan es retorna inside
. Un closure ha de preservar els arguments i variables en tots els 脿mbits de les seves refer猫ncies. Donat que cada crida proveeix potencialment diferents arguments, es crea una nova closure per cada crida que es fa a l'exterior. La mem貌ria pot ser alliberada nom茅s quan no es pot accedir m茅s al retorn d'inside.
Aix貌 no 茅s diferent d'emmagatzemar refer猫ncies en altres objectes, per貌 sovint 茅s menys obvi perque no podem establir les refer猫ncies directament ni inspeccionar-les.
Funcions aniuades m煤ltiples
Les funcions tamb茅 poden ser aniuades m煤ltiples, p.ex. Una funci贸 (A) cont茅 una funci贸 (B) que cont茅 una funci贸 (C). Ambudes funcions B i C formen aqu铆 closures, de forma que B pot accedir a A i C pot accedir a B. A m茅s a m茅s, ja que C pot accedir a B, el qual pot accedir a A, C tamb茅 pot accedir a A. D'aquesta forma, els closures poden contenir m煤ltiples 脿mbits; contenen recursivament l'脿mbit de les funcionsthey recursively contain the scope of the functions containing it. Aix貌 s'anomena scope chaining. (El perqu猫 s'anomena "chaining" s'explicar脿 m茅s tard.)
Considereu l'exemple seg眉ent:
function A(x) {
function B(y) {
function C(z) {
alert(x + y + z);
}
C(3);
}
B(2);
}
A(1); // alerts 6 (1 + 2 + 3)
En aquest exemple, C
accedeix a y
de B
i x
d'A
. Aix貌 茅s possible perqu猫:
B
forma un closure inclo茂entA
, 茅s a dir,B
pot accedir als arguments i les variables d'A
.C
forma un closure que inclouB
.- Com que el clousure de
B
inclouA
, el closure deC
inclouA
,C
pot accedir tant als arguments i les variables deB
com als d'A
. En altres paraules,C
encadena l'acc茅s als 脿mbits deB
iA
en aquest ordre.
El revers, per貌, no 茅s cert. A
no pot accedir a C
, perqu猫 A
no pot accedir a cap argument o variable de B
, de la qual C
n'茅s una variable. D'aquesta forma, C
roman privat nom茅s a B
.
Conflictes de noms
Quan dos arguments o variables de l'脿mbit del closure tenen el mateix nom, hi ha un conflicte de nom. Els 脿mbits m茅s interns tenen prioritat, de forma que l'脿mbit m茅s intern t茅 la m脿xima prioritat, mentre que l'脿mbit m茅s exterior no en t茅t. Aix貌 茅s l cadena d'脿mbit. El primer de la cadena 茅s l'脿mbit m茅s intern, i l'煤ltim 茅s l'脿mbit m茅s extern. Vegeu l'exemple seg眉ent:
function outside() {
var x = 10;
function inside(x) {
return x;
}
return inside;
}
result = outside()(20); // returns 20 instead of 10
El conflicte de nom ocorre en la sent猫ncia return x
i es troba entreand is between inside
's parameter x
and outside
's variable x
. The scope chain here is {inside
, outside
, global object}. Therefore inside
's x
takes precedences over outside
's x
, and 20 (inside
's x
) is returned instead of 10 (outside
's x
).
Closures
Els closures son unes de les caracter铆stiques m茅s poderoses de JavaScript. JavaScript permet l'aniuament de funcions i concedeix a la funci贸 interior acc猫s total a totes les variables i funcions definides dins de la funci贸 exterior (i totes les altres variables i funcions que la funci贸 exterior t茅 acc茅s). Tanmateix, la funci贸 exterior no t茅 acc茅s a les variables i funcions definides dins la funci贸 interior. Aix貌 proveeix seguretat a les variables de la funci贸 interior. A m茅s, ja que la funci贸 interior t茅 acc茅s a l'脿mbit de la funcio exterior, les variables i funcions definides en la funci贸 de fora viuran m茅s que la mateixa funci贸 de fora, si la funci贸 interior se les arregla per sobreviure a partir de la vida de la funci贸 exterior. Un closure es crea quan la funci贸 interior 茅s d'alguna manera accessible per qualsevol 脿mbit fora de la funci贸 exterior.
var pet = function(name) { // The outer function defines a variable called "name"
var getName = function() {
return name; // The inner function has access to the "name" variable of the outer function
}
return getName; // Return the inner function, thereby exposing it to outer scopes
},
myPet = pet("Vivie");
myPet(); // Returns "Vivie"
Pot ser molt m茅s complex que el codi d'adalt. Un objecte que cont茅 m猫todes per manipular les variables interior d'una funci贸 exterior poder ser retornades.
var createPet = function(name) {
var sex;
return {
setName: function(newName) {
name = newName;
},
getName: function() {
return name;
},
getSex: function() {
return sex;
},
setSex: function(newSex) {
if(typeof newSex == "string" && (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
sex = newSex;
}
}
}
}
var pet = createPet("Vivie");
pet.getName(); // Vivie
pet.setName("Oliver");
pet.setSex("male");
pet.getSex(); // male
pet.getName(); // Oliver
En els codis d'adalt, la variable name
de la funci贸 exterior 茅s accesible des de les funcions interiors, i no hi ha cap altra forma d'accedir a les variables interiors apart the fer-ho a trav茅s de les funcions interiors. Les variables interiors de la funci贸 interior es comporten com a magatzems segurs per a les funcions interiors. Aquestes emmagatzemen de forma "persistent", per貌 segures, les dades amb que les funcions interiors han de treballar. Les funcions no tenen ni tant sols ser assignades a una variable, tampoc han de tenir un nom.
var getCode = (function(){
var secureCode = "0]Eal(eh&2"; // A code we do not want outsiders to be able to modify...
return function () {
return secureCode;
};
})();
getCode(); // Returns the secureCode
Hi ha, tanmateix, un nombre de trampes o obstacles que vigilar quan es fa servir closures. Si una closure defineix una variable amb el mateix nom que el nom de la variable que es troba en l'脿mbit exterior, no hi ha cap manera de referir-se una altra vegada a la variable de l'脿mbit exterior.
var createPet = function(name) { // Outer function defines a variable called "name"
return {
setName: function(name) { // Enclosed function also defines a variable called "name"
name = name; // ??? How do we access the "name" defined by the outer function ???
}
}
}
La variable m脿gica this
茅s for莽a delicada en closures. S'ha de saber fer servir acuradament, ja que al que this
es refereix depen completament del lloc on la funci贸 es cridada, i no d'on 茅s definida.
脷s de l'objecte arguments
Els arguments d'una funci贸 茅s mantenen en un objecte semblant a un array. Dins una funci贸, 茅s pot accedir als arguments passats a la funci贸 de la seg眉ent forma:
arguments[i]
On i
茅s el nombre ordinal de l'argument, que comen莽a amb zero. Aix铆, el primer argument passat a una funci贸 seria arguments[0]
. El nombre total d'arguments 茅s indicat per arguments.length
.
Fent servir l'objecte arguments
, es pot cridar una funci贸 amb m茅s arguments dels que formament est脿 declarat a acceptar. Aix貌 sovint 茅s 煤til si no es sap amb anticipaci贸 quants arguments ser脿n passats a la funci贸. Es pot fer servir arguments.length
per determinar el nombre d'arguments que se li passen a la funci贸, i despr茅s accedir a cada arguments fent 煤s de l'objecte arguments
.
Per exemple, sospeseu una funci贸 que concatena diverses cadenes. L'煤nic argument formal per la funci贸 茅s una cadena que especifica els car脿cters que separen els 铆tems per concatenar. La funci贸 茅s defineix com:
function myConcat(separator) {
var result = "", // initialize list
i;
// iterate through arguments
for (i = 1; i < arguments.length; i++) {
result += arguments[i] + separator;
}
return result;
}
Es pot passar qualsevol nombre d'arguments a aquesta funci贸, i concatena cada argument dins d'una "llista" de cadenes:
// returns "red, orange, blue, "
myConcat(", ", "red", "orange", "blue");
// returns "elephant; giraffe; lion; cheetah; "
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// returns "sage. basil. oregano. pepper. parsley. "
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
Nota: la variable arguments
茅s semblant a un array, per貌 no 茅s un array. S'assembla a un array en que t茅 un 铆ndex numerat i la propietat length
. Tanmateix, no poseeix tots els m猫todes de manipulaci贸 d'un array.
Vegeu l'objecte Function
en la refer猫ncia de JavaScript per m茅s informaci贸.
Funcions com a controladors d'events
En JavaScript, els controladors d'events DOM s贸n funcions (a difer猫ncia dels objectes que contenen un m猫tode handleEvent
en altres enlla莽os de llenguatge DOM). Les funcions passen un objecte d'event com el primer i 煤nic par脿metre. Com qualsevol altre par脿metre, si l'objecte event no s'ha de fer servir, es pot ometre de la llista de par脿metres formals.
Alguns probables objectius d'un document HTML inclouen: window
(l'objecte Window
, incloent frames), document
(l'objecte HTMLDocument
), i elements (Element
objects). En el HTML DOM, els objectius d'events tenen propietats de controladors d'events. Aquestes propietats ser脿n nomes d'events amb min煤scules amb el prefix "on", p.ex. onfocus
. Una altra forma de fer, m茅s robusta, d'afegir detectors d'events 茅s ser prove茂t pel nivell 2 d'events DOM.
Nota: Events formen part del DOM, no de JavaScript. (JavaScript nom茅s proveeix un enlla莽 al DOM.)
El seg眉ent exemple assigna una funci贸 al controlador d'events "focus" d'una finestra.
window.onfocus = function() {
document.body.style.backgroundColor = 'white';
};
Si una funci贸 茅s assignada a una variable, es pot assignar la variable a un controlador d'event. El codi seg眉ent assigna una funci贸 a la variable setBGColor
.
var setBGColor = new Function("document.body.style.backgroundColor = 'white';");
Es pot fer servir aquesta variable per assignar una funci贸 a un controlador d'event de diverses formes. Aqu铆 mostrem dues formes de fer-ho:
- scripting amb propietats d'event DOM HTML
document.form1.colorButton.onclick = setBGColor;
- Atribut event HTML
<input name="colorButton" type="button" value="Change background color" onclick="setBGColor();"/>
Un controlador d'events establert d'aquesta manera, 茅s de fet, una funci贸, named after the attribute, wrapped around the specified code. Aix貌 explica perqu猫 els par猫ntesis en "
setBGColor()
" s贸n necessaris aqu铆 (en lloc de nom茅s "setBGColor
"). 脡s equivalent a:document.form1.colorButton.onclick = function onclick(event) { setBGColor(); };
Vegeu com l'objecte event object es passa a aquesta funci贸 com a par脿metre
event
. Aix貌 permet al codi espec铆fic utilitzar l'objecte Event:<input ... onclick="alert(event.target.tagName);"/>
Com qualsevol altra propietat que fa refer猫ncia a una funci贸, el controlador d'event pot comportat-se com un m猫tode, i this
faria refer猫ncia a l'element que cont茅 el controlador d'event. En l'exemple seg眉ent, la funci贸 que fa refer猫ncia onfocus
es crida amb this
que equival a window
.
window.onfocus();
Un error com煤 de principiants de Javascript 茅s snnexar par猫ntesis i/o par脿metres al final de la variable p.ex. cridar un controlador d'event quan es fa l'assignaci贸. Afeguir aquests par猫ntesis assignar脿 el valor returned from calling the event handler, que sovint 茅s undefined
(si la funci贸 no retorna res), rather than the event handler itself:
document.form1.button1.onclick = setBGColor();
Per passar par脿metres a un controlador d'event, el controlador ha d'estar embolcallat dins d'una altra funci贸 com la seg眉ent:
document.form1.button1.onclick = function() {
setBGColor('some value');
};
Funcions predefinides
JavaScript t茅 diverses funcions predefinides que poden emprar-se des de qualsevol 脿mbit:
- eval
- isFinite
- isNaN
- parseInt and parseFloat
- Number and String
- encodeURI, decodeURI, encodeURIComponent, and decodeURIComponent (all available with Javascript 1.5 and later).
Les seccions seg眉ents introdueixen aquestes funcions. Vegeu el JavaScript Reference per informaci贸 detallada de totes aquestes funcions.
Funci贸 eval
La funci贸 eval
avalua una cadena del codi de JavaScript sense fer refer猫ncia a cap objecte en particular. La sintaxi de eval
茅s:
eval(expr);
on expr
茅s una cadena per ser avaluada.
Si la cadena representa una expressi贸, eval
evalua l'expressi贸. Si l'argument representa una sent猫ncia o m茅s de JavaScript, eval performa aquestes sent猫ncies. L'脿mbit del codi d'eval
茅s id猫ntic a l'脿mbit del codi de crida. No s'ha de cridar eval
per avaluar una expressi贸 aritm猫ica; JavaScript aritm猫tiques autom脿ticament.
Funci贸 isFinite
La funci贸 isFinite
avalua un argument per determinar si 茅s un nombre finit. La sintaxi d' isFinite
茅s:
isFinite(number);
on number
茅s el nombre que s'ha d'avaluar.
Si l'argument 茅s NaN
(no un nombre), infinit positiu o infinit negatiu, aquest m猫tode retorna false
, sin贸 retornar脿 true
.
El codi seg眉ent comprova si ClientInput per determinar si 茅s un nombre finit.
if(isFinite(ClientInput)){
/* take specific steps */
}
Funci贸 isNaN
La funci贸 isNaN
avalua un argument que determina si 茅s "NaN." La sintaxi d'isNaN
茅s:
isNaN(testValue);
On testValue
茅s el valor que es vol avaluar.
Les funcions parseFloat
i parseInt
retornen "NaN" quan avaluen un valor que no 茅s un nombre. isNaN
retorna true si passa "NaN," i false sin贸 ho fa.
El codi seg眉ent avalua floatValue
que determina si 茅s un nombre i despr茅s crida un procediment de la manera adequada:
var floatValue = parseFloat(toFloat);
if (isNaN(floatValue)) {
notFloat();
} else {
isFloat();
}
Funcions parseInt i parseFloat
Les dos funcions "parse", parseInt
i parseFloat
, retornen un valor num猫ric quan es d贸na com a argument una cadena.
La sintaxi de parseFloat
茅s:
parseFloat(str);
On parseFloat
parses el seu argument,la cadena str
, and attempts to return a floating-point number. If it encounters a character other than a sign (+ or -), a numeral (0-9), a decimal point, or an exponent, then it returns the value up to that point and ignores that character and all succeeding characters. If the first character cannot be converted to a number, it returns "NaN" (not a number).
La sintaxi de parseInt
茅s:
parseInt(str [, radix]);
parseInt
interpreta el seu primer argument, la cadena de car脿cters str
, i intenta retornar un nombre sencer de la base especificada pel par脿metre opcional radix
. Per exemple, si radix
茅s 10 aix貌 indica que es demana una conversi贸 al sistema decimal (base 10), si 茅s 8 octal, si 茅s 16 hexadecimal, etc猫tera. Per a bases majors que 10 es fan anar lletres de l'alfabet per a indicar els numerals majors que 9. Per exemple, per a nombres hexadecimals (base 16), s'empren les lletres de la A fins la F.
Si parseInt
troba un car脿cter que no 茅s un numeral de la base especificada, aquest 茅s ignorat aix铆 com la resta de car脿cters que el segueixen i retorna el valor sencer interpretat fins aquest punt. Si el primer car脿cter no es pot convertir a un nombre de la base especificada es retorna "NaN". La funci贸 parseInt
trunca la cadena de car脿cters a valors sencers.
Funcions Number i String
Les funcions Number
i String
permeten convertir un objecte a un nombre o a una cadena. La sintaxi d'aquestes funcions 茅s:
var objRef;
objRef = Number(objRef);
objRef = String(objRef);
On objRef
茅s una refer猫ncia a l'objecte. Number fa servir el valorOf() method of the object; String uses the toString() method of the object.
L'exemple seg眉ent converteix l'objecte Date
a una cadena de car脿cters f脿cilment interpretrable per humans.
var D = new Date(430054663215),
x;
x = String(D); // x equals "Thu Aug 18 04:37:43 GMT-0700 (Pacific Daylight Time) 1983"
L'exemple seg眉ent converteix l'objecte String
a l'objecte Number
.
var str = "12",
num;
num = Number(str);
Es pot comprovar utilitzant el m猫tode del DOM write()
i l'operador de JavaScript typeof
.
var str = "12",
num;
document.write(typeof str);
document.write("<br/>");
num = Number(str);
document.write(typeof num);
Funcions escape i unescape (Obsoletes a partir de JavaScript 1.5)
Les funcions escape
i unescape
no funcionen correctamenr per a car脿cter que no siguin ASCII i han quedat obsoletes. En la versi贸 de JavaScript 1.5 i posteriors, es fa servir encodeURI
, decodeURI
, encodeURIComponent
, i decodeURIComponent
.
Les funcions escape
i unescape
permeten codificar i descodificar cadenes. La funci贸 escape
retorna function returns the hexadecimal encoding of an argument in the ISO Latin character set. The unescape
function returns the ASCII string for the specified hexadecimal encoding value.
La sintaxi d'aquestes funcions 茅s:
escape(string);
unescape(string);
Aquestes funcions s'usen principalment amb JavaScript que s'executa al servidor per codificar i descodificar parells de clau/valor en URLs.