"Iluminación de JavaScript" - Notas de lectura

Por Douglas Crockford
Traductor: Dead Moon (Kaidi Zhu)

nombre

  • [No recomendado] Nombres que comienzan o terminan con un guión bajo_: generalmente para representar propiedades privadas o variables privadas globales
  • [No recomendado] El signo de dólar $: generalmente se agrega a las variables por parte de algunos generadores de código, escapes y procesadores de macros para garantizar que los nombres de las variables generadas no entren en conflicto con el código escrito manualmente.
  • [Recomendado] Todos los nombres de los constructores comienzan con una letra mayúscula y cualquier otro nombre comienza con una letra minúscula

valor

  • Estándar IEEE 754, tipo de coma flotante de 64 bits. 1 bit de signo (0 es positivo, 1 es negativo), 11 bits de exponente, 52 bits efectivos (el valor predeterminado comienza con 1 y los 53 bits reales son válidos)
  • La idea de los números de coma flotante: dividir un número en dos partes para su almacenamiento
    • La primera parte son los dígitos efectivos significantand (o también llamado coeficiente coeficiente, fracción fracción, mantisa mantisa)
    • La segunda parte es el exponente, que indica dónde debe insertarse el punto decimal en los dígitos efectivos.

tipo booleano

  • Además de verdadero y falso, también hay verdadero y falso.
    • fantasma falso falso: falso, nulo, indefinido, "" (cadena vacía), 0, NaN
    • Verdad Mágica: Todo lo demás

objeto de instancia que no es de clase

  • Un constructor es una función que devuelve un objeto. Sus parámetros y variables se convierten en propiedades privadas del objeto devuelto, sin propiedades públicas. Algunas funciones dentro del constructor se convierten en métodos que devuelven objetos. Las propiedades privadas se incluyen dentro de los cierres, mientras que los métodos públicos se empaquetan en el objeto congelado devuelto

llamada de cola

  • Llamada de cola: el valor de retorno de una función es el valor de retorno directo de otra función.
  • La optimización de llamadas de seguimiento no se puede realizar en un bloque de prueba. catch regenerará un alcance, el objeto de activación no se puede reducir
  • Se crea un nuevo objeto de función dentro de la función, y esta nueva función usa variables libres (cierres), por lo que no se puede reducir

pureza

  • En la programación funcional, el resultado de retorno de una función solo está determinado por la entrada. es decir, la misma entrada devuelve el mismo resultado

  • Ventajas de las funciones puras:

    • Mejor diseño modular: alta cohesión, bajo acoplamiento
    • más fácil de probar
    • Componibilidad más poderosa
    • Garantizado para ser seguro para subprocesos y eficiente
  • práctica:

    • Elimine todos los operadores de asignación, así como las declaraciones var y let, dejando solo las declaraciones const
    • Se descartan los operadores y métodos que pueden modificar el contenido de los objetos.
    • Ditch getters y setters
    • Descartar la función exec de expresión regular modificará el atributo lastIndex
    • for while y descartar, usar recursividad de cola
    • Constructor de fecha en desuso, Math.random

programación basada en eventos

  • Una característica típica de los lenguajes de programación secuencial es que bloquean la entrada y la salida
  • simultaneidad
    • Concurrencia isomórfica: maneje múltiples operaciones similares al mismo tiempo, como las matrices que proporcionan una función pura que puede operar en todos los elementos
    • Concurrencia heterogénea: admite la colaboración de elementos lógicos con diferentes responsabilidades, para que puedan trabajar juntos como un equipo
  • Una función de evento es una función que regresa inmediatamente, posiblemente antes de que se complete el trabajo que requiere. Su resultado suele ser
  • JS es de un solo subproceso. La mayor parte del estado no está en la pila, sino en el cierre de la función.
  • Mecanismo de bucle de eventos

fecha

  • Es bastante confuso de usar. Se recomiendan funciones puras. [Problemas históricos] El problema de getFullYear y setFullYear y getYear y setYear
  • JS tiene marcas de tiempo a partir de 1970-01-01. Para 2038, los sistemas operativos Unix de 32 bits causarán problemas porque todos los bits en la marca de tiempo se agotaron y se desbordaron.

JSON

  • El origen del nombre de JSON (JavaScript Object Notation).
  • Si el objeto contiene un método toJSON, se ejecutará el propio método de toJSON. En términos generales, JSON.stringify llamará a este método
  • Sustituto de parámetro opcional para JSON.stringify:
    • Si es una función, toma una clave y un valor, y devuelve el valor final de la clave
    • Si es una matriz de cadenas, solo se transformarán las propiedades de la matriz (filtro)

prueba

  • Solo podemos probar que el programa tiene fallas, pero no que sea perfecto
  • Bug es sinónimo de caos. Eliminar el desorden aumenta la productividad más que las pruebas
  • Suele desarrollar el hábito de borrar más códigos. Al estimar el ciclo de desarrollo, asegúrese de dejar tiempo para eliminar el código redundante y eliminar las dependencias problemáticas.
  • Los falsos negativos siempre pueden detectarse y corregirse rápidamente, mientras que los falsos positivos pueden ocultarse durante mucho tiempo.
  • A medida que disminuye la pureza, aumentan los errores y las pruebas unitarias no prueban la pureza del código

mejoramiento

  • Solo debemos optimizar donde hay resultados significativos
  • El propósito de la optimización es ahorrar tiempo, debemos optimizar nuestra optimización.
  • Una práctica muy común es comparar dos características de un idioma escribiéndolas por separado en un ciclo y luego midiendo el tiempo del ciclo. Hay un problema con esta forma:
    • Probar el rendimiento de las funciones o el grado de optimización del motor
    • ¿Los resultados son portátiles?
    • ¿Pueden otros motores tener el mismo resultado?
    • ¿Cambiará el resultado en el futuro?
  • En el mundo de la programación: piensa antes de actuar, revisa el pasado y aprende lo nuevo
  • Casi no hay problemas de rendimiento en el código actual, y optimizar el código en los cuellos de botella que no son de rendimiento es una pérdida de tiempo.
  • Culpables del bajo rendimiento:
    • no se puede paralelizar
    • violación de las reglas de la ronda
    • baja cohesión
    • alto acoplamiento
    • algoritmo incorrecto
    • paliza de caché
    • código hinchado
    • código de terceros
    • Los recursos de red se cargan secuencialmente, no se canalizan
    • API DOM extremadamente ineficiente

traducir

  • Una transpilación es un tipo especial de compilación que transforma un lenguaje de programación en otro.
  • Ventajas de los transpiladores (como babel)
    • experimento
    • específico
    • Compatible con versiones antiguas
    • de moda
    • precedencia
    • seguro (eliminar características no seguras)
    • Rendimiento (compatible con ASM, WASM, etc.)
  • Nunca use transpiladores en producción
  • Las características que debe reunir el próximo idioma:
    • Mejor soporte para Unicode
    • Use UTF-32 como la representación interna de caracteres
    • Soporte directo para objetos binarios grandes (Blobs)
    • Mejor soporte para la programación basada en eventos
    • Mejor soporte para redes seguras
    • Mejor soporte para la gestión de procesos, incluidos el inicio, la comunicación y la destrucción
    • Soporte para procesamiento paralelo de funciones puras

Principio del compilador

  • Segmentación de palabras (dividiendo varias fichas)
  • Analizar (convertir token a AST)
  • codigo de GENERACION
  • Runtime: el software utilizado para ejecutar el programa
    • Si un idioma de origen difiere semánticamente de su idioma de destino, se requiere algún soporte de tiempo de ejecución especial

Supongo que te gusta

Origin blog.csdn.net/sinat_36521655/article/details/126653478
Recomendado
Clasificación