esencia Javascript de notas de estudio de idioma

Vuelva a leer las notas de estudio anteriores quedan atrás, encontraron que un Curried sólo recuerda el concepto.

Y el contenido del libro es muy viejo, la deformación de lectura, por lo que una gran cantidad de Riga a continuación Ps.

------ actualizado en Marzo de 2020

El primer capítulo esencia

Javascript está construido sobre algunas ideas muy buenas y algunas muy mala idea,

Objeto literal excelentes ideas incluyen funciones, tipos débiles, objetos dinámicos y la representación expresiva.

Esas malas ideas incluyen un modelo de programación basado en variables globales.

El segundo capítulo gramática

digital:

javascript solamente un tipo numérico, se representa internamente como número de coma flotante de 64 bits. Infinito representa todos los valores mayores que el 1.79769313486231570e + 308.

NaN representa un valor de no producir un resultado normal, NaN no es igual a cualquier valor, incluyendo en sí. La función se puede utilizar isNaN ES5 (número) detecta NaN.

Ps. Para ES 10, JS ha sido el segundo número que representa el tipo, Bigint

declaración:

El valor se determina como falsa por lo siguiente: falso, nulo, indefinido, cadena vacía '', el número 0, el número de NaN.

Ps. Criterios de diseño ES describirán las funciones se refieren directamente ToBoolean

El tercer capítulo de objetos

JavaScript tipos de datos simples incluyen numérico, cadena, booleano, valor nulo y el valor indefinido. Todos los demás valores son objetos.

Los números, cadenas de Boole "se parece a" objetos porque no tienen los medios, sino que son inmutables.

En Javascript matrices son objetos, las funciones son objetos, la expresión regular es un objeto, por supuesto, los objetos naturales son objetos.

Ps. ES6 tipo de símbolo Agregado, ES10 añadir nuevo tipo Bigint, tipos de datos simples de modo Hay siete tipos

Los parámetros pasados ​​- y pasan por valor de transmisión de referencia

Objeto pasado por referencia, que nunca se repetirá. De tipo Base pasa por valor

function add(num){  
   num+=10;  
   return num;  
}  
num=10;  
alert(add(num));  
aelrt(num);  
//输出20,10 

La salida 20, 10 aquí, la explicación oficial es que cuando los tipos básicos de JS paso de parámetros, una copia hecha operación num copia marco de pila, de manera que las declaraciones de variables externas y parámetros de función num, tienen exactamente el mismo valor , pero con un completamente diferentes direcciones de los parámetros, tanto de los cuales no saben que, cuando la llamada de función devuelve un parámetro de la función marco de pila num emergente.

Así que cambiar el num parámetros de función, sin impacto en las variables externas existentes.

function setName(obj){  
    obj.name="ted";  
    obj=new Object();  
    obj.name="marry";  
}  
var obj=new Object();  
setName(obj);  
alert(obj.name);  
//输出ted 

dirección entrante función setName obj, por lo que la segunda línea de enfoque, la línea 6 de obj afectada. Pero la primera línea de la dirección obj 3 prácticas dentro de la función se cambia al nuevo espacio de pila, consulte este artículo

Ps. Pasan por valor y referencia pase algo común Bale

Enumerar

usos de objeto para en el bucle de enumeración, si es necesario para filtrar valores no deseados. Los filtros más comunes son el método hasOwnProperty o excluir la función de typeof.

var stooge = {
    'first-name': 'Jerome',
    'last-name': 'Howard'
}
for (var name in stooge) {
    if (typeof stooge[name] !== 'function') {
        console.log(name + ': ' + stooge[name]);
    }
}

Matriz mediante un bucle, que se puede recorrer en el orden correcto, y no se preocupe por los atributos enumerados cadena de prototipo.

Enumeración de Ps. Yo personalmente prefiero Object.keys (obj) .forEach (índice => {}) del método objeto de tareas

Eliminar

operador de eliminación se puede utilizar para eliminar las propiedades del objeto. Si el objeto contiene la propiedad, entonces la propiedad será eliminado. Él no va a tocar cualquier cadena objeto prototipo.

Propiedades eliminan objetos pueden hacer de cadena de prototipo a través destaque

stooge.__proto__.nickname = 'Curly';
stooge.nickname = 'Moe';

stooge.nickname //'Moe'
delete stooge.nickname;
stooge.nickname //'Curly'

Ps. Eliminar precaución, usarlo sólo para propiedades de borrado sobre los objetos, no elimine otras cosas. Y el modo estricto y no estricto será diferente. Ver operador MND-delete

Funciones Capítulo IV

llamada

En la llamada Javascript Hay 4 modos: el modo de llamada de método, el modo de llamada de función, se configura el modo de llamada, utilice el modo de llamada. Estas llamadas son diferentes modelos sobre cómo inicializar los parámetros clave de este.

el modo de llamada de método: Se puede usar esto para tener acceso al objeto al que pertenecen.
var myObject = {
    value: 0,
    increment: function(inc){
        this.value += typeof inc === 'number' ? inc : 1;
    }
};
myObject.increment();
console.log(myObject.value); // 1
 
myObject.increment(2);
console.log(myObject.value); // 3
el modo de llamada de función: este modo esto se enlaza con el objeto global.
var someFn = function () {
    return this === window; //true
}
Constructor modo de llama

Delante traer una nueva función a la llamada, a continuación, en secreto crea una conexión con el nuevo miembro objeto prototipo de la función. Al mismo tiempo, este será enlazado al nuevo objeto.

var Quo = function (string) {
    this.status = string;
}
Quo.prototype.get_status = function(){
    return this.status;
}
var myQuo = new Quo('confused');
console.log(myQuo.get_status()); //'confused'
aplicar el modo de llamada: Vamos a construir una serie de parámetros pasados ​​a la función de llamada que nos permite seleccionar el valor de este.
var statusObject = {
    status: 'A-OK'
};
var status = Quo.prototype.get_status.apply(statusObject);

(Llamada, se aplican, se unen distinción ver aquí) [ http://blog.itpub.net/29592957/viewspace-1159067/ ]

var xw = {
    name : "小王",
    gender : "男",
    age : 24,
    say : function(school,grade) {
            alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);                                
    }
}
var xh = {
    name : "小红",
    gender : "女",
    age : 18
}
 
//对于call来说是这样的
xw.say.call(xh,"实验小学","六年级");       
//而对于apply来说是这样的
xw.say.apply(xh,["实验小学","六年级郑州牛皮癣医院"]);
//看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
//那么bind怎么传参呢?它可以像call那样传参。
xw.say.bind(xh,"实验小学","六年级")();
//但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。
xw.say.bind(xh)("实验小学","六年级");

Ps. 2020 años, reaccionamos tanto que escribir, se unen función como todo el mundo sabe que tiene miedo de ella

parámetros

Cuando se invoca la función, obtendrá una distribución libre de parámetro es un array de parámetros. De error en un lenguaje de diseño, los argumentos no es una verdadera matriz, que es sólo un objeto "tipo array" de. A pesar de que tiene una propiedad de longitud, pero no hay manera alguna de la matriz. Para utilizar una serie de métodos necesitan utilizar las funciones de llamada.

var sum = function () {
    var i, sum = 0;
    for (i = 0; i < arguments.length; i += 1) {
        sum += arguments[i];
    }
    return sum;
};
sum(4, 8, 15, 16, 23, 42); //108

regreso

Una función siempre devuelve un valor. Si no se especifica un valor de retorno, se devuelve undefined.
Si la llamada a la función precedida del prefijo nuevo, y el valor de retorno no es un objeto, el presente (el nuevo objeto) se devuelve

anormal

Si los medios de tratamiento depende del tipo de excepción, el controlador de excepciones debe comprobar el nombre de atributo del objeto de excepción para determinar el tipo de anormalidad.

var add = function(a, b) {
    if (typeof a !== 'number' || typeof b !== 'number') {
        throw {
            name: 'TypeError',
            message: 'add needs numbers'
        };
        return a + b;
    }
}
 
//构造一个try_it函数,以不正确的方式调用之前的add函数
var try_it = function(){
    try{
        add('seven');
    } catch(e) {
        console.log(e.name + ': ' + e.message);
    }
}
 
try_it();

alcance

código javascript no es compatible con el alcance a nivel de bloque, sólo el ámbito de la función. Muchos lenguajes modernos son variables recomendadas demora a declarar como sea posible. Y utilizado en Javascript a continuación se convertirá en un mal consejo,

Debido a que carece de alcance a nivel de bloque. La mejor práctica es declarar todas las variables en la parte superior de la función del cuerpo de la función que podría ser utilizado.

Sal. El cáncer, pero ES6 ha lanzado dejar que se declara una variable, por lo que el libro decía que esta situación no es un problema.

cierres

El cierre es la función de las funciones internas, la referencia se puede definir en una actuación variable sobre el exterior del mismo. Los cierres que la creación de sus funciones tienen un ciclo de vida más largo, y el cierre sea una referencia a sus variables externas de memoria interna.

function box(){
    var val = undefined;
    return {
        set: function(newVal) { val = newVal; },
        get: function() { return val; },
        type: function() { return typeof val; }
    };
}
var b = box();
b.type(); //"undefined"
b.set(98.6);
b.get(); //98.6
b.type(); //"number"

Entender la diferencia entre la asignación y vinculante.

Cierre por referencia en lugar del valor capturado de sus variables externas.

Uso expresión de función (IIFE) llame inmediatamente a crear un ámbito local.

Busque un programa ERROR:

function wrapElements(a) {
    var result = [];
    for(var i = 0, n = a.length; i < n; i++) {
        result[i] = function() { return a[i]; };
    }
    return result;
}
var wrapped = wrapElements([10, 20, 30, 40, 50]);
var f = wrapped[0];
f(); //undefined

Este código es engañoso, este programador puede desear programar 10 de salida, pero no está definido el valor de salida.

Esto se debe a que function() { return a[i]; };de esta bolsa de almacenamiento cerrado i i es la dirección de las variables externas, cada vez durante el ciclo continúa, un nuevo cierre, i valores se actualizan. Así que siempre me dan el valor del valor de i después del final del bucle.

palabra correcta debe seguir para crear una función llamada de inmediato

function wrapElements(a) {
    var result = [];
    for(var i = 0, n = a.length; i < n; i++){
        (function(j){
            result[i] = function() {return a[j];};
 
        })(i);
    }
    return result;
}

Sal. La rutina de siempre, sino más bien abruptamente cuando haces ciclo de escritura funcionamiento asíncrono o perineo para usted.

módulo

Con el módulo de función y la configuración de cierre, que puede proporcionar un módulo de interfaz es una función o un objeto es estado oculto. Por módulos, podemos abandonar casi por completo el uso de variables globales.

cascada

Si permitimos que devuelve este método en lugar de indefinido, puede activar la cascada (programación de la cadena)

getElement('myBoxDiv')
    .move(350, 150)
    .width(100)
    .height(100)
    .color('red');

currificación función

Es también un valor de la función, podemos operar de manera fuimos valores de la función, currificación nos permite funcionar en conjunto con los parámetros que recibe, para producir una nueva función.

Compatible con los navegadores modernos y método de evento navegador IE add:

var addEvent = (function(){
    if (window.addEventListener) {
        return function(el, sType, fn, capture) {
            el.addEventListener(sType, function(e) {
                fn.call(el, e);
            }, (capture));
        };
    } else if (window.attachEvent) {
        return function(el, sType, fn, capture) {
            el.attachEvent("on" + sType, function(e) {
                fn.call(el, e);
            });
        };
    }
})();

Para ello sólo tiene que determinar de una vez y no tienen que juzgar cada llamada Código addEvent de IE6 7 8. Esto es típico de currificación

Realización de un valor inicial realmente alcanzado addEvent Parte de Aplicación (sólo una vez si ... else if ... determinación), mientras que el resto de parámetros se aplican para lograr la función devuelve, típicamente currying.

Ps. Leer tantas veces al curry, aunque eso es tal cosa, pero siempre rápidamente olvidado su nombre.

Capítulo V herencia

Las pseudo-clases

//定义一个构造器,并扩充它的原型
var Mammal = function (name) {
    this.name = name;
};
Mammal.prototype.get_name = function(){
    return this.name;
};
Mammal.prototype.says = function () {
    return this.saying || '';
};
 
//构造伪类去继承Mammal,替换它的prototype为一个Mammal的实例来实现
var Cat = function(name) {
    this.name = name;
    this.saying = 'meow';
};
Cat.prototype = new Mammal();
//扩充新原型对象
Cat.prototype.get_name = function () {
    return this.says() + ' ' + this.name + ' ' + this.says();
};
//创建实例
var myCat = new Cat('Henrietta');
myCat.says(); //'meow'
myCat.purr(5); //'r-r-r-r-r'
myCat.get_name(); //'meow Henrietta meow'

Muchas deficiencias pseudo-clases, como ningún entorno privado, todas las propiedades son públicas, no puede acceder a la clase padre. Para empeorar las cosas, crear una instancia cuando se olvide de añadir nuevo prefijo, el interior de este constructor se enlaza con el objeto ventana, lo que socava las variables de entorno globales.

Ps. ES6 escribir directamente a lo provincial Clase ahora, pero siempre hay temen que el entrevistador le preguntará cómo hacerlo, y que era una referencia directa a mi otro ES5 heredan la solución óptima

función de

Un patrón de herencia debilidad no es la privacidad, propiedad del objeto son visibles, se puede utilizar el modo de módulos de software que soluciona.

var mammal = function (spec) {
    var that = {};
 
    that.get_name = function() {
        return spec.name;
    };
    that.says = function() {
        return spec.saying || '';
    };
 
    return that;
};
var myMammal = mammal({name: Herb});
 
var cat = function(spec){
    spec.saying = spec.saying || 'meow';
    var that = mammal(spec);
    that.get_name = function(){
        return that.says() + '' + spec.name + ' ' + that.says();
    };
    return that;
};
 
var myCat = cat({name: 'Henrietta'});
 
//定义一个处理父类的方法的方法
Function.prototype.method=function(name, func){  
    this.prototype[name]=func;  
    return this;  
} 
Object.method('superior', function(name){
    var that = this,
        method = that[name];
    return function(){
        return method.apply(that, arguments);
    };
});
 
var coolcat = function(spec){
    var that = cat(spec),
        super_get_name = that.superior('get_name');
    that.get_name = function(n){
     
        //调用父类方法
        return 'like ' + super_get_name() + ' baby';
    };
    return that;
};
var myCoolcat = coolcat({name: 'Bix'});
var name = myCoolCat.get_name(); // 'like meow Bix meow baby'

modo de comparación pseudo-clase, utilizando el modelo de función puede ser mejor encapsulación y ocultación de información, y la capacidad de acceder a la clase padre

Matriz Capítulo VI

lugar confuso

js diferencia para las matrices y los objetos están confundiendo. Tipo typeof Operador de informes de la matriz es 'objeto' no tiene ningún sentido.

Podemos compensar esta deficiencia función personalizada is_array

var is_array = function(value) {
    return value && 
        typeof value === 'object' && 
        value.constructor === Array;
};

Por desgracia, el número de los cuales está configurado en una matriz identificados a partir de diferentes ventanas (ventana) o el marco (frame) falla cuando en el interior. Hay una mejor manera de juzgar

var is_array = function (value) {
    return Object.prototype.toString.call(value) === '[object Array]';
}

Ps. Consulte también para identificar el tipo de directa mí otra

Capítulo VII expresiones regulares

factor de regularización

Además, excepto los siguientes caracteres de control y caracteres especiales, todos los caracteres se procesan literalmente

\ / [ ] ( ) { } ? + | . ^ $ -

Si es necesario se enumeran más arriba para que coincida con el carácter literal, es necesario utilizar un \prefijo para escapar

Como no se escapó. Coincidirá con cualquier carácter excepto \ n, que no sean

carácter de escape de expresiones regulares

  • \ F es carácter de avance, \ n nueva línea, \ r es un retorno de carro, \ t ficha
  • \ D es equivalente a [0-9], que coincide con un número. \ D Por el contrario, el número no coincidente, [^ 0-9]
  • \ S Coincide con cualquier carácter de espacio en blanco, incluidos los espacios, tabulaciones, saltos de página, y así sucesivamente. Es equivalente a [\ f \ n \ r \ t \ v]. \ S contraria
  • \ W coincide con cualquier carácter de palabra, incluido el subrayado. Es equivalente a la "[A-Za-z0-9_]". \ Contraste W
  • \ B coincide con un límite de la palabra, es decir, se refiere a la ubicación y los espacios entre las palabras. Por ejemplo, "ER \ b" coincidencias "nunca" en el "ER", pero no coincide con el "verbo" en "ER".

Ps. Regular consulte Edición

Capítulo VIII Métodos

Sal. Es demasiado oneroso, y ahora ver directamente MDN escapar

Apéndice A, el cáncer de JS

  • Las variables globales: código de programación JS se basa en una variable global, la variable global es el diablo. programa a gran escala será muy difícil mantener las variables globales y variables globales implícitos se convertirá en error muy difícil de encontrar.
  • Alcance: el alcance de código JS no a nivel de bloque, sólo el ámbito de la función.
  • nula no es un objeto. Explicación: Al typeof objeto de salida nula voluntad, pero esto es sólo la existencia de una larga Bug JS. JS utiliza en la versión original del sistema es de 32 bits, para considerar el tipo de información para utilizar variable de almacenamiento de bajo rendimiento, sin embargo, el objeto 000 es representativo del inicio de un todo-cero o nulo, el error se determina a objeto.
  • insertado de forma automática y coma: inserción automática de punto y coma puede enmascarar un error más grave. El siguiente error de programa se inserta automáticamente en un punto y coma devuelve undefined, sin previo aviso, la solución pasa por los apoyos de escritura después de la instrucción de retorno
//错误实例
return
{
    status: true;
};
//正确做法
return {
    status: true;
};
  • palabra reservada: esta palabra es retenido en una similar js byte de clase, el nombre no puede ser utilizado para las variables o parámetros, y la mayoría de estas palabras y el lenguaje ya no está en uso.
  • Codificación de problemas: js inicio del diseño, se espera que 65.536 caracteres Unicode, js carácter es de 16 bits, lo suficiente para cubrir el original 65536, ahora se aumentará lentamente a caracteres Unicode 100W.
    El resto de un millón de caracteres cada uno de los cuales pueden ser representados por un par de caracteres. Un par de caracteres Unicode como un solo carácter, y JS piensan que un par de caracteres son dos personajes diferentes.
  • typeof: typeof operador no identifica nula y objetos. typeof expresión regular en la identificación del tipo, cada navegador implementaciones menos consistente, es decir el retorno / FF / Opera 'objeto', 'función' Safari 3.x versiones de respaldo, la versión 5.x de 'Objeto'
    typeof operador de una arrays y objetos indistinguibles.
  • +: Cadena de conexión, puede realizar Además, este comportamiento complejo es una fuente común del insecto. Si va a hacer una operación de suma, asegúrese de que ambos operadores son números enteros.
  • Float: js 0.1 + 0.2 no es igual a 0,3, pero la de punto flotante aritmética de enteros es precisa, lo que es mejor capaz de cifras decimales en la aritmética de enteros es, y luego se convierte a decimal.
  • Pseudo-matriz: js ninguna REAL matriz, matriz de JS realmente útil, no tiene que configurar dimensión transfronteriza y nunca producirá un error, pero el rendimiento y la verdadera matriz de mamá. operador typeof no se comprueba también matrices y objetos, respectivamente. Necesitamos la ayuda de otras funciones
  • valor falso: 0, NaN '' (la cadena vacía), falso, nulo, sin definir. Es valor lógico falso de js determinados. Si está utilizando == juicio, es fácil obtener resultados inesperados

Apéndice B, JS escorias

  • Y === ==: == operador fuerzas de operando tipo de datos de conversión, la regla de conversión compleja extraña, que se utilizarán para determinar símbolo recomendaciones ===.
  • con la afirmación: los resultados serán impredecibles, sino que también afectan seriamente js velocidad de procesamiento evitado.
  • eval: código del formulario eval más difícil de leer, por lo que el rendimiento disminuyó significativamente, ya que tiene que ejecutar el compilador, herramientas de prueba para probar la capacidad de hacer JSLint como reducido en gran medida, también debilitar la seguridad del programa.

constructor de la función es también otra forma de eval, debe ser evitado. Del mismo modo la función serTimeout setInterval y puede aceptar un parámetro de cadena y el argumento de la función, cuando la cadena de parámetros, como eval voluntad
como a proceso, que evite el uso de un argumento de cadena.

  • Continuar: continuar declaración salta a la parte superior del ciclo. Sin embargo, la disminución en el rendimiento, ser evitado.
  • cambiar a través de: caso las condiciones a través de otras condiciones del caso, es decir, a través del conmutador. Esta es una fuente común de error, y es difícil encontrar errores por mirar el código. Evitar el uso de cruz.
  • Operadores de bits: js y no hay tipo entero, el uso bit a bit primero convertidos a un número entero, y luego para realizar la operación, por lo que la velocidad de ejecución es muy lenta. js realiza menos operador de bits, utilizando el operador de bits hace más fácil fallo oculto.
  • Se recomienda utilizar la función de la expresión, ya que dejó claro que foo es una variable que contiene el valor de la función: función de contraste sentencia de función expresión. Buena comprensión del idioma, entender la función de valor es muy importante.
var foo = function () {};

función para mejorar la declaración del alcance se produce cuando el análisis, por lo que no van allí si la sentencia function

  • Wrapper tipo de objeto: por ejemplo, new Boolean (false); devuelve un objeto, tipo de objeto, hará que algunos problemas cuando typeof juicio del operador. Por lo tanto evitar el uso de nueva booleano, número nuevo, nueva cadena.
  • evitando también el uso de objeto nuevo, new Array escrita, el uso y en su lugar {} [].

  • nuevo operador: Si se ha perdido el nuevo operador, se llama al constructor cuando esta ligada al objeto global, con consecuencias muy graves.
  • vacío: muchos idiomas, el vacío es un tipo que representa ningún valor. En li js, nula es un operador que toma un número de retornos operacionales e indefinido. Esto no es lo que debe ser evitado. La frente, dijo que, pero todavía le gustaría usar el vacío 0 para obtener el valor indefinido.

Apéndice E, JSON

objeto JSON en otra conversión de formato de cadena, el código debajo de la

var str = JSON.stringify({what:'sss'})   //"{"what":"sss"}"
JSON.parse(str)  // Object {what: "sss"}

Un analizador JSON, ver otro artículo analizador JSON

Supongo que te gusta

Origin www.cnblogs.com/everlose/p/12501471.html
Recomendado
Clasificación