JavaScript

Es un estándar (ECMAScript), por lo que cada engine puede expandirlo.

  • TypeScript

    Creado por Microsoft añade que se tengan que especificar el tipo de dato.

    TypeScript usa la extensión ".ts"

Al estar pensado para scripting, sigue el mismo esquema que BASH; solo ejecuta funciones si son llamadas directamente, el resto lo procesa todo en tiempo de ejecución.

Deno

Instalar Deno Engine

curl -fsSL https://deno.land/install.sh | sh

Ejecutar un archivo

deno run [archivo].ts

  • "--allow-net" para permitir que el archivo use red
  • "--config" para especificar otro archivo de configuración deno.json ó deno.jsonc

Vendor - Dependencias en local

deno cache [archivo].ts

Archivos de proyecto

  • deno.json ó deno.jsonc

    Contiene las dependencias y configuración del proyecto para el compilador, formateador y enlazador.

    Si contiene "tasks" permite acortar comandos largos en una simple tarea. Las tareas se corren con; "deno task [name]"

    Si contiene "fmt" permite personalizar como va a formatear si se corre un "deno fmt".

    Si contiene el tuple "exclude" se puede indicar que directorios no se quiere incluir por parte de la ejecución de Deno.

{
  "compilerOptions": {
    "allowJs": true,
    "lib": ["deno.window"],
    "strict": true
  },
  "lint": {
    "include": ["src/"],
    "exclude": ["src/testdata/", "src/fixtures/**/*.ts"],
    "rules": {
      "tags": ["recommended"],
      "include": ["ban-untagged-todo"],
      "exclude": ["no-unused-vars"]
    }
  },
  "fmt": {
    "useTabs": true,
    "lineWidth": 80,
    "indentWidth": 4,
    "semiColons": false,
    "singleQuote": true,
    "proseWrap": "preserve",
    "include": ["src/"],
    "exclude": ["src/testdata/", "src/fixtures/**/*.ts"]
  },
  "lock": false,
  "nodeModulesDir": true,
  "unstable": ["webgpu"],
  "npmRegistry": "https://mycompany.net/artifactory/api/npm/virtual-npm",
  "test": {
    "include": ["src/"],
    "exclude": ["src/testdata/", "src/fixtures/**/*.ts"]
  },
  "tasks": {
    "start": "deno run --allow-read main.ts"
  },
  "imports": {
    "oak": "jsr:@oak/oak"
  },
  "exclude": [
    "dist/"
  ]
}

TypeScript - JavaScript

Comentarios

// Esto es un comentario

Importar

Deno soporta tanto NPM como JSR.

Consideración; la función debe estar dentro de "{}" cuando el módulo no tiene un "export default function ....."

Las funciones que no necesitar las "{}" en el import son las que tienen en su módulo un el default.

  • De otros archivos
import [Struct],[function_N] from "./[archivo].ts";
  • De la stdlib

Deno stdlib

import [Function] from "[package_registry]:@std/[module]"

Importar desde JSR

import [Function] as mod from "jsr:@[user_or_organization]/[module]"

Importar desde NPM

import [Function] from "npm:[module]@[version]"

Variables y constantes

  • Variable

    Alcance local en una función

var [var_name]: [var_type_if_is_Typescript] = [value]
  • Constante

    Alcance global cuando son variables declaradas fuera de una función pero con alcance de bloque. Funciones incluidas.

    Solo pueden ser declaradas una vez dentro de su alcance.

{
	const [var_name]: [var_type_if_is_Typescript] = [value]
}

Las constantes no pueden actualizarse a futuro (por que hace un shadowing en realidad, que es una redeclaración a bajo nivel).

  • let

    Al igual que en Rust, sirven para declarar variables. Y al igual que en "const" tiene alcance de bloque pero pueden actualizarse a posteriori.

{
	let [var_name]: [var_type_if_is_Typescript] = [value]
}

Structuras

interface [struct_name] {
	[var_name1]: [type];
	[var_name2]: [type];
}

const [instance_name]: [struct_name] = {
	[var_name1]: [value],
	[var_name2]: [value],
}

Tipos

let var1 = 5;
let var2 = 12.1;
let var3 = 'string1';
let var4 = "string2";
let var5 = true;
let var6 = false;
let var7 = 'c';

Se puede formatear un retorno de string sin guardar previamente en una variable;

return 'Hello, ${[var_or_struct]}'; 

Funciones

function [func_name]([var_name]: [type]): [return_type]{
	[operations];
	return [return_value];
} 

Si a la función se le añade "export function ...." entonces se vuelve pública y puede ser llamada desde otros archivos.

Equivalente al "pub" en Rust.

Si a la función le añadis "async" la volves eso; asíncrona, luego la variable que va a contener el retorno debe tener un "await" antes de su llamado.

Condicionales

  • Para booleanos es un triple = para verificar valores
  • Para el resto de tipos de datos son dobles = solamente

If - else if - else

if (var1 > var2) {
	console.log("el valor de var2 es mayor que var1." + '\n' + "Var2;" + var2 + '\n' + "Var1;" + var1);
} else if (var1 > var2) {
	console.log("el valor de var2 es menor que var1." + '\n' + "Var2;" + var2 + '\n' + "Var1;" + var1);
} else if (var1 == 0 || var2 >=12) {
	console.log("var1 es cero ó var2 es mayor o igual a 12" + '\n' + "Var2;" + var2 + '\n' + "Var1;" + var1);
} else if ( var1 != var2 ) {
	console.log("var1 no es igual a var2");
} else {
	console.log("sin valores de coincidencia");
}

Switch

switch (var1) {
	case 0:
	case 1:
		console.log("el valor de var1 es 0 ó 1");
		break;
	case 5:
		console.log("el valor de var1 es 5");
		break;
	default:
		console.log("sin valores de coincidencia");
		break;
}

While

while (var5 === true) {
	console.log("var 5 es verdadero");
}

/// Loop infinito

while (true){
	console.log("loop infinito");
}

/// Loop combinado
let temporal1 = 0;
while (var5 === true && temporal1 <= 5){
	console.log("loop finito");
	temporal1 += 1;
}

For

Es igual que en C: inicio; condicion; modificacion final Al igual que con los if/else, pueden combinarse unos dentro de otros

for (let i = 0; i <= 15; i++){
	console.log("i = " + i + ".");
}

/// Breaks combinados
/// Cuando en un bucle se usa el break se asegura que el resto no se procesa y que se
/// termina el ciclo

for (let j = 0; j <= 15; j++){
	// Acá el if hace que no se impriman los mayores a 10
	if ( j > 10) {
		break;
	} 
	console.log("j = " + j + ".");
}

/// El continue en cambio, hace que el ciclo se termine y se inicie el nuevo

for (let e = 0; e <= 15; e++){
	// Acá el if hace que solamente se impriman los mayores a 10
	if ( e < 10) {
		continue;
	} 
	console.log("e = " + e + ".");
}

Arrays

El estándar de javascript lo toma como una sucesion finita de chars con eso se puede hacer uso de cada uno de sus componentes/chars.

Se cuenta desde cero, por que va por posiciones

let string1 = "Cadena de texto 1";

/// imprimirá "C"
console.log("caracter cero; " + string1[0]);
/// también se puede contar desde atrás
/// imprimirá "!"
/// el método "length" devuelve el largo de la cadena
console.log("ultimo caracter; " + string1[ string1.length -1 ]);

/// Si se utiliza un array que está en una posición inválida se obtiene un error de tipo
/// "undefined"

console.log("caracter fuera de rango; " + string1[99999]);

/// Así mismo los valores pueden ser asignados a otras variables
/// La primera toma el primer caracter
/// La segunda toma el rango desde cero hasta la posicion numero 5
let varbuffer = string1[0];
let varbuffer2 = string1[0,5];

console.log("Buffer1 es;" + varbuffer + '\n' + "Buffer2 es;" + varbuffer2);

Tests - Pruebas

Esto lo ofrece el motor Deno

import { assertEquals } from "jsr:@std/assert";
import Person, { sayHello } from "./person.ts";

Deno.test("sayHello function", () => {
  const grace: Person = {
    lastName: "Hopper",
    firstName: "Grace",
  };

  assertEquals("Hello, Grace!", sayHello(grace));
});

Luego se ejecuta ese testeo con;

deno test [archivo].ts

Funciones comunes

  • Imprimir en pantalla

console.log([function_or_variable])

// show variable type
console.log("constante1 es del tipo; " + typeof constante1);
  • Llamado asíncrono

await [function][func_parameters];

Al ser guardado en una variable, si se imprime en pantalla también necesita un "await").

  • Request web (asíncrono)

fetch("[URL]");

  • Tipo de dato

typeof [var]

  • Obtener el largo de una cadena

[string_variable].length

  • Ejecutar proceso hijo

new Deno.command("[path]/[binario]", [args], [opciones])

Algunas de las opciones son; - stdin: "piped", - stdout: "piped",