Funcions

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:

  1. El nom de la funci贸
  2. arguments.callee
  3. 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:

  1. bar()
  2. arguments.callee()
  3. 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猫:

  1. B forma un closure inclo茂ent A, 茅s a dir, B pot accedir als arguments i les variables d'A.
  2. C forma un closure que inclou B.
  3. Com que el clousure de B inclou A, el closure de C inclou A, C pot accedir tant als arguments i les variables de B com als d'A. En altres paraules, C encadena l'acc茅s als 脿mbits de B i A 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:

  1. scripting amb propietats d'event DOM HTML
    document.form1.colorButton.onclick = setBGColor;
    
  2. 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:

Les seccions seg眉ents introdueixen aquestes funcions. Vegeu el JavaScript Reference per informaci贸 detallada de totes aquestes funcions.

Funci贸 eval

La funci贸 evalavalua 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.