{"id":231970,"date":"2023-01-12T12:04:00","date_gmt":"2023-01-12T09:04:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231970"},"modified":"2022-11-10T05:56:35","modified_gmt":"2022-11-10T02:56:35","slug":"5-caracteristicas-de-javascript-de-vanguardia-para-mejorar-su-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/5-caracteristicas-de-javascript-de-vanguardia-para-mejorar-su-codigo\/","title":{"rendered":"5 caracter\u00edsticas de JavaScript de vanguardia para mejorar su c\u00f3digo"},"content":{"rendered":"\n<p>Las caracter\u00edsticas de JavaScript siempre est\u00e1n creciendo y recibiendo otras nuevas como operadores, construcciones de sintaxis, expresiones. Muchos de los que se han introducido en los \u00faltimos a\u00f1os y algunos de ellos ya son una segunda naturaleza, como la expresi\u00f3n de flecha gruesa o el operador de <code>=&gt;<\/code>extensi\u00f3n de objetos .<code>...<\/code><\/p>\n<h2>Las caracter\u00edsticas de JavaScript comienzan como propuestas<\/h2>\n<p>Todas estas caracter\u00edsticas de JavaScript comienzan como propuestas presentadas al TC 39. El <a href=\"https:\/\/www.ecma-international.org\/memento\/tc39-rf-tg.htm\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Comit\u00e9 T\u00e9cnico 39<\/a> se encarga de estandarizar:<\/p>\n<blockquote>\n<p>el lenguaje de programaci\u00f3n ECMAScript (JavaScript) de prop\u00f3sito general, multiplataforma e independiente del proveedor. Esto incluye la sintaxis, la sem\u00e1ntica y las bibliotecas del lenguaje y las tecnolog\u00edas complementarias que respaldan el lenguaje.<\/p>\n<\/blockquote>\n<p>Hay muchas propuestas de JavaScript que podemos comenzar a agregar a nuestro flujo hoy, gracias a <a href=\"https:\/\/babeljs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Babel, el compilador de JavaScript<\/a>. Algunos de ellos ofrecen m\u00e1s claridad, como el separador num\u00e9rico. Otros, como las <code>do<\/code>expresiones, introducen la capacidad de mezclar condicionales complejos con etiquetas React JSX.<\/p>\n<p>Veamos en este art\u00edculo 5 caracter\u00edsticas de JavaScript que todav\u00eda est\u00e1n en las etapas de propuesta pero que podemos usar con Babel y mejorar\u00e1n significativamente su experiencia de codificaci\u00f3n.<\/p>\n<p>Cada uno tiene un enlace a su p\u00e1gina de Babel donde se puede ver c\u00f3mo configurar Babel para usarlo, aunque las funciones de JavaScript propuestas aqu\u00ed descritas ya est\u00e1n incluidas con Babel 7. Cada secci\u00f3n tambi\u00e9n tiene un enlace a su propuesta en la organizaci\u00f3n <a href=\"https:\/\/github.com\/tc39\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ecma TC39<\/a> en <a href=\"https:\/\/startfunction.com\/tag\/github\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GitHub<\/a>.<\/p>\n<h2>Operador coalescente nulo<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbe16eaf.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbe16eaf.png\" alt=\"5 caracter\u00edsticas de JavaScript de vanguardia para mejorar su c\u00f3digo\" ><\/a><\/p>\n<p>Propuesta: <a href=\"https:\/\/github.com\/tc39\/proposal-nullish-coalescing\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-nullish-coalescing<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-nullish-coalescing-operator.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-nullish-coalescing-operator.html<\/a><\/p>\n<p>Esta propuesta de JavaScript describe un operador que permite proporcionar un valor alternativo en el lado derecho del operador cuando una variable o una propiedad de objeto no est\u00e1 definida. Si no est\u00e1 indefinido, usar\u00e1 el lado izquierdo del operador:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef ?? 2021; <\/code><\/pre>\n<p>Esto es similar a escribirlo como un operador ternario:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef? maybeUndef: 2021; <\/code><\/pre>\n<p>Tenga en cuenta que este operador no verifica que la var no exista. Esto arrojar\u00e1 un error:<\/p>\n<pre><code>const val = maybeUndef ?? 2021;  <\/code><\/pre>\n<p>Pero cuidado, este operador no es 100% como un operador ternario que devuelve el primer lado si la condici\u00f3n evaluada es verdadera. No evaluar\u00e1 valores que generalmente son falsos en <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> para <code>false<\/code>. Por ejemplo, no se considerar\u00e1 una cadena vac\u00eda <code>false<\/code>:<\/p>\n<pre><code>const someEmptyString = '';\nconst val = someEmptyString ?? 'fallback'; <\/code><\/pre>\n<p>A diferencia de este operador coalescente nulo, se generar\u00eda un operador ternario <code>fallback<\/code>como resultado de esta evaluaci\u00f3n.<\/p>\n<h2>Operador de encadenamiento opcional<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbfc7df0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbfc7df0.png\" alt=\"5 caracter\u00edsticas de JavaScript de vanguardia para mejorar su c\u00f3digo\" ><\/a><\/p>\n<p>Propuesta: <a href=\"https:\/\/github.com\/tc39\/proposal-optional-chaining\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-opcional-encadenamiento<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-optional-chaining.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-opcional-encadenamiento.html<\/a><\/p>\n<p>Este operador tambi\u00e9n funciona en variables y propiedades de objetos: verifica si las propiedades anidadas que estamos recorriendo existen o no. Sin este operador, tenemos que verificar cada propiedad anidada:<\/p>\n<pre><code>const val = anObj &amp;&amp; anObj.aProp &amp;&amp; anObj.aProp.aNestedProp<\/code><\/pre>\n<p>Con el nuevo operador de encadenamiento opcional, podemos hacer algo como:<\/p>\n<pre><code>const val = anObj.aProp?.aNestedProp<\/code><\/pre>\n<p>Esto se ve mucho m\u00e1s claro y es m\u00e1s corto de escribir. Este operador tambi\u00e9n funciona con arreglos num\u00e9ricos, por lo que es bueno trabajar con colecciones:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp<\/code><\/pre>\n<p>Y podemos apilar m\u00faltiples operadores:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp?.aNestedProp<\/code><\/pre>\n<p>\u00bfY si combinamos este con el anterior, coalescencia nula? Obtenemos una sintaxis que verifica que cada propiedad atravesada exista y, si no es as\u00ed, proporciona un valor alternativo:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp ?? 'someDefaultValue'<\/code><\/pre>\n<p>Si alguno de los valores no existe, devolver\u00e1 <code>someDefaultValue<\/code>. <a href=\"https:\/\/lodash.com\/docs#get\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">La combinaci\u00f3n de estos dos operadores es una excelente manera de reemplazar la funci\u00f3n get<\/a> de lodash .<\/p>\n<h2>operador de tuber\u00eda<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc121b73.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc121b73.png\" alt=\"5 caracter\u00edsticas de JavaScript de vanguardia para mejorar su c\u00f3digo\" ><\/a><\/p>\n<p>Propuesta: <a href=\"https:\/\/github.com\/tc39\/proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-pipeline-operator<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-op<\/a> <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">e<\/a> <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rator<\/a><\/p>\n<p>Este operador es parte de varias funciones experimentales de JavaScript, y proporciona m\u00e1s legibilidad al encadenar varias funciones juntas. Considere la siguiente funci\u00f3n:<\/p>\n<pre><code>const reverseWords = \n      str =&gt; str\n        .split( ' ') .reduce( (revStr, word) =&gt; [ word, ...revStr ], []) .join( ' ' );\n\nconsole.log( reverseWords( 'this is fun') ); <\/code><\/pre>\n<p>Si necesitamos reutilizar estas transformaciones parciales que est\u00e1n encadenadas, podemos dividirlas en diferentes funciones y luego componer el resultado us\u00e1ndolas:<\/p>\n<pre><code>const splitBySpace = str =&gt; str.split( ' ' );\nconst reverseArray = arr =&gt; arr.reduce( (acc, cur) =&gt; [ cur, ...acc ], [] );\nconst joinWithSpace = arr =&gt; arr.join( ' ' );\n\nconst reverseWords =\n    str =&gt; joinWithSpace(\n        reverseArray(\n            splitBySpace(\n                str)) );\n\nconsole.log( reverseWords( 'this is fun') ); <\/code><\/pre>\n<p>Lo raro de esto es que tenemos que empezar a leer esto desde abajo, la <code>splitBySpace<\/code>l\u00ednea, hacia arriba, para entender las transformaciones aplicadas a la cadena. Esto va en contra de nuestro flujo de lectura natural, de arriba a abajo. Tambi\u00e9n terminamos con todos esos horribles par\u00e9ntesis colgantes. Esto podr\u00eda escribirse en una sola l\u00ednea y no es mucho m\u00e1s bonito:<\/p>\n<pre><code>const reverseWords = str =&gt; joinWithSpace( reverseArray( splitBySpace( str)) );<\/code><\/pre>\n<p>Aqu\u00ed, tenemos que empezar a leer desde la funci\u00f3n central hacia las funciones exteriores, o de derecha a izquierda, lo que es contrario a la intuici\u00f3n de la lectura occidental de izquierda a derecha.<\/p>\n<p>El operador de canalizaci\u00f3n puede hacer que estas construcciones sean mucho m\u00e1s legibles y similares al encadenamiento que ten\u00edamos originalmente antes de mover las transformaciones a funciones separadas:<\/p>\n<pre><code>const reverseWords =\n    str =&gt; str\n        |&gt; splitBySpace\n        |&gt; reverseArray\n        |&gt; joinWithSpace;<\/code><\/pre>\n<p>Ahora las transformaciones aplicadas se escriben de manera similar a nuestra forma de escribir, de arriba a abajo, son m\u00e1s claras de leer y no tenemos par\u00e9ntesis colgando. \u00a1\u00c9xito!<\/p>\n<h2>Separador num\u00e9rico<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc276ca0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc276ca0.png\" alt=\"5 caracter\u00edsticas de JavaScript de vanguardia para mejorar su c\u00f3digo\" ><\/a><\/p>\n<p>Propuesta: <a href=\"https:\/\/github.com\/tc39\/proposal-numeric-separator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-numeric-separator<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-numeric-separator.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-numeric-separator.html<\/a><\/p>\n<p>Este separador num\u00e9rico es diferente a las otras caracter\u00edsticas de JavaScript ya que no es un operador. Es una construcci\u00f3n de sintaxis que hace que los literales num\u00e9ricos sean m\u00e1s legibles al crear una separaci\u00f3n visual entre grupos de d\u00edgitos. Los literales num\u00e9ricos grandes son dif\u00edciles de analizar y comprender r\u00e1pidamente, especialmente cuando un d\u00edgito se repite varias veces. Por ejemplo:<\/p>\n<pre><code>const longNum = 1000000000000;<\/code><\/pre>\n<p>Es dif\u00edcil de entender con una mirada r\u00e1pida. Este separador lo hace m\u00e1s legible:<\/p>\n<pre><code>const longNum = 1_000_000_000_000;<\/code><\/pre>\n<p>Ahora podemos entender r\u00e1pidamente que esto es un bill\u00f3n.<\/p>\n<h2>hacer expresiones<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc5290ed.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc5290ed.png\" alt=\"5 caracter\u00edsticas de JavaScript de vanguardia para mejorar su c\u00f3digo\" ><\/a><\/p>\n<p>Propuesta: <a href=\"https:\/\/github.com\/tc39\/proposal-do-expressions\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-do-expressions<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-do-expressions\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-do-expressions<\/a><\/p>\n<p>La \u00faltima de las nuevas funciones de JavaScript que veremos es una expresi\u00f3n que se puede evaluar. El resultado de esta expresi\u00f3n viene despu\u00e9s de ejecutar un bloque que puede tener m\u00faltiples sentencias dentro. Podemos entender f\u00e1cilmente las expresiones do si traducimos una expresi\u00f3n de operador ternario como esta:<\/p>\n<pre><code>const res = isCold( color )? 'light-blue': 'orange';<\/code><\/pre>\n<p>Escribir\u00edamos la expresi\u00f3n equivalente <code>do{}<\/code>as\u00ed:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else {\n        'orange';\n    }\n};<\/code><\/pre>\n<p>Tenga en cuenta que no tenemos que devolver el valor ya que esta no es una funci\u00f3n. Si bien en este caso particular, esto se puede escribir de manera m\u00e1s sucinta como un ternario, las expresiones do son mucho m\u00e1s poderosas y permiten m\u00faltiples declaraciones, por ejemplo:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else if (isHot( color)) {\n        'orange';\n    } else if (isRain( color)) {\n        'purple';\n    } else {\n        'green';\n    }\n};<\/code><\/pre>\n<p>Donde esto es realmente poderoso es en JSX, donde podemos mezclarlo con sus etiquetas sin tener que calcular primero el resultado externamente. Por ejemplo, podr\u00edamos hacer lo siguiente si estuvi\u00e9ramos usando <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> para renderizar estos componentes:<\/p>\n<pre><code>const MyComp = ({ color }) =&gt; ({\n            do {\n                if (isCold( color)) {\n                    ;\n                } else if (isHot( color)) {\n                    ;\n                } else if (isRain( color)) {\n                    ;\n                } else {\n                    ;\n                }\n            }\n        }\n\n);<\/code><\/pre>\n<h2>M\u00e1s propuestas de JavaScript<\/h2>\n<p>Cada d\u00eda se discuten m\u00e1s propuestas para agregar caracter\u00edsticas m\u00e1s interesantes al lenguaje JavaScript. Se puede leer una lista cada vez mayor de estas funciones de JavaScript propuestas en <a href=\"https:\/\/github.com\/tc39\/proposals#ecmascript-proposals\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposals#ecmascript-proposals<\/a>. Las propuestas aqu\u00ed est\u00e1n cerca de completarse y, por lo tanto, cerca de agregarse al est\u00e1ndar ECMAScript, como se explica en esta tabla que describe <a href=\"https:\/\/tc39.es\/process-document\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el proceso de aceptaci\u00f3n<\/a>.<\/p>\n<p>Algunas de las nuevas caracter\u00edsticas de JavaScript que exploramos en este art\u00edculo, como las expresiones do o el operador de canalizaci\u00f3n, son <a href=\"https:\/\/github.com\/tc39\/proposals\/blob\/master\/stage-1-proposals.md#stage-1-proposals\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">propuestas de la etapa 1<\/a>, lo que significa que todav\u00eda tienen un camino por recorrer antes de convertirse en parte del est\u00e1ndar ECMAScript.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Obtenga informaci\u00f3n sobre 5 nuevas funciones, operadores y expresiones de JavaScript que mejorar\u00e1n su c\u00f3digo, haci\u00e9ndolo m\u00e1s legible y eficiente.<\/p>\n","protected":false},"author":1,"featured_media":157555,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,747,727,840],"tags":[1172],"class_list":["post-231970","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-fuente-abierta","category-javascript-2","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231970","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=231970"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231970\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/157555"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231970"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231970"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231970"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}