Recompensas de las preguntas de la entrevista que queman el cerebro de JS
2, 1
Análisis
En primer lugar, los datos de tipo básico se pasan por valor, por lo que al ejecutar la función B, el valor recibido por el parámetro A de B Es 1, que es equivalente a la variable dentro de la función. Cuando hay una variable con el mismo nombre que el alcance de nivel superior en este alcance, la variable de nivel superior es inaccesible, por lo que no importa cómo se modifique A en la función, no afectará el nivel superior, por lo que A se imprime dentro de la función es 2. La A impresa externamente sigue siendo 1.
Respuesta
Informar de un error
Análisis
Establecer valores predeterminados para múltiples parámetros de una función es en realidad lo mismo que definir variables secuencialmente, por lo que habrá un problema de zona muerta temporal, es decir, las variables definidas previamente no pueden hacer referencia a las variables no definidas posteriores, pero estas últimas pueden acceder a las anteriores.
Respuesta
10, 20
Análisis
Respuesta
Indefinido, {n: 2} p>
Análisis
Perdón por mi incompetencia, pero he cometido errores una y otra vez en este tema.
De todos modos, según la mayoría de explicaciones en Internet, porque. Los operadores tienen la máxima prioridad, a.x se ejecutará primero. En este momento, {n: 1} señalado por A y b *** juntos se convierte en {n: 1, x: indefinido}, y luego el código se ejecutará de derecha a izquierda de acuerdo con la operación de concatenación, a.x = an : 2}. Debido a que a.x se ejecuta desde el principio, en realidad es equivalente a: ({n: 1, x: indefinido}). x = segundo.
Respuesta
[]
Análisis
Esta pregunta es relativamente simple, arr[10]=10, por lo que los índices 3 a 9 no están definidos, el arreglo impreso [3] de hecho no está definido. Sin embargo, esto en realidad implica el problema de diferentes métodos correspondientes en diferentes versiones de ECMAScript. El método transversal anterior a ES6 omitiría posiciones no asignadas en la matriz, es decir, espacios, pero se agregó ES6.
Respuesta
Adiós, Jack
Análisis
Respuesta
NaN, 13, NaN, 1, 1 [Objeto objeto], 1, [Objeto objeto]
Análisis
Este problema es obviamente el comportamiento del signo +:
Si un operando es una cadena de caracteres, convierta el otro operando en una cadena para realizar la concatenación.
2. Si un operando es un objeto, el método valueOf del objeto que llama se convierte en un valor primitivo, si no existe tal método o sigue siendo un valor no primitivo después de la llamada; Se llama al método toString.
3. En otros casos, ambos operandos se convertirán en números para sumar.
Respuesta
456
Análisis
Los objetos tienen dos métodos para establecer y hacer referencia a propiedades, obj.name y obj['name' ], cadenas, números, variables se pueden configurar en expresiones usando corchetes, etc. , pero el resultado final es una cadena. Para B y C anteriores, ambos son objetos, por lo que se llamará al método toString() para convertirlos en cadenas. Esto es diferente de las matrices y no tiene nada que ver con el contenido. El resultado es [objeto Objeto].
Respuesta
25, 20, 20, 25
Análisis
Esta pregunta examina las cuestiones señaladas en este punto: p>
p>
1. El operador de coma devolverá el último valor de la expresión. Aquí está la función correspondiente a internal.func. Preste atención a la función en sí y luego ejecute esta función. no se llama a través del método del objeto, sino que se llama en el entorno global, por lo que esto apunta a la ventana y, por supuesto, lo que se imprime está debajo de la ventana.
2. Esto obviamente es llamado por un método del objeto, por lo que apunta al objeto.
3. Agregar paréntesis puede parecer un poco confuso, pero de hecho (inner.func) e internal.func son completamente iguales, por lo que todavía se llaman como métodos de un objeto.
4. Las expresiones de asignación son similares a las expresiones de coma. Devuelven el valor en sí, por lo que también es relativo a la función de llamada en el entorno global.
Respuesta
1, 2, 3
Análisis
Esta pregunta examina la deconstrucción y asignación de variables. La desestructuración y asignación de matrices corresponden a posiciones, mientras que los objetos, variables y propiedades tienen el mismo nombre y están en cualquier orden.
Respuesta
[4, 5, 3]
Análisis
¿Nunca has fusionado matrices usando el método de asignación? El método de asignación se puede utilizar para trabajar con matrices, pero la matriz se tratará como un objeto. Por ejemplo, la matriz de destino se tratará como un objeto con las propiedades 0, 1 y 2, por lo que los valores de las propiedades 0 y 1 de la matriz de origen sobrescribirán los valores del objeto de destino.
Respuesta
Cuatro
Análisis
Esta pregunta examina las versiones de prefijo y sufijo del operador de incremento, así como la sintaxis de cambiar . La versión postfix del operador de incremento solo aparecerá después de que se haya evaluado la declaración, por lo que X seguirá coincidiendo con la rama de caso con valor 1, por lo que obviamente coincidirá con la rama 1. En este momento x ++ entra en vigor, X se convierte en 2, y luego se ejecuta ++ x y se convierte en 3. Debido a que no hay una declaración de interrupción,
Respuesta
Verdadero, verdadero
Análisis
2. función, Class es solo un nuevo azúcar sintáctico agregado por es6. Es esencialmente una función, por lo que las dos son iguales.
Respuesta
Verdadero, Falso
Análisis
1. Para tipos numéricos, typeof devuelve "$número".
2. Esta pregunta examina la prioridad de los operadores, ¡lo cual es lógico! tiene una prioridad más alta que congruencia ==, por lo que se ejecuta primero. ! Tipo de recuento, el resultado es verdadero, luego ejecuta verdadero === 'número', el resultado es, por supuesto, falso. Puede ver la lista de prioridades haciendo clic aquí: Haga clic en mí [1].
Respuesta
2, 2
Análisis
Respuesta
1
Análisis
Esta pregunta examina la cuestión del alcance. El alcance es en realidad un conjunto de reglas para encontrar variables. Cada función crea un contexto de ejecución cuando se ejecuta. Este contexto de ejecución está asociado con un objeto variable, que es su alcance. Este alcance almacena todas las variables a las que la función puede acceder. Además, cuando se ejecuta código dentro del contexto, se crea una cadena de ámbitos. Si el identificador no se encuentra en el ámbito actual, continúa buscando en el ámbito exterior. Subiendo al alcance global de nivel superior, debido a que js es un alcance léxico, el alcance se determina durante la etapa de escritura del código. En otras palabras, se determina cuando se define la función, no cuando se ejecuta, por lo que la función A está definida. en el ámbito global. Aunque se llama en la función B, solo puede acceder al alcance global y no al alcance de la función B.
Respuesta
No está clara
Análisis p>
Esta pregunta examina la cuestión del puntero. Al ejecutar la función de flecha, el contexto no vinculará esto, por lo que esto depende de la capa externa de este. Cuando se ejecuta la función, el alcance externo es el alcance global, por lo que apunta a la ventana. No hay ningún atributo de nombre debajo del objeto de ventana, por lo que no está definido.
Respuesta
{a: {b: 1}}
Análisis
Esta pregunta es muy simple, porque el método de asignación se ejecuta Copia superficial, por lo que la propiedad A del objeto de origen sobrescribirá directamente la propiedad A del objeto de destino.
Respuesta
Indefinido, 1, 2
Análisis
Respuesta
No está claro
Análisis
Respuesta
Imprimir la propia matriz arr
Análisis
La función se llama como un método de un objeto This. apunta al objeto. La matriz es obviamente un objeto, pero todos estamos acostumbrados al método de las propiedades de referencia del objeto: obj.fn, pero de hecho, la referencia a obj ['fn'] también es posible.
Respuesta
1. Función b en sí, función b en sí
Análisis
2. no hay operación de asignación, entonces ejecutar estas dos líneas equivale a ninguna operación. Por supuesto, B es una función.
Respuesta
2, 4, 1, 1, 2, 3, 3
Análisis
1. Método Foo, imprimir 2.
2. Ejecute getNombre. El getName actual es una función que imprime 4.
3. Ejecute la función Foo, modifique la variable global getName, asígnela a una función que imprima 1 y luego devuelva esto. Debido a que se ejecuta en el entorno global, apunta a la ventana y, debido a que getName ha sido modificado, imprime 1.
4. Debido a que getName no ha sido reasignado, todavía se imprime 1 después de la reejecución.
5. El operador new se usa para llamar funciones, por lo que new Foo.getName() es equivalente a new (Foo.getName()), por lo que new es el método estático getName de Foo e imprime 2.
6. Debido a que el operador de punto (.) tiene la misma prioridad que nuevo, se ejecuta de izquierda a derecha, equivalente a (nuevo Foo()). obtenerNombre(). Llamar a new en Foo devolverá un objeto recién creado y luego ejecutará el método getName de ese objeto. El objeto en sí no tiene este método, por lo que se buscará y encontrará en el objeto prototipo de Foo, por lo que se imprimirá 3.
7. Al igual que la pregunta anterior, el operador de punto (.) tiene la misma prioridad que new se usa para llamar funciones, por lo que new new Foo(). getName() es equivalente a new ((new Foo()).getName()), y el que está entre paréntesis es la pregunta anterior, por lo que finalmente se encuentra el método en el prototipo de Foo, ya sea que se llame directamente o mediante new.
Respuesta
Este es Matthew, del Reino Unido
Soy Bob, del Reino Unido
Análisis
El método Object.create creará un objeto y apuntará su atributo __proto__ al objeto entrante, de modo que los objetos prototipo de p1 y p2 apunten al mismo objeto, luego agregarán un atributo de nombre a p1 y luego llamarán al método setCountry de p1. , que no existe tal método per se. Entonces buscará a lo largo de la cadena de prototipos y encontrará este método en su prototipo, que es el objeto persona. La ejecución de este método establecerá el valor pasado en la propiedad de país del objeto de dirección. p1 en sí no tiene un atributo de dirección, pero a diferencia del atributo de nombre, el atributo de dirección se encuentra en el objeto prototipo y, debido a que es un valor de referencia, su atributo de país se modificará con éxito y la operación en p2 será la misma. . Luego, debido a que el valor de referencia en el prototipo será compartido por todas las instancias, las direcciones a las que hacen referencia p1 y p2 también son el mismo objeto. Si se modifica una instancia, se reflejará en todas las instancias, por lo que la modificación de p2 sobrescribirá la modificación de p1 y el valor final del país será Inglaterra.
Respuesta
2, 3, 5, 4, 1
Análisis
Esta pregunta es obviamente un punto de conocimiento para examinar el evento. ciclo .
JS es un lenguaje de subproceso único, pero para realizar algunas tareas asincrónicas sin bloquear el código y evitar desperdiciar recursos durante la espera, js tiene un mecanismo de bucle de eventos. Un solo subproceso se refiere al subproceso que ejecuta js, llamado subproceso principal, así como a otros subprocesos, como los subprocesos de solicitud de red y los temporizadores. Cuando se ejecuta el hilo principal, genera una pila de ejecución y, si el código de la pila llama a la API asincrónica, agrega eventos a la cola de eventos. Siempre que la tarea asincrónica tenga resultados, la devolución de llamada correspondiente se colocará en la cola de tareas. Cuando se ejecuta el código en la pila de ejecución, leerá las tareas en la cola de tareas y las colocará en el hilo principal para su ejecución. Cuando la pila de ejecución esté vacía, se volverá a verificar, y así sucesivamente, lo que se denomina bucle de eventos.
Las tareas asincrónicas se dividen en macrotareas (como setTimeout, setInterval) y microtareas (como promesa), y entrarán en diferentes colas respectivamente. Cuando la pila de ejecución está vacía, primero se verifica la cola de microtareas. Si hay microtareas, todas las microtareas se ejecutarán a la vez y luego se verificarán en la cola de macrotareas.
Si es así, seleccione una tarea para que la ejecute el hilo principal y luego verifique la cola de microtareas después de la ejecución, y así sucesivamente.
Volviendo a esta pregunta, en primer lugar, todo el código comienza a ejecutarse como una tarea macro. Cuando encuentra setTimeout, la devolución de llamada correspondiente ingresará a la cola de tareas macro y luego a la promesa. La devolución de llamada prometida es un código sincrónico, por lo que imprimirá 2 y se llamará a resolve después de que finalice el ciclo for, por lo que la devolución de llamada de then se colocará en la cola de microtask, luego imprimirá 3 y finalmente imprimirá 5. . En este punto, la pila de ejecución actual estará vacía. Luego, primero verifique la cola de microtareas para encontrar una tarea, luego sáquela y colóquela en el hilo principal para su ejecución e imprima 4. Finalmente, verifique la cola de tareas macro, coloque la devolución de llamada del temporizador en el hilo principal e imprima 1.
Respuesta
1, 7, 6, 8, 2, 4, 9, 11, 3, 10, 5, 12