JavaScript面试常见问题解析

需积分: 0 0 下载量 197 浏览量 更新于2024-08-03 收藏 5KB MD 举报
"JavaScript面试题.md" 这篇面试题集涵盖了JavaScript中的多个核心概念,包括变量定义、数据类型、运算符优先级以及作用域等。以下是对每个问题的详细解释: ### 1. 延迟加载js 在HTML中,`<script>`标签可以带有`defer`或`async`属性来实现JavaScript的延迟加载。 - `defer`属性用于告诉浏览器脚本应该在文档解析完成后,但在`DOMContentLoaded`事件触发之前执行。这意味着所有带有`defer`的脚本会按照它们在文档中的顺序执行。 - `async`属性则使得脚本可以异步加载,即不阻塞页面渲染,脚本一旦加载完成就会立即执行,执行顺序不能保证。 ### 2. 数据类型的判断 - `NaN`(Not-a-Number)不是一个特定的数值,但它的数据类型是`number`。 - `undefined`是JavaScript中的一个预定义值,表示变量未定义或函数返回无值,其类型为`undefined`。 - `null`虽然通常用来表示“无”或“空”,但它在JavaScript中被视为特殊的`object`类型。 ### 3. 运算符优先级和类型转换 - `true + 1`的结果是`2`,因为布尔值`true`在加法运算中被转换为`1`。 - `'name' + true`的结果是`"nametrue"`,因为在字符串与任何其他类型相加时,其他类型将被转换为字符串。 - `undefined + 1`的结果是`NaN`,因为`undefined`不能参与数值运算。 ### 4. 异步操作与闭包 这个例子展示了异步处理(setTimeout)和作用域的问题。由于`setTimeout`是异步的,它会在`for`循环结束后才执行,导致三个回调函数共享同一个`i`的值,因此都输出`3`。 ### 5. 变量提升(Hoisting) 在`test`函数内部,`bar`在函数体内的声明被提升了到函数顶部,因此在第一次`console.log(bar)`时,`bar`尚未被赋值,输出`undefined`。之后的`bar`被重新赋值为`2`,所以第二次`console.log(bar)`输出`2`。 ### 6. 函数声明与函数表达式 在这个例子中,尽管函数名为相同,但函数表达式(`var foo = function() {...}`)不会覆盖函数声明(`function foo() {...}`)。因此,调用`foo()`会执行函数声明中的代码,输出`1`。 ### 7. 作用域与闭包 在`c`函数中,`a`函数访问了外部作用域的`b`变量,并在其内部重新定义了一个同名变量。由于JavaScript的作用域链,`a`函数内的`console.log(b)`首先查找本地`b`,找不到则向上搜索,因此第一个`console.log(b)`输出外部的`1`,而第二个`console.log(b)`输出内部的`2`。最后,外部的`console.log(b)`仍然输出`1`,因为`a`函数内部的改变不会影响外部作用域的`b`。 这些面试题旨在考察开发者对JavaScript基本特性的理解,包括数据类型、作用域、变量提升、类型转换以及异步处理等方面的知识。熟悉并掌握这些概念对于JavaScript开发至关重要。