JavaScript
进阶面试题

⚠️ Generate by copilot, need to review and modify

JS 数据类型转换规则
严格模式严格在哪里?
  1. 变量必须声明后再使用
  2. 函数的参数不能有同名属性, 否则报错
  3. 不能使用 with 语句
  4. 不能对只读属性赋值, 否则报错
  5. 不能使用前缀 0 表示八进制数, 否则报错
  6. 不能删除不可删除的属性, 否则报错
  7. 不能删除变量 delete prop, 会报错, 只能删除属性 delete global[prop]
  8. eval 不会在它的外层作用域引入变量
  9. eval 和 arguments 不能被重新赋值
  10. arguments 不会自动反映函数参数的变化
  11. 不能使用 arguments.callee
  12. 不能使用 arguments.caller
  13. 禁止 this 指向全局对象
  14. 不能使用 fn.caller 和 fn.arguments 获取函数调用的堆栈
  15. 增加了保留字(比如 protected, static, interface)
什么是闭包?作用

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式, 就是在一个函数内部创建另一个函数。

作用:

  • 读取函数内部的变量, 让这些变量的值始终保持在内存中
  • 保存私有变量
iframe 的优缺点?

优点:

  • 可以实现跨域
  • 可以实现异步加载
  • 可以实现独立的作用域

缺点:

  • 会增加页面的加载时间
  • 会增加页面的内存占用
  • 会增加页面的复杂度
JS 同名变量的优先级(函数名, 函数参数名, 内部变量)
  • 函数形参可以看做是函数的局部变量, 如果形参赋值, 则()是一个单独的作用域, 外层作用域是函数的作用域
  • 函数名会覆盖形参名, 变量名不会
什么是事件循环?
  • 执⾏同步代码, 这属于宏任务
  • 执⾏栈为空, 查询是否有微任务需要执⾏
  • 执⾏所有微任务
  • 必要的话渲染 UI
  • 然后开始下⼀轮 Event loop, 执⾏宏任务中的异步代码
用正则表达式写一个简单的邮箱验证

/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;

js 的垃圾回收机制是怎么实现

引用计数法和标记清除法。 引用计数法即在变量引用的时候将变量的引用计数+1, 当变量的引用失效时(如离开作用域或者手动删除)将计数-1, 直到计数为 0 时将该变量销毁。但是这种方法在出现循环引用时会有问题, 所以后来 js 更新了自己的垃圾回收机制, 采用了标记清除法。 标记清除法是在变量进入到某个作用域时对变量计数+1, 从某个作用域离开时则对变量计数-1, 最终计数为 0 时则销毁变量。

有哪些技术手段可以用来监控内存泄露
  • 使用 Chrome 的开发者工具的 Memory 面板
  • 使用 Chrome 的开发者工具的 Performance 面板
  • 使用 Node.js 的内存监控工具
CommonJS 和 ES6 模块的区别?

CommonJS 模块是运行时加载, ES6 Modules 是编译时输出接口 CommonJS 输出是值的拷贝;ES6 Modules 输出的是值的引用, 被输出模块的内部的改变会影响引用的改变 CommonJs 导入的模块路径可以是一个表达式, 因为它使用的是 require()方法;而 ES6 Modules 只能是字符串 CommonJS this 指向当前模块, ES6 Modules this 指向 undefined 且 ES6 Modules 中没有这些顶层变量:arguments、require、module、exports、**filename、**dirname

在移动端中怎样初始化根元素的字体大小?
requestAnimationFrame 和 setTimeout 区别?

requestAnimationFrame 是浏览器用于定时循环操作的一个接口, 类似于 setTimeout, 主要用途是按帧对网页进行重绘。对于 JS 动画, 用 requestAnimationFrame 会比 setInterval 效果更好。

可迭代对象有哪些特点

ES6 规定, 默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性, 换个角度, 也可以认为, 一个数据结构只要具有 Symbol.iterator 属性(Symbol.iterator 方法对应的是遍历器生成函数, 返回的是一个遍历器对象), 那么就可以其认为是可迭代的。

  • 可迭代对象的特点:

    • 具有 Symbol.iterator 属性, Symbol.iterator() 返回的是一个遍历器对象
    • 可以使用 for ... of 进行循环
    • 通过被 Array.from 转换为数组
  • 原生具有 Iterator 接口的数据结构:

    • Array
    • Map
    • Set
    • String
    • TypedArray
    • 函数的 arguments 对象
    • NodeList 对象
表单可以跨域吗?

表单可以跨域, 但是需要服务器端设置允许跨域, 通常是设置响应头 Access-Control-Allow-Origin

使用 js 如何改变 url, 并且页面不刷新

改变 URL 的目的是让 js 拿到不同的参数, 进行不同的页面渲染, 其实就是 router 的原理

  • 最简单的就是改变 hash, 改变 hash 是并不会刷新页面的, 也会改变 URL, 也能监听 hashchange 事件进行页面的渲染
  • 还有一种就是使用 HTML5 的 history.pushState() 方法, 该方法也可以改变 url 然后不刷新页面。
js 定时器为什么是不精确的?