⚠️ Generate by copilot, need to review and modify
JS 数据类型转换规则
严格模式严格在哪里?
- 变量必须声明后再使用
- 函数的参数不能有同名属性, 否则报错
- 不能使用 with 语句
- 不能对只读属性赋值, 否则报错
- 不能使用前缀 0 表示八进制数, 否则报错
- 不能删除不可删除的属性, 否则报错
- 不能删除变量 delete prop, 会报错, 只能删除属性 delete global[prop]
- eval 不会在它的外层作用域引入变量
- eval 和 arguments 不能被重新赋值
- arguments 不会自动反映函数参数的变化
- 不能使用 arguments.callee
- 不能使用 arguments.caller
- 禁止 this 指向全局对象
- 不能使用 fn.caller 和 fn.arguments 获取函数调用的堆栈
- 增加了保留字(比如 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 然后不刷新页面。