<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es_ES"><generator uri="https://jekyllrb.com/" version="4.3.2">Jekyll</generator><link href="https://www.manualweb.net/feed/javascript.xml" rel="self" type="application/atom+xml" /><link href="https://www.manualweb.net/" rel="alternate" type="text/html" hreflang="es_ES" /><updated>2026-01-29T16:33:46+01:00</updated><id>https://www.manualweb.net/feed/javascript.xml</id><title type="html">Manual Web | Javascript</title><subtitle>Tutoriales de programación en español.
</subtitle><author><name>manual_web</name></author><entry><title type="html">Descargar Manual Javascript</title><link href="https://www.manualweb.net/javascript/descargar-manual-javascript/" rel="alternate" type="text/html" title="Descargar Manual Javascript" /><published>2026-01-29T16:33:46+01:00</published><updated>2026-01-29T16:33:46+01:00</updated><id>https://www.manualweb.net/javascript/download</id><content type="html" xml:base="https://www.manualweb.net/javascript/descargar-manual-javascript/"><![CDATA[<p>El contenido de <a href="https://www.manualweb.net">Manual Web</a> está disponible de forma gratuita para que pueda ser consultado online sin ningún coste. Si bien <strong>entendemos que pueda ser de utilidad el poder consultar de forma offline y de forma actualizada el contenido de la web</strong>.</p>

<p>En esta página te puedes <strong>decargar el Manual Javascript de Manual Web</strong> en dos modalidades. Por un lado te puedes <strong>descargar el manual tal cual está hoy</strong> o bien <strong>descargarte el manual y estar actualizado todos los meses</strong> con las novedades que se vayan incorporando al manual.</p>

<p>También puedes buscar <a href="/descargas">descargarte uno a uno el resto de manuales que tenemos publicados en Manual Web</a>.</p>

<p>Incluso puedes <a href="/descargas/#todos-los-manuales">descargarte todos los manuales que tenemos publicados, así como mantenerte actualizado mes a mes con las actualizaciones que estos manuales tengan e incluso la incorporación de nuevos</a> manuales incluida en el precio.</p>

<h2 id="descargar-manual-javascript">Descargar Manual Javascript</h2>

<script src="https://gumroad.com/js/gumroad-embed.js"></script>

<div class="gumroad-product-embed"><a href="https://lineadecodigo.gumroad.com/l/manualjavascript">Loading...</a></div>]]></content><author><name>manual_web</name></author><category term="manual" /><category term="tutorial" /><category term="manual_javascript" /><category term="tutorial_javascript" /><category term="javascript" /><category term="descargar" /><summary type="html"><![CDATA[Descargar Manual Javascript de Manual web en la modalidad de manual actual o en la modalidad de actualizaciones continuas.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cadenas de Texto</title><link href="https://www.manualweb.net/javascript/cadenas-de-texto/" rel="alternate" type="text/html" title="Cadenas de Texto" /><published>2026-01-29T16:33:46+01:00</published><updated>2026-01-29T16:33:46+01:00</updated><id>https://www.manualweb.net/javascript/cadenas-de-texto</id><content type="html" xml:base="https://www.manualweb.net/javascript/cadenas-de-texto/"><![CDATA[<p>Para crear una cadena de texto <a href="https://www.manualweb.net/javascript/">Javascript</a> simplemente tendremos que asignar una cadena de texto, delimitada por comillas o dobles comillas, a una variable.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">cadena</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Soy una cadena</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">otra_cadena</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Yo también soy una cadena</span><span class="dl">'</span><span class="p">;</span>
</code></pre></div></div>

<p>Es importar que en estos momentos las variables que hemos creado son del tipo primitivo <strong>“string”</strong>, lo cual podremos comprar ejecutando un sencillo <code class="language-plaintext highlighter-rouge">typeof</code> sobre la variable.</p>

<h2 id="concatenar-cadenas-de-texto">Concatenar Cadenas de texto</h2>

<p>Si queremos concatenar cadenas de texto <a href="https://www.manualweb.net/javascript/">Javascript</a> podemos recurrir al operador <code class="language-plaintext highlighter-rouge">+</code>, el cual, a parte de servirnos para sumar números nos permite concatenar las cadenas de texto.</p>

<p>Por ejemplo podríamos utilizarlo de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">nombre</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Víctor</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">saludo</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Hola, </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">nombre</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">!</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="cadenas-de-texto-multi-línea">Cadenas de Texto Multi-línea</h2>

<p>En el caso de que estemos manejando cadenas de texto <a href="https://www.manualweb.net/javascript/">Javascript</a> muy largas podemos codificarlas como cadenas de texto multi-línea. Es decir, podremos distribuir su contenido en varias líneas.</p>

<p>Para ello tenemos tres alternativas. La primera consiste en utilizar una barra invertida al final de cada línea de texto. Quedaría de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">cadena</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">En un lugar de la Mancha, </span><span class="se">\</span><span class="s2">
de cuyo nombre no quiero acordarme, </span><span class="se">\</span><span class="s2">
no ha mucho tiempo que vivía </span><span class="se">\</span><span class="s2">
un hidalgo de los de lanza en astillero, </span><span class="se">\</span><span class="s2">
adarga antigua, rocín flaco y galgo corredo</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<p>La segunda opción consiste en concatenar cadenas de texto <a href="https://www.manualweb.net/javascript/">Javascript</a> como hemos visto en el apartado anterior. En este caso, nuestro código, quedaría de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">cadena</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">En un lugar de la Mancha, </span><span class="dl">"</span> <span class="o">+</span>
<span class="dl">"</span><span class="s2">de cuyo nombre no quiero acordarme, </span><span class="dl">"</span> <span class="o">+</span>
<span class="dl">"</span><span class="s2">no ha mucho tiempo que vivía </span><span class="dl">"</span> <span class="o">+</span>
<span class="dl">"</span><span class="s2">un hidalgo de los de lanza en astillero, </span><span class="dl">"</span> <span class="o">+</span> 
<span class="dl">"</span><span class="s2">adarga antigua, rocín flaco y galgo corredo</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<p>La última opción que tendríamos sería utilizando la comilla simple invertida, esto nos permite poner directamente el contenido en varias líneas sin utilizar un operador o carácter por medio. Por lo que queda más claro.</p>

<p>En este caso el código quedaría de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">cadena</span> <span class="o">=</span> <span class="s2">`En un lugar de la Mancha,
de cuyo nombre no quiero acordarme, 
no ha mucho tiempo que vivía 
un hidalgo de los de lanza en astillero,  
adarga antigua, rocín flaco y galgo corredo`</span><span class="p">;</span>
</code></pre></div></div>

<p>Es importante saber que en este caso los saltos de línea son guardados como tal, por lo que tendremos que tenerlo en cuenta a la hora de procesar este tipo de cadenas.</p>

<h2 id="cadenas-de-texto-con-plantillas">Cadenas de Texto con Plantillas</h2>

<p>La definición de cadenas de texto <a href="https://www.manualweb.net/javascript/">Javascript</a> mediante la comilla simple invertida nos da la posibilidad también de utilizar plantillas que inserten variables en mitad del texto. De esta manera podremos evitar el realizar concatenaciones del contenido de varias cadenas.</p>

<p>Las variables que queramos insertar dentro de la plantilla se reflejarán mediante la estructura <code class="language-plaintext highlighter-rouge">${variable}</code>.</p>

<p>El código que hemos representado anteriormente para poder concatenar cadenas quedaría, mediante en uso de plantillas en cadenas de texto, de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">nombre</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Víctor</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">saludo</span> <span class="o">=</span> <span class="s2">`Hola, </span><span class="p">${</span><span class="nx">nombre</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="el-objeto-string">El objeto String</h2>

<p>En <a href="https://www.manualweb.net/javascript/">Javascript</a>, además del tipo de cadena primitivo, existe el objeto <a href="https://www.w3api.com/Javascript/String/"><code class="language-plaintext highlighter-rouge">String</code></a>. Así podremos definir cadenas de texto mediante este objeto, y lo que es más interesante, podremos manipularlas mediante sus propiedades y métodos.</p>

<p>Así podemos crear un <a href="http://www.w3api.com/javascript/String">objeto String</a> de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">cadena</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">String</span><span class="p">(</span><span class="dl">"</span><span class="s2">cadena de texto</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<blockquote>
  <p>Es importante saber que si aplicamos el operador <code class="language-plaintext highlighter-rouge">typeof</code> sobre un tipo de dato primitivo cadena nos devolverá “string”. Pero silo hacemos mediante un objeto <a href="https://www.w3api.com/Javascript/String/"><code class="language-plaintext highlighter-rouge">String</code></a>, nos devolverá “object”</p>
</blockquote>

<h2 id="tamaño-de-una-cadena-de-texto">Tamaño de una cadena de texto</h2>

<p>El objeto <a href="https://www.w3api.com/Javascript/String/"><code class="language-plaintext highlighter-rouge">String</code></a> tiene una propiedad llamada <a href="https://www.w3api.com/Javascript/String/length"><code class="language-plaintext highlighter-rouge">.length</code></a> que nos devuelve el tamaño de la cadena de texto. Su sintaxis es la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">.</span><span class="nx">length</span>
</code></pre></div></div>

<p>De esta forma podríamos mostrar el tamaño de una cadena por consola mediante el siguiente código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">cadena</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Soy una cadena</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El tamaño de </span><span class="p">${</span><span class="nx">cadena</span><span class="p">}</span><span class="s2"> es de </span><span class="p">${</span><span class="nx">cadena</span><span class="p">.</span><span class="nx">length</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
</code></pre></div></div>]]></content><author><name>manual_web</name></author><category term="string" /><category term="cadena_texto" /><category term="typeof" /><category term="length" /><summary type="html"><![CDATA[Las cadenas de texto en Javascript pueden ser creadas mediante texto delimitado por comillas simples o dobles o bien mediante el objeto String.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Promesas en Javascript</title><link href="https://www.manualweb.net/javascript/promesas-en-javascript/" rel="alternate" type="text/html" title="Promesas en Javascript" /><published>2024-01-25T00:00:00+01:00</published><updated>2024-01-26T00:00:00+01:00</updated><id>https://www.manualweb.net/javascript/promesas-en-javascript</id><content type="html" xml:base="https://www.manualweb.net/javascript/promesas-en-javascript/"><![CDATA[<h2 id="qué-son-las-promesas-en-javascript">¿Qué son las promesas en Javascript?</h2>

<p>Las promesas en <a href="https://www.manualweb.net/javascript/">Javascript</a> son un tipo de objeto sofisticado y poderoso que <strong>representa la terminación o el fracaso eventual de una operación asíncrona</strong>.</p>

<p>Este concepto es crucial en el mundo del desarrollo de <a href="https://www.manualweb.net/javascript/">Javascript</a>, especialmente cuando se trata de <strong>operaciones asíncronas</strong> que tardan un tiempo en completarse, como puedes ser el caso de la lectura de archivos o las solicitudes de red.</p>

<p>Las promesas <strong>nos aportan una estructura y una organización</strong> muy necesarias, permitiendo a los desarrolladores manejar estas operaciones asíncronas de una manera mucho más intuitiva, fácil de entender y manejable.</p>

<p>Lo hacen <strong>proporcionando una forma sistemática de adjuntar callbacks para el éxito o el fracaso de las operaciones asíncronas</strong>, mejorando así la legibilidad y la mantenibilidad del código.</p>

<h2 id="estados-de-una-promesa">Estados de una Promesa</h2>

<p>Es esencial que comprendamos los diferentes estados por los que puede pasar una Promesa cuando tratamos de gestionarla en el desarrollo de software. Estos estados son una parte fundamental del ciclo de vida de una Promesa y pueden influir significativamente en cómo se maneja la Promesa en el código. Los estados por los que puede pasar una Promesa son los siguientes:</p>

<ul>
  <li><strong>Pending (pendiente),</strong> este es el estado inicial de una Promesa. En este estado, la Promesa aún no se ha resuelto ni rechazado. Esencialmente, la tarea que la Promesa representa todavía está en curso.</li>
  <li><strong>Fullfilled (cumplida),</strong> este es el estado que indica que la Promesa se ha resuelto con éxito. En otras palabras, la tarea que la Promesa representaba se ha completado de manera satisfactoria.</li>
  <li><strong>Rejected (rechazada),</strong> este estado indica que ha ocurrido un error en la tarea que la Promesa representaba. En este caso, la Promesa se ha rechazado debido a este error.</li>
</ul>

<h2 id="definir-una-promesa">Definir una Promesa</h2>

<p>Para definir una promesa simplemente deberemos de crear un nuevo objeto de tipo <a href="https://w3api.com/Javascript/Promise/"><code class="language-plaintext highlighter-rouge">Promise</code></a>.</p>

<p>Una promesa en Javascript se define utilizando la palabra clave <code class="language-plaintext highlighter-rouge">new</code> seguida de la clase <a href="https://w3api.com/Javascript/Promise/"><code class="language-plaintext highlighter-rouge">Promise</code></a>. La clase <a href="https://w3api.com/Javascript/Promise/"><code class="language-plaintext highlighter-rouge">Promise</code></a> acepta una función como argumento, que a su vez acepta dos parámetros: <a href="https://w3api.com/Javascript/Promise/resolve/"><code class="language-plaintext highlighter-rouge">resolve</code></a> y <a href="https://w3api.com/Javascript/Promise/reject"><code class="language-plaintext highlighter-rouge">reject</code></a>.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">promesa</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">,</span><span class="nx">reject</span><span class="p">))</span>
</code></pre></div></div>

<p>Estos parámetros son funciones que se invocan para indicar el éxito o el fracaso de la operación asíncrona.</p>

<p>De esta manera podríamos definir la siguiente promesa:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">promesa</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span><span class="o">*</span><span class="mi">6</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">numero</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
        <span class="nf">resolve</span><span class="p">({</span><span class="dl">"</span><span class="s2">mensaje</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">Número Correcto</span><span class="dl">"</span><span class="p">,</span><span class="dl">"</span><span class="s2">numero</span><span class="dl">"</span><span class="p">:</span><span class="nx">numero</span><span class="p">});</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="nf">reject</span><span class="p">({</span><span class="dl">"</span><span class="s2">mensaje</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">Número Incorrecto</span><span class="dl">"</span><span class="p">,</span><span class="dl">"</span><span class="s2">numero</span><span class="dl">"</span><span class="p">:</span><span class="nx">numero</span><span class="p">});</span>
    <span class="p">}</span>
<span class="p">});</span>
</code></pre></div></div>

<p>En este ejemplo, la promesa simula el lanzamiento de un dado y nos devolverá una condición correcta mediante <a href="https://w3api.com/Javascript/Promise/resolve/"><code class="language-plaintext highlighter-rouge">resolve</code></a> si el dado ha sacado un 3 y si no nos devolverá una condición errónea mediante <a href="https://w3api.com/Javascript/Promise/reject"><code class="language-plaintext highlighter-rouge">reject</code></a>.</p>

<h2 id="cómo-se-consume-una-promesa-en-javascript">¿Cómo se consume una promesa en Javascript?</h2>

<p>Una vez que ya sabemos definir una promesa mediante el objeto <a href="https://w3api.com/Javascript/Promise/"><code class="language-plaintext highlighter-rouge">Promise</code></a> vamos a ver cómo se consume. Para ello tenemos que saber que existen tres métodos principales para su gestión: <a href="https://w3api.com/Javascript/Promise/then"><code class="language-plaintext highlighter-rouge">.then()</code></a> que nos permite indicar una función para el éxito y otra para el fracaso de la promesa, <a href="https://w3api.com/Javascript/Promise/catch"><code class="language-plaintext highlighter-rouge">.catch()</code></a> que nos permite gestionar un error en la ejecución de la operación de la promesa y <a href="https://w3api.com/Javascript/Promise/finally"><code class="language-plaintext highlighter-rouge">.finally()</code></a> que será el último método en ejecutarse y que nos permitirá realizar gestiones de cierre o eliminación de los recursos en la operación.</p>

<p>Pero vamos a ver estos métodos un poco más en detalle:</p>

<h3 id="then">.then()</h3>

<p>El método <a href="https://w3api.com/Javascript/Promise/then"><code class="language-plaintext highlighter-rouge">.then()</code></a> se encadena a la promesa y toma dos argumentos: una función de devolución de l<strong>lamada para el éxito</strong> y otra para <strong>el fracaso de la promesa</strong>. Es decir, la función de devolución de llamada de éxito se ejecuta cuando se resuelve la promesa, mientras que la de fracaso se ejecuta cuando se rechaza.</p>

<p>La sintaxis del método <a href="https://w3api.com/Javascript/Promise/then"><code class="language-plaintext highlighter-rouge">.then()</code></a></p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">p</span><span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">onFulfilled</span><span class="p">[,</span> <span class="nx">onRejected</span><span class="p">]);</span>
<span class="nx">p</span><span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">value</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="c1">// fulfillment }, reason =&gt; { // rejection });</span>
</code></pre></div></div>

<p>De esta manera podemos utilizar el método <a href="https://w3api.com/Javascript/Promise/then"><code class="language-plaintext highlighter-rouge">.then()</code></a> dentro de nuestro ejemplo de promesa anterior de la siguiente forma para gestionar una situación de cumplimiento:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">promesa</span><span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">valor</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">valor</span><span class="p">.</span><span class="nx">mensaje</span><span class="p">)});</span>
</code></pre></div></div>

<p>O bien mediante el código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">promesa</span><span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">valor</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">valor</span><span class="p">.</span><span class="nx">mensaje</span><span class="p">)},</span>
             <span class="nx">rechazo</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">rechazo</span><span class="p">.</span><span class="nx">mensaje</span><span class="p">)});</span>
</code></pre></div></div>

<p>Para gestionar tanto la situación de cumplimiento como la situación de rechazo.</p>

<h3 id="catch">.catch()</h3>

<p>El método <a href="https://w3api.com/Javascript/Promise/catch/"><code class="language-plaintext highlighter-rouge">.catch()</code></a> se utiliza para manejar cualquier error que pueda ocurrir durante la ejecución de la operación asíncrona. Es similar al segundo argumento del método <a href="https://w3api.com/Javascript/Promise/then"><code class="language-plaintext highlighter-rouge">.then()</code></a>, pero tiene la ventaja de poder manejar errores de varias promesas en una cadena de promesas.</p>

<p>La sintaxis del método <a href="https://w3api.com/Javascript/Promise/catch/"><code class="language-plaintext highlighter-rouge">.catch()</code></a> es la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">p</span><span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">onRejected</span><span class="p">);</span> 
<span class="nx">p</span><span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">reason</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// rejection });</span>
</code></pre></div></div>

<p>Si aplicamos el método <a href="https://w3api.com/Javascript/Promise/catch/"><code class="language-plaintext highlighter-rouge">.catch()</code></a> en la promesa que habíamos definido al principio tendremos lo siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">promesa</span><span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">valor</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">valor</span><span class="p">.</span><span class="nx">mensaje</span> <span class="o">+</span> <span class="dl">"</span><span class="s2"> </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">valor</span><span class="p">.</span><span class="nx">numero</span><span class="p">)});</span>
</code></pre></div></div>

<h3 id="finally">.finally()</h3>

<p>Por último, <a href="https://w3api.com/Javascript/Promise/finally/"><code class="language-plaintext highlighter-rouge">.finally()</code></a> es un método que se ejecuta siempre, independientemente de si la promesa se resolvió o se rechazó. Esto es útil para limpiar o finalizar cualquier recurso que se haya utilizado durante la operación asíncrona.</p>

<p>La sintaxis del método <a href="https://w3api.com/Javascript/Promise/finally/"><code class="language-plaintext highlighter-rouge">.finally()</code></a> es la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">p</span><span class="p">.</span><span class="k">finally</span><span class="p">(</span><span class="nx">onFinally</span><span class="p">);</span>
<span class="nx">p</span><span class="p">.</span><span class="k">finally</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="c1">// settled (fulfilled or rejected) });</span>
</code></pre></div></div>

<p>En nuestro código no es que tengamos que liberar muchos recursos, pero si que podemos indicar que se ha terminado de procesar la promesa.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">promesa</span><span class="p">.</span><span class="k">finally</span><span class="p">(()</span><span class="o">=&gt;</span><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Fin ejecución de la promesa</span><span class="dl">"</span><span class="p">));</span>
</code></pre></div></div>]]></content><author><name>manual_web</name></author><category term="promesas" /><category term="asíncrono" /><summary type="html"><![CDATA[Las promesas en Javascript son un tipo de objeto que representa la terminación o el fracaso eventual de una operación asíncrona.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Parámetros en funciones</title><link href="https://www.manualweb.net/javascript/parametros-en-funciones/" rel="alternate" type="text/html" title="Parámetros en funciones" /><published>2023-04-04T00:00:00+02:00</published><updated>2023-04-04T00:00:00+02:00</updated><id>https://www.manualweb.net/javascript/parametros-en-funciones</id><content type="html" xml:base="https://www.manualweb.net/javascript/parametros-en-funciones/"><![CDATA[<p>Cuando trabajamos con funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> es importante saber que los <strong>parámetros de tipo de datos primitivos</strong> que recibe la función se <strong>reciben por valor</strong>. Esto quiere decir que si modificamos el valor de uno de estos argumentos dentro de la función, <strong>este no se verá reflejado en la variable de origen</strong>.</p>

<p>Esto lo puedes comprobar mediante el siguiente código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">sumar</span> <span class="p">(</span><span class="nx">numero1</span><span class="p">,</span> <span class="nx">numero2</span><span class="p">)</span> <span class="p">{</span>
  <span class="c1">// Ignoramos siempre el primer número</span>
  <span class="nx">numero1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">numero1</span> <span class="o">+</span> <span class="nx">numero2</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">n1</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">n2</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumar</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">n1</span><span class="p">);</span>
</code></pre></div></div>

<p>Pero, <strong>si pasamos un objeto a una función</strong>, este sí que podrá verse modificado su contenido. Lo puedes comprobar con el siguiente código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">cambiar</span> <span class="p">(</span><span class="nx">persona</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">persona</span><span class="p">.</span><span class="nx">nombre</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Luis</span><span class="dl">"</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">persona</span> <span class="o">=</span> <span class="p">{</span>
  <span class="dl">"</span><span class="s2">nombre</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">Víctor</span><span class="dl">"</span><span class="p">,</span>
  <span class="dl">"</span><span class="s2">edad</span><span class="dl">"</span><span class="p">:</span><span class="mi">42</span>
<span class="p">};</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Antes de invocar</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">persona</span><span class="p">.</span><span class="nx">nombre</span><span class="p">);</span>  <span class="c1">// Saldrá Víctor</span>

<span class="nf">cambiar</span><span class="p">(</span><span class="nx">persona</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Después de invocar</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">persona</span><span class="p">.</span><span class="nx">nombre</span><span class="p">);</span> <span class="c1">// Saldrá Luís</span>
</code></pre></div></div>

<h2 id="parámetros-opcionales">Parámetros Opcionales</h2>

<p>Una de las cosas que tenemos que sabes es que al llamar a una función no es necesario pasarle todos los parámetros que tiene en su definición, ya que, <strong>todos por defecto son opcionales</strong>. En el caso de que <strong>un parámetro no tenga un valor de invocación</strong> aparecerá con un valor de <code class="language-plaintext highlighter-rouge">undefined</code>.</p>

<p>Por lo que <strong>los parámetros opcionales tendremos que controlarlos en el código de nuestra función</strong>:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">suma</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">){</span>
	<span class="k">if </span><span class="p">(</span><span class="nx">a</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="nx">a</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">b</span> <span class="o">==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="nx">b</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>

  <span class="k">return</span> <span class="nx">a</span><span class="o">+</span><span class="nx">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">n1</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">suma</span><span class="p">(</span><span class="nx">n1</span><span class="p">));</span>
</code></pre></div></div>

<h2 id="parámetros-por-defecto">Parámetros por defecto</h2>

<p>A partir de <a href="https://manualweb.net/javascript/historia-de-javascript/#madurez-javascript">ECMA 2015</a> podemos controlar los parámetros opcionales mediante <strong>parámetros por defecto</strong>. La idea es que en este caso el parámetro tendrá asignado un valor por defecto en el caso de que el parámetro no llegue.</p>

<p>Lo que haremos será dar un valor al parámetro en la definición de la función. La signatura en este caso sería la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">nombre_funcion</span> <span class="p">(</span><span class="nx">argumento</span> <span class="o">=</span> <span class="nx">valor_por_defecto</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">sentencias</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">valor_retorno</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Y si lo aplicamos a nuestra función de suma lo codificaremos de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">suma</span> <span class="p">(</span><span class="nx">a</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="nx">b</span><span class="o">=</span><span class="mi">0</span><span class="p">){</span>
  <span class="k">return</span> <span class="nx">a</span><span class="o">+</span><span class="nx">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">n1</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">suma</span><span class="p">(</span><span class="nx">n1</span><span class="p">));</span>
</code></pre></div></div>

<h2 id="parámetro-resto">Parámetro Resto</h2>

<p>Otra opción para gestionar los parámetros es utilizar el <strong>parámetro resto</strong>. Esto nos permite el poder <strong>definir una función con un conjunto de parámetros fijos y un conjunto de parámetros variables</strong>, lo que denominaríamos resto.</p>

<p>En este caso la sintaxis de la función sería la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">nombre_funcion</span> <span class="p">(</span><span class="nx">argumento</span><span class="p">,</span> <span class="p">...</span><span class="nx">resto</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">sentencias</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">valor_retorno</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Vemos que el argumento resto va con el <strong>operador spread</strong> que es representado por los tres puntos <code class="language-plaintext highlighter-rouge">…</code> más el nombre de la variable.</p>

<p>Lo que podremos hacer en el cuerpo de la función es acceder de forma iterativa sobre dicha variable.</p>

<p>Por ejemplo, podríamos crear una operación que preguntase por el tipo de operación que quieres hacer con un número fijo y el resto de los números pasados de forma variable como respuesta. Sería algo así:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">operar</span><span class="p">(</span><span class="nx">operacion</span><span class="p">,</span><span class="nx">valor_inicial</span><span class="p">,</span> <span class="p">...</span><span class="nx">args</span><span class="p">){</span>
    <span class="kd">let</span> <span class="nx">valor</span> <span class="o">=</span> <span class="nx">valor_inicial</span><span class="p">;</span>

    <span class="k">switch </span><span class="p">(</span><span class="nx">operacion</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">case</span> <span class="dl">"</span><span class="s2">suma</span><span class="dl">"</span><span class="p">:</span>
            <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
                <span class="nx">valor</span> <span class="o">+=</span> <span class="nx">args</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="dl">"</span><span class="s2">resta</span><span class="dl">"</span><span class="p">:</span>
            <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
                <span class="nx">valor</span> <span class="o">-=</span> <span class="nx">args</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="dl">"</span><span class="s2">multiplicacion</span><span class="dl">"</span><span class="p">:</span>
            <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
                <span class="nx">valor</span> <span class="o">*=</span> <span class="nx">args</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="dl">"</span><span class="s2">division</span><span class="dl">"</span><span class="p">:</span>
            <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">args</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
                <span class="nx">valor</span> <span class="o">/=</span> <span class="nx">args</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>
            <span class="k">break</span><span class="p">;</span>

    <span class="p">}</span>
    
    <span class="k">return</span> <span class="nx">valor</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">operar</span><span class="p">(</span><span class="dl">"</span><span class="s2">suma</span><span class="dl">"</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">2</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">operar</span><span class="p">(</span><span class="dl">"</span><span class="s2">resta</span><span class="dl">"</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">operar</span><span class="p">(</span><span class="dl">"</span><span class="s2">multiplicacion</span><span class="dl">"</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">operar</span><span class="p">(</span><span class="dl">"</span><span class="s2">division</span><span class="dl">"</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">5</span><span class="p">));</span>
</code></pre></div></div>

<h2 id="función-arguments">Función Arguments</h2>

<p>Otro elemento que tenemos que conocer para gestionar los parámetros de una función es la función <code class="language-plaintext highlighter-rouge">arguments</code>. Esta función <strong>contiene todos los parámetros con los que se ha invocado a la función</strong>, desde el primero al último. Por lo que podríamos decir que es un elemento iterable.</p>

<blockquote>
  <p>La función arguments contiene todos los parámetros que se le pasan a la función, mientras que el parámetro resto solo tiene la colección de los parámetros variables.</p>
</blockquote>

<p>De esta manera la función puede iterar por la colección <code class="language-plaintext highlighter-rouge">arguments</code> para ver qué valores se le han pasado a la función.</p>

<p>Para acceder a un elemento en concreto de <code class="language-plaintext highlighter-rouge">arguments</code> escribiremos lo siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">arguments</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>
</code></pre></div></div>

<p>Dónde x es la posición, empezando por el valor 0, que ocupa el parámetro en la invocación de la función.</p>

<p>Mediante la función <code class="language-plaintext highlighter-rouge">arguments</code> podríamos crear una función que sumase todos los números que le lleguen independiente del números que le indiquemos. El código quedaría como se ve a continuación:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">sumar</span><span class="p">(){</span>
    <span class="kd">let</span> <span class="nx">suma</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
        <span class="nx">suma</span> <span class="o">+=</span> <span class="nx">arguments</span><span class="p">[</span><span class="nx">x</span><span class="p">];</span>

    <span class="k">return</span> <span class="nx">suma</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumar</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumar</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumar</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">));</span>
</code></pre></div></div>]]></content><author><name>manual_web</name></author><category term="parámetros" /><category term="parámetros_opcionales" /><category term="parámetros_resto" /><category term="arguments" /><summary type="html"><![CDATA[Los parámetros en funciones Javascript son los valores que se pasan para invocar la función. Sobre ellos podemos crear parámetros opcionales, parámetros resto o bien acceder al listado completo de los parámetros.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Funciones Javascript</title><link href="https://www.manualweb.net/javascript/funciones-javascript/" rel="alternate" type="text/html" title="Funciones Javascript" /><published>2023-04-04T00:00:00+02:00</published><updated>2023-04-04T00:00:00+02:00</updated><id>https://www.manualweb.net/javascript/funciones-javascript</id><content type="html" xml:base="https://www.manualweb.net/javascript/funciones-javascript/"><![CDATA[<h2 id="qué-son-las-funciones-javascript">¿Qué son las funciones Javascript?</h2>

<p>Las funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> nos permiten definir y agrupar un conjunto de sentencias a las cuales podemos invocar en diferentes partes de nuestro programa. Es por ello que diferenciaremos la parte que nos permite <strong>definir la función</strong> de la parte que realiza la <strong>invocación a la función</strong>.</p>

<p>También hay que saber que el lenguaje <a href="https://www.manualweb.net/javascript/">Javascript</a> nos ofrece un conjunto de <a href="https://www.manualweb.net/javascript/funciones-predefinidas-en-javascript/">funciones predefinidas</a> que podremos utilizar en nuestros programas.</p>

<h2 id="definir-funciones-javascript">Definir funciones Javascript</h2>

<p>Para definir funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> deberemos de saber que estas tienen la siguiente estructura:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">nombre_funcion</span> <span class="p">(</span><span class="nx">argumentos</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">sentencias</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">valor_retorno</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Los elementos que nos encontramos en la definición de las funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> son los siguientes:</p>

<ul>
  <li>Lo primero que vemos es que utilizamos el literal <code class="language-plaintext highlighter-rouge">function</code> para definir la función.</li>
  <li>A continuación indicaremos el <strong>nombre</strong> que le queremos dar a la función.</li>
  <li>Entre paréntesis declararemos, separados por comas, los <strong>argumentos (o parámetros)</strong> que recibirá la función.</li>
  <li>Entre llaves incluiremos las sentencias que formarán parte de la función.</li>
  <li>En el caso de que queramos devolver algún valor de retorno en la función utilizaremos la sentencia <code class="language-plaintext highlighter-rouge">return</code>.</li>
</ul>

<p>Con este conocimiento básico podemos definir nuestra primera función que realice una suma de dos elementos, la cual nos quedará de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">sumar</span> <span class="p">(</span><span class="nx">numero1</span><span class="p">,</span> <span class="nx">numero2</span><span class="p">)</span> <span class="p">{</span>
	<span class="kd">let</span> <span class="nx">suma</span> <span class="o">=</span> <span class="nx">numero1</span> <span class="o">+</span> <span class="nx">numero2</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">suma</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="invocar-funciones-javascript">Invocar funciones Javascript</h2>

<p>Para invocar funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> valdrá con poner el nombre de la función y pasarle los parámetros que necesite. La estructura para invocar funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> será la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">nombre_funcion</span><span class="p">(</span><span class="nx">parametros</span><span class="p">);</span>
</code></pre></div></div>

<p>De esta forma podemos invocar a nuestra función <a href="https://www.manualweb.net/javascript/">Javascript</a> de suma de números de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">sumar</span> <span class="p">(</span><span class="nx">numero1</span><span class="p">,</span> <span class="nx">numero2</span><span class="p">)</span> <span class="p">{</span>
	<span class="kd">let</span> <span class="nx">suma</span> <span class="o">=</span> <span class="nx">numero1</span> <span class="o">+</span> <span class="nx">numero2</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">suma</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">n1</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">n2</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumar</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span> <span class="c1">// 5</span>
</code></pre></div></div>

<h2 id="funciones-anónimas">Funciones anónimas</h2>

<p>En la estructura general de las funciones hemos indicado que estas tienen que tener un nombre, el cual hemos visto que utilizamos para poder invocar a la función. Si bien, en <a href="https://www.manualweb.net/javascript/">Javascript</a>, podemos definir funciones sin nombre, que es lo que se conoce como <strong>funciones anónimas</strong>.</p>

<p>Es decir, la estructura en este caso sería de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">function </span><span class="p">(</span><span class="nx">argumentos</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">sentencias</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">valor_retorno</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Pero si la función no tiene nombre, ¿cómo la invocamos? En este punto la idea de las <strong>funciones anónimas</strong> es que son funciones que solo van a ser utilizadas una vez o bien que las asignamos en una <a href="https://www.manualweb.net/javascript/expresiones-de-funcion/">expresión de función</a> (esto ya lo veremos más adelante).</p>

<p>Por lo cual las funciones anónimas serán <strong>funciones que asignemos a una variable</strong>, que será la que utilicemos para su invocación:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">sumar</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span><span class="o">+</span><span class="nx">b</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>O bien <strong>como parámetro de una función</strong>, que serían las funciones callback. Esto lo encontramos en los modelos <a href="https://www.manualweb.net/dom/">DOM</a> para gestionar eventos. Seguro que has manejado alguna vez la función <a href="https://www.w3api.com/DOM/EventTarget/addEventListener/"><code class="language-plaintext highlighter-rouge">addEventListener</code></a> y este código no te suena extraño:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">boton</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">miboton</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">boton</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Botón pulsado</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Vemos que la función asociada al evento <code class="language-plaintext highlighter-rouge">click</code> es una función anónima en <a href="https://www.manualweb.net/javascript/">Javascript</a> ya que va a quedar únicamente asociada a dicho evento y no la vamos a reutilizar más.</p>

<h2 id="ámbito-de-una-función">Ámbito de una función</h2>

<p>Cuando hablamos del ámbito de las funciones <a href="https://www.manualweb.net/javascript/">Javascript</a> tenemos que saber que <strong>las variables de una función solo pueden ser accedidas dentro de la función</strong>. Si bien, <strong>desde la función podemos acceder al resto de variables globales</strong> definidas en nuestro código.</p>

<p>De esta manera, en el caso de que vayamos anidando funciones, estás podrán acceder a las variables definidas en sus funciones padres.</p>

<p>Esto lo podemos ver en el siguiente código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">contador</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">incremento</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">let</span> <span class="nx">inc</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">contador</span><span class="o">+</span><span class="nx">inc</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">incremento</span><span class="p">());</span>  <span class="c1">// Devuelve 3</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">inc</span><span class="p">);</span>  <span class="c1">// Da un error</span>
</code></pre></div></div>

<p>En el código vemos cómo la función <code class="language-plaintext highlighter-rouge">incremento</code> puede acceder a la variable global <code class="language-plaintext highlighter-rouge">contador</code>, pero que la variable <code class="language-plaintext highlighter-rouge">inc</code> definida dentro de la función <code class="language-plaintext highlighter-rouge">incremento</code> ya no se puede acceder de forma externa a la función.</p>]]></content><author><name>manual_web</name></author><category term="function" /><category term="función_anónima" /><category term="parámetros" /><summary type="html"><![CDATA[Las funciones Javascript nos permiten definir y agrupar un conjunto de sentencias las cuales podemos invocar desde diferentes partes de nuestro programa.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Expresiones de Función</title><link href="https://www.manualweb.net/javascript/expresiones-de-funcion/" rel="alternate" type="text/html" title="Expresiones de Función" /><published>2023-04-04T00:00:00+02:00</published><updated>2023-04-04T00:00:00+02:00</updated><id>https://www.manualweb.net/javascript/expresiones-de-funcion</id><content type="html" xml:base="https://www.manualweb.net/javascript/expresiones-de-funcion/"><![CDATA[<p>Hasta ahora hemos visto cómo <a href="https://manualweb.net/javascript/funciones-javascript/">declarar una función en Javascript</a>, cómo <a href="https://manualweb.net/javascript/parametros-en-funciones/">pasarle parámetros</a>, cómo devuelve un valor de retorno y por último cómo se puede invocar a esta función.</p>

<p>Pero existe otra forma de declarar una función y esto se conoce como <strong>expresiones de función</strong>. La idea es <strong>declarar una función sobre una variable</strong>. De esta manera podremos, por ejemplo, <strong>mover la variable que tiene la función como parámetro de otras funciones</strong>.</p>

<p>Las sintaxis de las <strong>expresiones de función</strong> es la siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">variable</span> <span class="o">=</span> <span class="kd">function</span> <span class="nf">nombre</span> <span class="p">()</span> <span class="p">{</span>
  <span class="nx">sentencias</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">valor</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Si bien el nombre o el devolver un valor son elementos opcionales. En el caso de no identificar un nombre será una <a href="https://manualweb.net/javascript/funciones-javascript/#funciones-an%C3%B3nimas">función anónima</a><strong>.</strong></p>

<p>Podemos definir nuestra función de suma como una expresión de función de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">suma</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span><span class="o">+</span><span class="nx">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">suma</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span>
</code></pre></div></div>

<p>También podríamos haber definido nuestra expresión de función con un nombre:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">suma</span> <span class="o">=</span> <span class="kd">function</span> <span class="nf">sum</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span><span class="o">+</span><span class="nx">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">suma</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span>
</code></pre></div></div>

<p>En este caso el nombre <code class="language-plaintext highlighter-rouge">sum</code> no se puede utilizar para ejecutar la función. Pero nos valdrá para nombrarla y <strong>hacer seguimiento de ella en el caso de que estemos depurando</strong> nuestro código fuente.</p>

<p>Como hemos comentado las <strong>expresiones de función</strong> se pueden pasar como parámetro en otras funciones. De esta forma, si tenemos una función que te calcule el cuadrado de un número:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">square</span> <span class="o">=</span> <span class="nf">function </span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">pow</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span><span class="mi">2</span><span class="p">)};</span>
</code></pre></div></div>

<p>La <strong>podremos pasar como parámetro a otra función</strong> que sume un listado de números aplicando esta función. Lo que quedaría de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sumador</span> <span class="o">=</span> <span class="nf">function </span><span class="p">(</span><span class="nx">operacion</span><span class="p">,</span><span class="nx">elementos</span><span class="p">){</span>
    <span class="kd">let</span> <span class="nx">resultado</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">elementos</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
        <span class="nx">resultado</span> <span class="o">+=</span> <span class="nf">operacion</span><span class="p">(</span><span class="nx">elementos</span><span class="p">[</span><span class="nx">x</span><span class="p">])</span>
    <span class="k">return</span> <span class="nx">resultado</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Para invocar a la función lo haremos así:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numeros</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumador</span><span class="p">(</span><span class="nx">square</span><span class="p">,</span><span class="nx">numeros</span><span class="p">));</span> <span class="c1">// 55</span>
</code></pre></div></div>

<p>Pero es que a esta misma función le podríamos pasar una operación que calculase el cubo de un número, es decir, elevarlo a su tercera potencia.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">cube</span> <span class="o">=</span> <span class="nf">function </span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">pow</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span><span class="mi">3</span><span class="p">)};</span>
</code></pre></div></div>

<p>Y pasárselo a la misma función:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numeros</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumador</span><span class="p">(</span><span class="nx">cube</span><span class="p">,</span><span class="nx">numeros</span><span class="p">));</span> <span class="c1">// 225</span>
</code></pre></div></div>

<p>Pero, podríamos ir mucho más allá y en nuestra función principal indicar que esperamos una función, pero que si no viene no hacemos nada con los números y solo los sumamos. Así, que tal como vimos en la definición de valores por defecto la codificaríamos de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sumador</span> <span class="o">=</span> <span class="nf">function </span><span class="p">(</span><span class="nx">operacion</span> <span class="o">=</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span><span class="o">=&gt;</span><span class="nx">x</span><span class="p">,</span><span class="nx">elementos</span><span class="p">){</span>
    <span class="kd">let</span> <span class="nx">resultado</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">x</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">x</span><span class="o">&lt;</span><span class="nx">elementos</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="nx">x</span><span class="o">++</span><span class="p">)</span>
        <span class="nx">resultado</span> <span class="o">+=</span> <span class="nf">operacion</span><span class="p">(</span><span class="nx">elementos</span><span class="p">[</span><span class="nx">x</span><span class="p">])</span>
    <span class="k">return</span> <span class="nx">resultado</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Por lo que podríamos llamarla sin pasar una función, es decir, indicando el valor <code class="language-plaintext highlighter-rouge">undefined</code>.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numeros</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sumador</span><span class="p">(</span><span class="kc">undefined</span><span class="p">,</span><span class="nx">numeros</span><span class="p">));</span> <span class="c1">// 15</span>
</code></pre></div></div>]]></content><author><name>manual_web</name></author><category term="expresiones_función" /><summary type="html"><![CDATA[Javascript permite declarar expresiones de función sobre una variable para poder utilizar dicha variable en el contexto del programa o pasarla a otras funciones.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Closures Javascript</title><link href="https://www.manualweb.net/javascript/closures-javascript/" rel="alternate" type="text/html" title="Closures Javascript" /><published>2023-04-04T00:00:00+02:00</published><updated>2023-04-04T00:00:00+02:00</updated><id>https://www.manualweb.net/javascript/closures-javascript</id><content type="html" xml:base="https://www.manualweb.net/javascript/closures-javascript/"><![CDATA[<p>Ya hemos visto <a href="https://manualweb.net/javascript/funciones-javascript/">cómo definir funciones</a> o declarar <a href="https://manualweb.net/javascript/expresiones-de-funcion/">expresiones de función</a> para poder pasar las funciones como parámetros de otras funciones. Ahora vamos a ver qué es el concepto <strong>closures</strong> <a href="https://www.manualweb.net/javascript/"><strong>Javascript</strong></a> o cierres en <a href="https://www.manualweb.net/javascript/">Javascript</a>.</p>

<h2 id="funciones-anidadas">Funciones anidadas</h2>

<p>Antes de entra en detalle sobre los closures <a href="https://www.manualweb.net/javascript/">Javascript</a> <strong>l</strong>o primero que tenemos que saber es que <strong>las funciones en</strong> <a href="https://www.manualweb.net/javascript/"><strong>Javascript</strong></a> <strong>se pueden anidar</strong>. Es decir, podemos definir una función dentro de otra función.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">exterior</span><span class="p">(</span><span class="nx">parametros</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">function</span> <span class="nf">interior</span><span class="p">(</span><span class="nx">parametros</span><span class="p">)</span> <span class="p">{</span>
     <span class="nx">sentencias</span><span class="p">;</span>
     <span class="k">return</span> <span class="nx">interior</span><span class="p">;</span>
   <span class="p">}</span>
   <span class="k">return</span> <span class="nx">exterior</span><span class="p">;</span>
<span class="p">}</span>

<span class="nf">exterior</span><span class="p">(</span><span class="nx">parametros</span><span class="p">);</span>
</code></pre></div></div>

<p>En esta estructura tenemos una función interna que por un lado <strong>puede acceder a la información que tiene la función exterior.</strong> De forma externa solo podemos invocar a la función exterior, pero nunca a la interior.</p>

<p>Por ejemplo, si queremos definir una función que sume dos números elevados al cuadrado podríamos tener el siguiente código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">addSquare</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">function</span> <span class="nf">square</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="nx">x</span><span class="o">*</span><span class="nx">x</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nf">square</span><span class="p">(</span><span class="nx">a</span><span class="p">)</span><span class="o">+</span><span class="nf">square</span><span class="p">(</span><span class="nx">b</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">addSquare</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">));</span> <span class="c1">// 13</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">square</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span>      <span class="c1">// No se puede invocar</span>
</code></pre></div></div>

<p>Como podemos ver la función externa <code class="language-plaintext highlighter-rouge">addSquare</code> tiene una función interna que se llama <code class="language-plaintext highlighter-rouge">square</code> que es invocada y utilizada para devolver un valor. Además, mediante el código, vemos que la función <code class="language-plaintext highlighter-rouge">square</code> no puede ser invocada de forma externa.</p>

<h2 id="closures-javascript">Closures Javascript</h2>

<p>En esta anidación de funciones los closures <a href="https://www.manualweb.net/javascript/">Javascript</a> se producen <strong>cuando la función retorna una función y el contexto asociado a dicha función</strong>.</p>

<p>Por ejemplo vamos a definir una función anidada la cual contenga en un primer nivel la información de la persona que queremos saludar y que anide una función que realice el saludo a dicho nombre. Esta función va a devolver tanto <strong>la función que saluda</strong>, como <strong>el contexto asociado</strong>, es decir, la variable que contiene el nombre.</p>

<p>Definiremos el closure <a href="https://www.manualweb.net/javascript/">Javascript</a> de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">saludo</span><span class="p">()</span> <span class="p">{</span>
    <span class="kd">let</span> <span class="nx">texto</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Buenos días</span><span class="dl">'</span><span class="p">;</span>
    <span class="kd">function</span> <span class="nf">saludoDia</span><span class="p">(){</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">texto</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">saludoDia</span><span class="p">;</span>  
<span class="p">}</span>

<span class="kd">let</span> <span class="nx">saludar</span> <span class="o">=</span> <span class="nf">saludo</span><span class="p">();</span>
<span class="nf">saludar</span><span class="p">();</span>  <span class="c1">// Buenos días</span>
</code></pre></div></div>

<p>Podemos apreciar que <strong>la función interna tiene acceso a los valores declarados en la función externa</strong>, los cuales se retornan y permanecen creados mientras exista la función.</p>

<p>Los contextos asociados se pueden entender mejor si modificamos la función externa para poder pasarle el mensaje de saludo y la interna para pasarle el nombre de la persona a saludar, quedando de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">saludo</span><span class="p">(</span><span class="nx">mensaje</span><span class="p">)</span> <span class="p">{</span>    
    <span class="kd">function</span> <span class="nf">saludoNombre</span><span class="p">(</span><span class="nx">nombre</span><span class="p">){</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">mensaje</span><span class="p">}</span><span class="s2">, </span><span class="p">${</span><span class="nx">nombre</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">saludoNombre</span><span class="p">;</span> 
<span class="p">}</span>
</code></pre></div></div>

<p>Podemos crear diferentes contextos con el mensaje del saludo de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">saludarTarde</span> <span class="o">=</span> <span class="nf">saludo</span><span class="p">(</span><span class="dl">"</span><span class="s2">Buenas tardes</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">saludarNoche</span> <span class="o">=</span> <span class="nf">saludo</span><span class="p">(</span><span class="dl">"</span><span class="s2">Buenas noches</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">nombre</span><span class="o">=</span><span class="dl">"</span><span class="s2">Víctor</span><span class="dl">"</span><span class="p">;</span>

<span class="nf">saludarTarde</span><span class="p">(</span><span class="nx">nombre</span><span class="p">);</span>  <span class="c1">// Buenas tardes, Víctor</span>
<span class="nf">saludarNoche</span><span class="p">(</span><span class="nx">nombre</span><span class="p">);</span>  <span class="c1">// Buenas noches, Víctor</span>
</code></pre></div></div>

<p>El contexto demarcado por la variable <code class="language-plaintext highlighter-rouge">saludo</code> perdura durante toda la función.</p>

<p>Vemos que <strong>la función es la misma, pero con contextos diferentes marcados por el parámetro de la función externa</strong>. Es aquí dónde tenemos nuestros closures <a href="https://www.manualweb.net/javascript/">Javascript</a>.</p>

<p>Además podríamos invocar a la función pasándole tanto el parámetro externo como el parámetro interno.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">saludo</span><span class="p">(</span><span class="dl">"</span><span class="s2">Buenos días</span><span class="dl">"</span><span class="p">)(</span><span class="dl">"</span><span class="s2">Luis</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>]]></content><author><name>manual_web</name></author><category term="closures" /><category term="funciones_anidadas" /><summary type="html"><![CDATA[Los closures javascript nos permiten crear funciones con un contexto de datos asociados que podemos utilizar a lo largo de nuestro programa.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Operaciones Trigonométricas e Hiperbólicas</title><link href="https://www.manualweb.net/javascript/operaciones-trigonometricas-e-hiperbolicas/" rel="alternate" type="text/html" title="Operaciones Trigonométricas e Hiperbólicas" /><published>2023-03-24T00:00:00+01:00</published><updated>2023-03-24T00:00:00+01:00</updated><id>https://www.manualweb.net/javascript/operaciones-trigonometricas-e-hiperbolicas</id><content type="html" xml:base="https://www.manualweb.net/javascript/operaciones-trigonometricas-e-hiperbolicas/"><![CDATA[<p>Si hablamos de operaciones trigonométricas e hiperbólicas el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos permite desde calcular hipotenusas, pasando por las operaciones trigonométricas hasta las operaciones hiperbólicas.</p>

<h2 id="hipotenusa-en-javascript">Hipotenusa en Javascript</h2>

<p>El objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos permite realizar operaciones trigonométricas. Para ello lo primero que podemos hacer es <strong>calcular la hipotenusa de un triángulo</strong>. El método <a href="https://www.w3api.com/Javascript/Math/hypot"><code class="language-plaintext highlighter-rouge">Math.hypot</code></a><code class="language-plaintext highlighter-rouge">()</code> nos permite hacer ese cálculo. Para ello simplemente tendremos que pasar el valor de los catetos a la función.</p>

<p>Si queremos calcular la hipotenusa de un triángulo con dos lados de tamaño 3 y 4 haríamos lo siguiente:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">lado1</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">lado2</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">hypot</span><span class="p">(</span><span class="nx">lado1</span><span class="p">,</span><span class="nx">lado2</span><span class="p">));</span> <span class="c1">// 5</span>
</code></pre></div></div>

<h2 id="senos-cosenos-y-tangentes">Senos, cosenos y tangentes</h2>

<p>Lo siguiente sería saber que podemos calcular los <strong>senos</strong>, <strong>cosenos</strong> y <strong>tangentes</strong> mediante los métodos <a href="https://www.w3api.com/Javascript/Math/sin"><code class="language-plaintext highlighter-rouge">Math.sin()</code></a>, <a href="https://www.w3api.com/Javascript/Math/cos"><code class="language-plaintext highlighter-rouge">Math.cos()</code></a> y <a href="https://www.w3api.com/Javascript/Math/tan"><code class="language-plaintext highlighter-rouge">Math.tan()</code></a>. Estos métodos reciben como parámetro el valor del ángulo en radianes.</p>

<blockquote>
  <p>Para convertir grados a radianes, hay que multiplicar los grados por el número π y dividirlo por 180</p>
</blockquote>

<p>De esta manera podemos calcular el seno, coseno y tangente de un ángulo de 90º de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">grado</span> <span class="o">=</span> <span class="mi">90</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">radian</span> <span class="o">=</span> <span class="p">(</span><span class="nx">grado</span><span class="o">*</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">)</span><span class="o">/</span><span class="mi">180</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">radian</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">radian</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">tan</span><span class="p">(</span><span class="nx">radian</span><span class="p">));</span>
</code></pre></div></div>

<h2 id="arcoseno-arcocoseno-y-arcotangente">Arcoseno, arcocoseno y arcotangente</h2>

<p>Si queremos conocer el ángulo tenemos métodos que nos calculan el <strong>arcoseno, arcocoseno</strong> y <strong>arcotangente</strong> que son <a href="https://www.w3api.com/Javascript/Math/asin"><code class="language-plaintext highlighter-rouge">Math.asin()</code></a>, <a href="https://www.w3api.com/Javascript/Math/acos"><code class="language-plaintext highlighter-rouge">Math.acos()</code></a> y <a href="https://www.w3api.com/Javascript/Math/atan"><code class="language-plaintext highlighter-rouge">Math.atan()</code></a>.</p>

<p>Esto nos puede ayudar a conocer los ángulos de un triángulo. Por ejemplo, si tenemos un triángulo rectángulo de lados 3m y 4m cuanto mide su hipotenusa y sus ángulos ą y ß.</p>

<p><img src="https://manualweb.net/javascript/img/triangulo.png" alt="Imagen de Mates Fácil" /></p>

<p>De esta manera, lo primero será calcular la hipotenusa mediante <a href="https://www.w3api.com/Javascript/Math/hypot"><code class="language-plaintext highlighter-rouge">Math.hypot</code></a><code class="language-plaintext highlighter-rouge">()</code></p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">hipotenusa</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">hypot</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">);</span>
</code></pre></div></div>

<p>Ahora calculamos el seno de ą y el seno de ß. Los cuales se calculan por el tamaño del lado opuesto entre la hipotenusa.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">seno_alpha</span> <span class="o">=</span> <span class="nx">b</span><span class="o">/</span><span class="nx">hipotenusa</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">seno_beta</span> <span class="o">=</span> <span class="nx">a</span><span class="o">/</span><span class="nx">hipotenusa</span><span class="p">;</span>
</code></pre></div></div>

<p>Ya solo nos quedará el calcular los arcoseno de estos senos con <a href="https://www.w3api.com/Javascript/Math/asin"><code class="language-plaintext highlighter-rouge">Math.asin()</code></a> para saber los ángulos</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">alpha</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">asin</span><span class="p">(</span><span class="nx">seno_alpha</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">beta</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">asin</span><span class="p">(</span><span class="nx">seno_beta</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El angulo alpha es de </span><span class="p">${(</span><span class="nx">alpha</span><span class="o">*</span><span class="mi">180</span><span class="p">)</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">}</span><span class="s2"> grados`</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El angulo beta es de </span><span class="p">${(</span><span class="nx">beta</span><span class="o">*</span><span class="mi">180</span><span class="p">)</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">}</span><span class="s2"> grados`</span><span class="p">);</span>
</code></pre></div></div>

<blockquote>
  <p>Pues encontrar más ejemplos de matemáticas en <a href="https://www.matesfacil.com/">Mates Fácil</a></p>
</blockquote>

<p>También podríamos haber obtenido el ángulo utilizando la arcontangente mediante <a href="https://www.w3api.com/Javascript/Math/atan"><code class="language-plaintext highlighter-rouge">Math.atan()</code></a> sin necesidad de haber calculado la hipotenusa. Ya que a la arcotangente se le pasa la división del lado opuesto con el adyacente. En este caso el código sería de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="kd">let</span> <span class="nx">alpha</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">atan</span><span class="p">(</span><span class="nx">b</span><span class="o">/</span><span class="nx">a</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">beta</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">atan</span><span class="p">(</span><span class="nx">a</span><span class="o">/</span><span class="nx">b</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El angulo alpha es de </span><span class="p">${(</span><span class="nx">alpha</span><span class="o">*</span><span class="mi">180</span><span class="p">)</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">}</span><span class="s2"> grados`</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El angulo beta es de </span><span class="p">${(</span><span class="nx">beta</span><span class="o">*</span><span class="mi">180</span><span class="p">)</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">}</span><span class="s2"> grados`</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="angulos-en-un-plano">Angulos en un plano</h2>

<p>Otra forma de obtener el arcotangente es mediante la función <a href="https://www.w3api.com/Javascript/Math/atan2"><code class="language-plaintext highlighter-rouge">Math.atan2()</code></a> la cual no recibe un ángulo en radianes, si no que recibe el punto <code class="language-plaintext highlighter-rouge">x,y</code> en un sistema de coordenadas de un plano con origen <code class="language-plaintext highlighter-rouge">0,0</code>.</p>

<p>Es importante saber que al método <a href="https://www.w3api.com/Javascript/Math/atan2"><code class="language-plaintext highlighter-rouge">Math.atan2()</code></a> se le pasan las coordenadas de forma inversa, es decir en formato <code class="language-plaintext highlighter-rouge">y,x</code>. Así su sintaxis es <a href="https://www.w3api.com/Javascript/Math/atan2"><code class="language-plaintext highlighter-rouge">Math.atan2(y,x)</code></a></p>

<p>De esta forma podemos volver a reescribir el anterior código que nos calculaba los ángulos ą y ß de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>

<span class="kd">let</span> <span class="nx">alpha</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">atan2</span><span class="p">(</span><span class="nx">b</span><span class="p">,</span><span class="nx">a</span><span class="p">);</span>
<span class="kd">let</span> <span class="nx">beta</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">atan2</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El angulo alpha es de </span><span class="p">${(</span><span class="nx">alpha</span><span class="o">*</span><span class="mi">180</span><span class="p">)</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">}</span><span class="s2"> grados`</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El angulo beta es de </span><span class="p">${(</span><span class="nx">beta</span><span class="o">*</span><span class="mi">180</span><span class="p">)</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">}</span><span class="s2"> grados`</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="senos-cosenos-y-tangentes-hiperbólicas">Senos, cosenos y tangentes hiperbólicas</h2>

<p>Además de las funciones trigonométricas, dentro del objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> también disponemos de funciones hiperbólicas. En este caso las funciones hiperbólicas no son periódicas si no que son exponenciales.</p>

<p>De esta manera tenemos son senos, cosenos y tangentes hiperbólicas que se obtienen mediante los métodos <a href="https://www.w3api.com/Javascript/Math/sinh"><code class="language-plaintext highlighter-rouge">Math.sinh()</code></a>, <a href="https://www.w3api.com/Javascript/Math/cosh"><code class="language-plaintext highlighter-rouge">Math.cosh()</code></a> y <a href="https://www.w3api.com/Javascript/Math/tanh"><code class="language-plaintext highlighter-rouge">Math.tanh()</code></a> con los que podemos calcular el seno, coseno y tangente hiperbólica de un ángulo de 90º mediante el siguiente código:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">grado</span> <span class="o">=</span> <span class="mi">90</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">radian</span> <span class="o">=</span> <span class="p">(</span><span class="nx">grado</span><span class="o">*</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">)</span><span class="o">/</span><span class="mi">180</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">sinh</span><span class="p">(</span><span class="nx">radian</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">cosh</span><span class="p">(</span><span class="nx">radian</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">tanh</span><span class="p">(</span><span class="nx">radian</span><span class="p">));</span>
</code></pre></div></div>

<p>Así mismo podemos calcular los arcosenos, arcocosenos y arcotangente hiperbólicas con los métodos <a href="https://www.w3api.com/Javascript/Math/acosh"><code class="language-plaintext highlighter-rouge">Math.acosh()</code></a>, <a href="https://www.w3api.com/Javascript/Math/asinh"><code class="language-plaintext highlighter-rouge">Math.asinh()</code></a>, <a href="https://www.w3api.com/Javascript/Math/atanh"><code class="language-plaintext highlighter-rouge">Math.atanh()</code></a>.</p>]]></content><author><name>manual_web</name></author><category term="math" /><category term="seno" /><category term="coseno" /><category term="tangente" /><category term="hipotenusa" /><category term="arcoseno" /><category term="arcocoseno" /><category term="arcotangente" /><summary type="html"><![CDATA[Las operaciones trigonométricas e hiperbólicas del objeto Math nos permite desde calcular hipotenusas, senos, cosenos, tangentes, arcosenos, arcocosenos y arcotangentes.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Operaciones Avanzadas del Objeto Math</title><link href="https://www.manualweb.net/javascript/operaciones-avanzadas-del-objeto-math/" rel="alternate" type="text/html" title="Operaciones Avanzadas del Objeto Math" /><published>2023-03-24T00:00:00+01:00</published><updated>2023-03-24T00:00:00+01:00</updated><id>https://www.manualweb.net/javascript/operaciones-avanzadas-del-objeto-math</id><content type="html" xml:base="https://www.manualweb.net/javascript/operaciones-avanzadas-del-objeto-math/"><![CDATA[<p>Una vez visto las operaciones básicas, vamos a ver algunas operaciones avanzadas del objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> en <a href="https://www.manualweb.net/javascript/">Javascript</a> entre las que encontramos el cálculo de raíces cuadradas, cálculo de mínimos y máximos, multiplicaciones de números de 32 bits y manejo de ceros en números binarios.</p>

<h2 id="raíces-cuadradas">Raíces cuadradas</h2>

<p>Lo primero que vamos a ver es cómo realizar una raíz cuadrada sobre un número. <strong>La raíz cuadrada es la inversa de la potencia de 2 de un número</strong>. Para poder calcular la raíz cuadrada tenemos el método <a href="https://www.w3api.com/Javascript/Math/sqrt"><code class="language-plaintext highlighter-rouge">Math.sqrt()</code></a>. Este método recibe como parámetro el número del cual queremos calcular la raíz cuadrada.</p>

<p>Podemos ver cómo funcionaría en código de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`La raíz cuadrada de </span><span class="p">${</span><span class="nx">numero</span><span class="p">}</span><span class="s2"> es </span><span class="p">${</span><span class="nb">Math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="nx">numero</span><span class="p">)}</span><span class="s2">`</span><span class="p">);</span>
</code></pre></div></div>

<p>Complementando el cálculo de la raíz cuadrada, en el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> en <a href="https://www.manualweb.net/javascript/">Javascript</a> nos ofrece la posibilidad de calcular la raíz cúbica de un número. <strong>La raíz cúbica de un número es la inversa de una potencia de 3 de un número</strong>.</p>

<p>En este caso el método que necesitamos es <a href="https://www.w3api.com/Javascript/Math/cbrt"><code class="language-plaintext highlighter-rouge">Math.cbrt()</code></a>, el cual podemos utilizar en código de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`La raíz cúbica de </span><span class="p">${</span><span class="nx">numero</span><span class="p">}</span><span class="s2"> es </span><span class="p">${</span><span class="nb">Math</span><span class="p">.</span><span class="nf">cbrt</span><span class="p">(</span><span class="nx">numero</span><span class="p">)}</span><span class="s2">`</span><span class="p">);</span>
</code></pre></div></div>

<blockquote>
  <p>No se pueden calcular raíces cuadradas de números negativos, si lo intentamos el valor que nos devuelva el método <a href="https://www.w3api.com/Javascript/Math/sqrt"><code class="language-plaintext highlighter-rouge">Math.sqrt()</code></a> será <code class="language-plaintext highlighter-rouge">NaN</code>. Si bien, si que se pueden calcular raíces cúbicas de número snegativos.</p>
</blockquote>

<p>Además, el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos ofrece dos propiedades relacionadas con las raíces cuadras, estas propiedades son: <a href="https://www.w3api.com/Javascript/Math/SQRT1_2"><code class="language-plaintext highlighter-rouge">Math.SQRT1_2</code></a> y <a href="https://www.w3api.com/Javascript/Math/SQRT2"><code class="language-plaintext highlighter-rouge">Math.SQRT2</code></a>. En el caso de <a href="https://www.w3api.com/Javascript/Math/SQRT1_2"><code class="language-plaintext highlighter-rouge">Math.SQRT1_2</code></a> se representa al valor de la matriz cuadrada de 1/2 que sería algo así como “<strong>0.7071067811865476”</strong>. Y en el caso de <a href="https://www.w3api.com/Javascript/Math/SQRT2"><code class="language-plaintext highlighter-rouge">Math.SQRT2</code></a> se representa a la matriz cuadrada de 2, que viene a ser un valor de “<strong>1.4142135623730951”.</strong></p>

<h2 id="máximos-y-mínimos">Máximos y mínimos</h2>

<p>Una de las utilidades interesantes que tiene el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> es la posibilidad de saber cuales son los valores máximos y mínimos de una lista de valores. Para ello tenemos los métodos <a href="https://www.w3api.com/Javascript/Math/max"><code class="language-plaintext highlighter-rouge">Math.max()</code></a> y <a href="https://www.w3api.com/Javascript/Math/min"><code class="language-plaintext highlighter-rouge">Math.min()</code></a> los cuales reciben un array de valores.</p>

<p>Si queremos obtener el valor máximo de una lista de números lo codificaríamos de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="mi">45</span><span class="p">,</span><span class="mi">78</span><span class="p">));</span> <span class="c1">// 78</span>
</code></pre></div></div>

<p>Y si queremos obtener el valor mínimo:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">min</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="mi">45</span><span class="p">,</span><span class="mi">78</span><span class="p">));</span> <span class="c1">// 12</span>
</code></pre></div></div>

<p>Podemos observar que tanto <a href="https://www.w3api.com/Javascript/Math/max"><code class="language-plaintext highlighter-rouge">Math.max()</code></a> como <a href="https://www.w3api.com/Javascript/Math/min"><code class="language-plaintext highlighter-rouge">Math.min()</code></a> reciben una lista de números. En el caso de que los valores los tengamos listados en un array, y aunque todavía no hayamos hablado de arrays, podríamos utilizar el operador <code class="language-plaintext highlighter-rouge">…</code> para convertir el array en una lista de números.</p>

<p>En este caso el código quedaría de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numeros</span> <span class="o">=</span> <span class="p">[</span><span class="mi">12</span><span class="p">,</span><span class="mi">56</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">59</span><span class="p">,</span><span class="mi">98</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">45</span><span class="p">,</span><span class="mi">11</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Número máximo </span><span class="p">${</span><span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(...</span><span class="nx">numeros</span><span class="p">)}</span><span class="s2">`</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Número mínimo </span><span class="p">${</span><span class="nb">Math</span><span class="p">.</span><span class="nf">min</span><span class="p">(...</span><span class="nx">numeros</span><span class="p">)}</span><span class="s2">`</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="multiplicaciones-de-enteros-de-32-bits-con-signo">Multiplicaciones de Enteros de 32 bits con signo</h2>

<p>Como ya vimos cuando hablábamos de <a href="https://manualweb.net/javascript/numeros-javascript/">los números en Javascript</a>, este implementa el <a href="https://es.wikipedia.org/wiki/Formato_en_coma_flotante_de_doble_precisi%C3%B3n">formato en coma flotante de doble precisión</a> de 64 bits IEEE 754.</p>

<p>Pero puede ser que necesitemos hacer multiplicaciones de números como si estos fuesen números de 32 bits con signo. Lenguajes como C utilizan este tipo de formatos en sus enteros. En ese caso el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos ofrece el método <a href="https://www.w3api.com/Javascript/Math/imul"><code class="language-plaintext highlighter-rouge">Math.imul()</code></a> el cual tratará los números como si fuesen números de 32 bits con signo.</p>

<p>De esta manera tenemos que saber que para 32 bits con signo, el número -1 sería el valor <strong>0xffffffff</strong> o en decimal el <strong>4294967295</strong>.</p>

<blockquote>
  <p>En los números de 32 bits con signo van del 0 al 2147483648 (o 0x80000000) y del 2147483649 hasta el 4294967295 (o 0xffffffff) irían los números negativos. Por eso el 0xffffffff representa el número -1.</p>
</blockquote>

<p>Lógicamente si realizamos la multiplicación normal:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="o">**</span><span class="mh">0xffffffff</span><span class="o">**</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">numero</span><span class="o">*</span><span class="mi">2</span><span class="p">);</span> <span class="c1">// 8589934590</span>
</code></pre></div></div>

<p>Pero si queremos que se multipliquen como si fuesen números de 32 bits utilizamos <a href="https://www.w3api.com/Javascript/Math/imul"><code class="language-plaintext highlighter-rouge">Math.imul()</code></a></p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="o">**</span><span class="mh">0xffffffff</span><span class="o">**</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">imul</span><span class="p">(</span><span class="nx">numero</span><span class="p">,</span><span class="mi">2</span><span class="p">));</span> <span class="c1">// -2</span>
</code></pre></div></div>

<p>Si por lo que sea hemos realizado la multiplicación normal, siempre podemos convertir a nuestro número en un entero de 32 bits con signo de la siguiente forma <a href="https://manualweb.net/javascript/operadores-sobre-bits/">utilizado los operadores de bits</a>.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="o">**</span><span class="mh">0xffffffff</span><span class="o">**</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">multiplicacion</span> <span class="o">=</span> <span class="nx">numero</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// 8589934590</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">multiplicacion</span> <span class="o">|</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// -2 </span>
</code></pre></div></div>

<blockquote>
  <p>La web <a href="https://www.rapidtables.com/convert/number">https://www.rapidtables.com/convert/number</a> nos permite realizar conversiones entre números de una forma muy útil.</p>
</blockquote>

<p>Si bien es verdad que esto solo funciona cuando el número resultado está dentro de rango, si no, no funciona.</p>

<h2 id="ceros-en-números-binarios">Ceros en números binarios</h2>

<p>Otro método que nos encontramos en el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> es el método <a href="https://www.w3api.com/Javascript/Math/clz32"><code class="language-plaintext highlighter-rouge">Math.clz32()</code></a>. En este caso, método <a href="https://www.w3api.com/Javascript/Math/clz32"><code class="language-plaintext highlighter-rouge">Math.clz32()</code></a> nos permite saber cuántos ceros hay al inicio de un número binario de 32 bits sin signo.</p>

<p>Al método <a href="https://www.w3api.com/Javascript/Math/clz32"><code class="language-plaintext highlighter-rouge">Math.clz32()</code></a>se le pasa el número como parámetro.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 00000000000000000000000000001100</span>
<span class="kd">let</span> <span class="nx">n1</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span>   

<span class="c1">// 00000000000000000000010011010010</span>
<span class="kd">let</span> <span class="nx">n2</span> <span class="o">=</span> <span class="mi">1234</span><span class="p">;</span> 

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">clz32</span><span class="p">(</span><span class="nx">n1</span><span class="p">));</span> <span class="c1">// 28</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">clz32</span><span class="p">(</span><span class="nx">n2</span><span class="p">));</span> <span class="c1">// 21</span>
</code></pre></div></div>

<p>Otra de las capacidades que encontramos con el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> es poder calcular logaritmos. Un logaritmo es el exponente al que hay que elevar un número base para obtener otro número determinado.</p>]]></content><author><name>manual_web</name></author><category term="math" /><category term="máximo" /><category term="mínimo" /><category term="32_bits" /><category term="números_binarios" /><category term="raíz_cuadrada" /><summary type="html"><![CDATA[Algunas operaciones avanzadas del objeto Math en Javascript son el cálculo de raíces cuadradas, cálculo de mínimos y máximos, multiplicaciones de números de 32 bits y manejo de ceros en números binarios.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Objeto Math</title><link href="https://www.manualweb.net/javascript/objeto-math/" rel="alternate" type="text/html" title="Objeto Math" /><published>2023-03-24T00:00:00+01:00</published><updated>2023-03-24T00:00:00+01:00</updated><id>https://www.manualweb.net/javascript/objeto-math</id><content type="html" xml:base="https://www.manualweb.net/javascript/objeto-math/"><![CDATA[<p>El lenguaje <a href="https://www.manualweb.net/javascript/">Javascript</a> nos ofrece el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> el cual nos permite realizar una serie de operaciones matemáticas con números de forma sencilla. Para ello nos ofrece un conjunto de métodos y constantes que nos facilitan dichas operaciones.</p>

<h2 id="potencias">Potencias</h2>

<p>La potencia de un número se consigue multiplicando la <strong>base</strong> por si misma tantas veces como indique el <strong>exponente</strong> y se expresa de la forma:</p>

<pre><code class="language-undefined">base^{exponente}
</code></pre>

<p>De esta forma una base de exponente 2 se multiplicará por si misma dos veces.</p>

<p>En <a href="https://www.manualweb.net/javascript/">Javascript</a> el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos ofrece el método <a href="https://www.w3api.com/Javascript/Math/pow"><code class="language-plaintext highlighter-rouge">Math.pow(base,exponente)</code></a>, el cual recibe dos parámetros, la base y el exponente, retornando el valor de la potencia.</p>

<p>Por lo tanto, para codificar una potencia de una base de 2 elevado a la potencia de 5 lo expresaríamos de la siguiente forma.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">));</span>
</code></pre></div></div>

<p><a href="https://www.manualweb.net/javascript/historia-de-javascript/#madurez-javascript">A partir de ES20016</a> aparece el <a href="https://www.manualweb.net/javascript/operadores-aritmeticos/">operador </a><a href="https://www.manualweb.net/javascript/operadores-aritmeticos/"><code class="language-plaintext highlighter-rouge">**</code></a> que viene a realizar la misma operación de cálculo de potencias que <a href="https://www.w3api.com/Javascript/Math/pow"><code class="language-plaintext highlighter-rouge">Math.pow()</code></a></p>

<p>Así, el anterior código se podría escribir de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="mi">5</span><span class="p">);</span>
</code></pre></div></div>

<p>Una forma más sencilla de calculas potencias en <a href="https://www.manualweb.net/javascript/">Javascript</a>.</p>

<h2 id="número-pi">Número PI</h2>

<p>Una propiedad interesante del objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> es la propiedad <a href="https://www.w3api.com/Javascript/Math/PI"><code class="language-plaintext highlighter-rouge">Math.PI</code></a> y es que la propiedad <a href="https://www.w3api.com/Javascript/Math/PI"><code class="language-plaintext highlighter-rouge">Math.PI</code></a> representa el valor del número PI (π), es decir 3,14159…</p>

<p>Simplemente nos valdrá con referirnos a la propiedad para obtener su valor.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span><span class="p">);</span> <span class="c1">// 3,14159</span>
</code></pre></div></div>

<p>De esta manera podremos utilizar el valor de PI(π) para calcular cosas como el área de un círculo. y es que recordemos que el área de un círculo a partir de su radio es:</p>

<pre><code class="language-undefined">area = π*r^{2}
</code></pre>

<p>Por lo que codificándolo nos quedaría de la siguiente forma:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">radio</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">area</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">pow</span><span class="p">(</span><span class="nx">radio</span><span class="p">,</span><span class="mi">2</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`El área de un círculo de rádio </span><span class="p">${</span><span class="nx">radio</span><span class="p">}</span><span class="s2"> es de </span><span class="p">${</span><span class="nx">area</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="signo">Signo</h2>

<p>Mediante el método <a href="https://www.w3api.com/Javascript/Math/sign"><code class="language-plaintext highlighter-rouge">Math.sign()</code></a> podemos conocer el signo de un valor pasado como parámetro. De tal manera que el método <a href="https://www.w3api.com/Javascript/Math/sign"><code class="language-plaintext highlighter-rouge">Math.sign()</code></a> devuelve el valor de 1 si el valor es positivo o -1 si el valor es negativo.</p>

<blockquote>
  <p>Si pasamos un valor de 0 o de -0 al método <a href="https://www.w3api.com/Javascript/Math/sign"><code class="language-plaintext highlighter-rouge">Math.sign()</code></a>, este nos devuelve el valor sin procesar, es decir 0 y -0.</p>
</blockquote>

<p>Así podríamos hacer las siguientes comparaciones de signo en <a href="https://www.manualweb.net/javascript/">Javascript</a>:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">n1</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">n2</span> <span class="o">=</span> <span class="o">-</span><span class="mi">37</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">n3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="k">switch </span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">sign</span><span class="p">(</span><span class="nx">n1</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Positivo</span><span class="dl">"</span><span class="p">);</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="k">case</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> 
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Negativo</span><span class="dl">"</span><span class="p">);</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="nl">default</span><span class="p">:</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Has puesto un 0</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>
</code></pre></div></div>

<h2 id="redondeando-números">Redondeando números</h2>

<p>Si estamos trabajando con números decimales vamos a necesitar, en ciertas ocasiones, el redondear el número. Para ello, el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos ofrece un conjunto de métodos.</p>

<p>Podemos realizar un redondeo simple, de tal manera que obtengamos <strong>el número entero más cercano</strong>, mediante el método <a href="https://www.w3api.com/Javascript/Math/round"><code class="language-plaintext highlighter-rouge">Math.round()</code></a>. Es decir, decimales por encima del 5 redondean hacía arriba y decimales por debajo del 5 redondean hacía abajo.</p>

<p>Por lo que podríamos tener este código de redondeo con el método <a href="https://www.w3api.com/Javascript/Math/round"><code class="language-plaintext highlighter-rouge">Math.round()</code></a>:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="mf">14.436</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="nx">numero</span><span class="p">));</span> <span class="c1">// 14</span>
</code></pre></div></div>

<p>Pero nos podría interesar redondear de forma superior, es decir, al número más alto de los decimales. Para ello tenemos el método <a href="https://www.w3api.com/Javascript/Math/ceil"><code class="language-plaintext highlighter-rouge">Math.ceil()</code></a>. En este caso el código fuente quedaría de la siguiente manera:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="mf">14.436</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="nx">numero</span><span class="p">));</span> <span class="c1">// 15</span>
</code></pre></div></div>

<p>O, por el contrario, redondear al número más bajo. Aquí nos da igual el valor que tengan los decimales y lo cerca o lejos que esté el número superior. Para redondear de forma inferior contamos con el método <a href="https://www.w3api.com/Javascript/Math/floor"><code class="language-plaintext highlighter-rouge">Math.floor()</code></a>. Al igual que los anteriores dos métodos vemos como codificarlo:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="mf">14.436</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">numero</span><span class="p">));</span> <span class="c1">// 14</span>
</code></pre></div></div>

<p>También disponemos de la opción de poder redondear con precisión los números decimales. En este caso el método <a href="https://www.w3api.com/Javascript/Math/fround"><code class="language-plaintext highlighter-rouge">Math.fround()</code></a> nos devuelve el <em>número decimal en 32 bits</em> representando que represente el número.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="mf">5.05</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">fround</span><span class="p">(</span><span class="nx">numero</span><span class="p">));</span> <span class="c1">// 5.050000190734863</span>
</code></pre></div></div>

<p>Hay que tener cuidado ya que la representación en 32 bits puede tener depreciaciones y por eso salen estos números.</p>

<p>La última opción de redondeo que tenemos con el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> es el método <a href="https://www.w3api.com/Javascript/Math/trunc"><code class="language-plaintext highlighter-rouge">Math.trunc()</code></a> el cual directamente <strong>trunca la parte decimal</strong>, independientemente de su valor, y <strong>se queda con la parte entera</strong>.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">numero</span> <span class="o">=</span> <span class="mf">14.436</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">trunc</span><span class="p">(</span><span class="nx">numero</span><span class="p">));</span> <span class="c1">// 14</span>
</code></pre></div></div>

<h2 id="números-aleatorios">Números aleatorios</h2>

<p>Si queremos generar números aleatorios tenemos el método <a href="https://www.w3api.com/Javascript/Math/random"><code class="language-plaintext highlighter-rouge">Math.random()</code></a> que genera, cada vez que se invoca, un número aleatorio entre 0 y 1 con 16 posiciones decimales.</p>

<p>Este valor entre 0 y 1 nos sirve para poder generar cualquier número aleatorio. Para ello simplemente tendremos que multiplicar el valor que nos devuelva <a href="https://www.w3api.com/Javascript/Math/random"><code class="language-plaintext highlighter-rouge">Math.random()</code></a> por el valor del número máximo, incrementando en una unidad, del que queramos la aleatoriedad.</p>

<p>De esta manera para sacar un número aleatorio entre 0 y 4</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">aleatorio</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span><span class="o">*</span><span class="mi">5</span>
</code></pre></div></div>

<p>Este código nos devolverá un número aleatorio de tipo decimal, por lo que si queremos obtener solo el valor entero deberemos de redondearlo mediante el método <a href="https://www.w3api.com/Javascript/Math/floor"><code class="language-plaintext highlighter-rouge">Math.floor()</code></a>, por lo que nuestro código se convertirá en:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">aleatorio</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span><span class="o">*</span><span class="mi">5</span><span class="p">);</span>
</code></pre></div></div>

<p>Si por lo que fuese queremos un número aleatorio que empezase por 1, simplemente valdrá con sumarle 1 a la operación y solo multiplicarle por el valor límite.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">eatorio</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="valores-absolutos">Valores absolutos</h2>

<p>Si queremos obtener valores absolutos en <a href="https://www.manualweb.net/javascript/">Javascript</a>, el objeto <a href="https://w3api.com/Javascript/Math/"><code class="language-plaintext highlighter-rouge">Math</code></a> nos ofrece el método <a href="https://www.w3api.com/Javascript/Math/abs"><code class="language-plaintext highlighter-rouge">Math.abs()</code></a>, el cual devuelve el valor absoluto del número pasado como parámetro.</p>

<p>Vemos cómo podemos pasar diferentes valores al método <a href="https://www.w3api.com/Javascript/Math/abs"><code class="language-plaintext highlighter-rouge">Math.abs()</code></a> y ver su resultado en la consola.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">n1</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">n2</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">abs</span><span class="p">(</span><span class="nx">n1</span><span class="p">));</span>  <span class="c1">// 4</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">abs</span><span class="p">(</span><span class="nx">n2</span><span class="p">));</span>  <span class="c1">// 3</span>
</code></pre></div></div>]]></content><author><name>manual_web</name></author><category term="math" /><category term="potencia" /><category term="número_pi" /><category term="signo" /><category term="valor_absoluto" /><category term="redondeo" /><category term="número_aleatorio" /><summary type="html"><![CDATA[El objeto Math en Javascript nos permite, entre otras cosas. calcular potencias, conocer el número PI, cambiar el valor de un número, obtener un valor absoluto o un número aleatorio.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" /><media:content medium="image" url="https://www.manualweb.net/img/covers/javascript-cover.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>