Premio JS a las preguntas de la entrevista que queman el cerebro
Respuesta
2. 1
Análisis
En primer lugar, los datos de tipo básico se pasan por valor, por lo que cuando la función b es ejecutado, b El valor recibido del parámetro a es 1. El parámetro a es equivalente a una variable dentro de la función. Cuando este alcance tiene una variable con el mismo nombre que el alcance superior, no se puede acceder a la variable de nivel superior, por lo que no importa cómo. a se modifica en la función, no afectará el nivel superior, por lo que el a impreso dentro de la función es 2 y el impreso afuera sigue siendo 1.
Respuesta
Error
Análisis
Establecer valores predeterminados para múltiples parámetros de una función es en realidad lo mismo que definir variables en orden, por lo que habrá un problema de zona muerta temporal, es decir, las variables definidas previamente no pueden hacer referencia a las variables indefinidas posteriores, pero las posteriores pueden acceder a las anteriores.
Respuesta
10, 20
Análisis
Respuesta
indefinida, {n:2} p>
p>
Análisis
Perdón por mi incompetencia, siempre me equivoqué en esta pregunta.
De todos modos, según la mayoría de las explicaciones en Internet, es porque el operador . tiene la mayor prioridad, por lo que a.x se ejecutará primero. En este momento, el {n: 1} señalado por a y. b*** se convierte en {n: 1, x: indefinido}, y luego ejecuta el código de derecha a izquierda de acuerdo con las operaciones consecutivas, a = {n: 2}, obviamente, ahora a apunta a un nuevo objeto, y luego a.x = a, porque a.x se ejecutó al principio, por lo que esto en realidad es equivalente a: ({n: 1, x: indefinido}).x = b.x = a = {n: 2}.
Respuesta
[]
Análisis
Esta pregunta es relativamente simple, arr[10]=10, entonces los índices son de 3 a 9 Todo lo anterior no está definido, y arr [3], etc., de hecho no están definidos cuando se imprimen. Sin embargo, esto en realidad implica el problema de que diferentes versiones de ECMAScript corresponden a diferentes comportamientos de métodos. Los métodos transversales antes de ES6 omitirán las posiciones no asignadas. de la matriz, es decir, el espacio está vacío, pero el nuevo método for of en ES6 no lo omitirá.
Respuesta
Adiós Jack
Análisis
Respuesta
NaN, 13, NaN, 1, 1[ objeto Objeto], 1, [objeto Objeto]
Análisis
Esta pregunta obviamente examina el comportamiento del número:
1. Si hay un operando es una cadena, luego convierta el otro operando en una cadena para realizar la conexión
2. Si uno de los operandos es un objeto, llame al método valueOf del objeto para convertirlo al valor original. no existe tal método o llamada. Si todavía es un valor no original, llame al método toString
3. En otros casos, los dos operandos se convertirán en números para realizar operaciones de suma
Respuesta
456
Análisis
Los objetos tienen dos métodos para establecer y hacer referencia a propiedades, obj.name y obj['name']. los números y las configuraciones de variables se pueden expresar entre corchetes, ecuaciones, etc., pero el cálculo 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. La conversión de objetos en cadenas es diferente de las matrices, y el contenido es irrelevante, el resultado es [objeto Objeto], entonces a[b]=a[c]=a['[objeto Objeto]'].
Respuesta
25, 20, 20, 25
Análisis
Esta pregunta examina la pregunta apuntada por esto:
1. El operador de coma devolverá el último valor de la expresión, aquí está la función correspondiente a internal.func. Tenga en cuenta que es la función en sí y luego ejecuta la función no se llama a través del método. del objeto, pero se llama en el entorno global, por lo que apunta a la ventana, y lo que se imprime, por supuesto, está debajo de la ventana
2. Obviamente, esto se llama como un método de objeto, por lo que esto apunta al objeto
3. Se agregan los paréntesis, lo que parece un poco confuso, pero de hecho (inner.func) e internal.func son completamente iguales, por lo que todavía se llaman como métodos del objeto
4. La expresión de asignación y las expresiones de coma son similares en que devuelven el valor en sí, por lo que también se comparan con la llamada de funciones en el entorno global
Respuestas
1, 2, 3
Análisis
Esta pregunta examina el problema de la desestructuración y asignación de variables. La desestructuración y asignación de matrices corresponden a posiciones, mientras que para los objetos, siempre que las variables. y los atributos tienen el mismo nombre, el orden es arbitrario.
Respuesta
[4, 5, 3]
Análisis
¿Nunca has usado el método de asignación para fusionar matrices? El método de asignación se puede utilizar para procesar matrices, pero tratará la matriz como un objeto. Por ejemplo, la matriz de destino se tratará como un objeto con los atributos 0, 1 y 2, por lo que los valores de la misma. Los atributos 0 y 1 de la matriz de origen cubren el valor del objeto de destino.
Respuesta
4
Análisis
Esta pregunta prueba las versiones de prefijo y sufijo del operador de incremento, así como el cambio Gramática , la versión de sufijo del operador de incremento automático ocurrirá después de que se evalúe la declaración, por lo que x aún coincidirá con la rama de caso con un valor de 1, luego obviamente coincidirá con la rama de 1. En este momento, x entra en vigor y x se convierte en 2. Ejecute x nuevamente y se convierte en 3. Debido a que no hay una declaración de interrupción, ingresará a la rama detrás del caso actual, por lo que x nuevamente y finalmente se convierte en 4.
Respuesta
verdadero, verdadero
Análisis
2.typeof devuelve 'función' cuando se usa la función, la clase es nueva en es6 El azúcar sintáctico es esencialmente una función, por lo que las dos son iguales
Respuesta
verdadero, falso
Análisis
1. Nada que decir Sí, typeof devuelve 'número' para tipos numéricos.
2. Esta pregunta prueba el problema de la prioridad del operador. ¡NO lógico tiene una prioridad más alta que la congruencia ===, así que primero ejecute !!typeof count, el resultado es verdadero y luego ejecute verdadero ==! = 'número', el resultado es, por supuesto, falso, puede hacer clic aquí para ver la lista de prioridades: 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 de búsqueda de variables. Cuando se ejecuta cada función, se creará un contexto de ejecución, que se asociará con un objeto variable, es decir. Su alcance almacena todas las variables a las que puede acceder la función. Además, el código en el contexto también creará una cadena de alcance cuando se ejecute. Si no se encuentra un identificador en el alcance actual, estará en la capa externa. La búsqueda continúa hasta el alcance global 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. está definido en el alcance global. Aunque se llama dentro de la función b, solo puede acceder al alcance global pero no al alcance de la función b.
Respuesta
indefinida
Análisis
Esta pregunta examina el problema de señalar esto Cuando se ejecuta la función de flecha, el contexto es. not Esto estará vinculado, por lo que el this interno depende del this externo. Cuando se ejecuta la función aquí, la capa externa es el alcance global, por lo que esto 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 Es una copia superficial, por lo que el atributo a del objeto de origen sobrescribirá directamente el atributo a del objeto de destino.
Respuesta
undefinido, 1, 2
Análisis
Respuesta
undefinido
Análisis
Respuesta
Imprime la propia matriz arr
Análisis
La función se llama como un método de un objeto, y Esto apunta al objeto, las matrices obviamente también son objetos, pero todos estamos acostumbrados al método de las propiedades de referencia del objeto: obj.fn, pero de hecho las referencias a obj ['fn'] también son posibles.
Respuesta
1. b función en sí, b función en sí
Análisis
2. Similar a la primera pregunta, excepto que b no realiza una 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. Ejecutar la función estática de Método Foo, imprimir 2.
2. Ejecute getName. El getName actual es la 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, esto apunta a la ventana porque getName tiene. ha sido modificado, así que imprima 1.
4. Debido a que getName no ha sido reasignado, 1 aún se imprimirá cuando se ejecute nuevamente.
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, que imprime 2.
6. Debido a que el operador de punto (.) tiene la misma prioridad que nuevo, se ejecuta de izquierda a derecha, lo que equivale a (new Foo()).getName() Utilice new para Foo. La llamada devolverá un objeto recién creado y luego ejecutará el método getName del objeto. El objeto en sí no tiene este método, por lo que buscará desde el objeto prototipo de Foo. Se encuentra, por lo que se imprime 3.
7. Como en la pregunta anterior, el operador de punto (.) tiene la misma prioridad que new. Además, new se usa para llamar funciones, por lo que new new Foo().getName() es equivalente. a new ((new Foo()).getName()), lo 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, el método lo hará. ejecutarse, así que imprima 3.
Respuesta
Soy Matthew, de Inglaterra
Soy Bob, de Inglaterra
Análisis
Object.create El método creará un objeto y señalará el atributo __proto__ del objeto al objeto entrante, por lo que los objetos prototipo de los dos objetos p1 y p2 apuntan al mismo objeto, luego agregarán un atributo de nombre a p1 y luego llamarán a p1 El setCountry método, p1 en sí no tiene este método, por lo que buscará a lo largo de la cadena del prototipo y encontrará este método en su prototipo, es decir, el objeto persona que ejecuta este método pasará la configuración del atributo de país del valor 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 luego se realizará la operación en p2. Entonces, debido a que el valor de referencia en el prototipo se compartirá entre 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á p1. Modificar, el valor final del país es Inglaterra.
Respuesta
2, 3, 5, 4, 1
Análisis
Esta pregunta obviamente pone a prueba el conocimiento del punto de bucle de eventos.
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. El subproceso único se refiere a la ejecución de JS. El hilo se llama hilo principal y hay otros, como hilos de solicitud de red y hilos de temporizador. El hilo principal generará una pila de ejecución cuando se ejecute. Si el código en la pila llama a la API asincrónica, el evento se agregará a la. Aquí, siempre que la tarea asincrónica tenga un resultado, la devolución de llamada correspondiente se colocará en la cola de tareas. Cuando se complete el código en la pila de ejecución, las tareas en la cola de tareas se leerán y se colocarán en la principal. hilo para ejecución. Cuando la pila de ejecución esté vacía, se verificará nuevamente, y así sucesivamente, que es el llamado bucle de eventos.
Las tareas asincrónicas se dividen en macrotareas (como setTimeout, setInterval) y microtareas (como promesa). Después de que la pila de ejecución esté vacía, la cola de microtareas estará respectivamente. marcado primero Si hay microtareas, todas las microtareas se ejecutarán a la vez y luego se verificarán en la cola de macrotareas. Si hay alguna, se eliminará una tarea y se ejecutará en el hilo principal. ser revisado nuevamente, y así sucesivamente.
Volviendo a esta pregunta, primero el código general comienza a ejecutarse como una tarea macro. Cuando se encuentra setTimeout, la devolución de llamada correspondiente ingresará a la cola de tareas macro y luego promete La devolución de llamada de la promesa es un código sincrónico. , por lo que se imprimirá 2, se llama 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 es. está vacío, así que primero verifique la cola de microtareas y descubra que hay una tarea, luego sáquela y colóquela en el hilo principal para su ejecución e imprima 4. Finalmente, verifique la cola de macrotareas y coloque la devolución de llamada del temporizador en la cola principal. hilo para su ejecución e imprima 1.
Respuesta
1, 7, 6, 8, 2, 4, 9, 11, 3, 10, 5, 12