博客
关于我
js面试题(2019最新)
阅读量:120 次
发布时间:2019-02-27

本文共 3248 字,大约阅读时间需要 10 分钟。

JavaScript 面试题解析

一、数据类型

在 JavaScript 中,数据类型主要分为基本数据类型和引用数据类型。基本数据类型包括:

  • Number:表示数值(包括整数、浮点数和 NaN)
  • String:表示文本字符串
  • Boolean:表示布尔值(true 或 false)
  • Undefined:表示未定义变量
  • Null:表示空值
  • Symbol:表示独特的符号类型
  • BigInt:表示大整数

ObjectArray 是引用数据类型。

判断数据类型的方法:

  • 使用 typeof() 来判断基本数据类型
  • 使用 instanceof 来判断引用数据类型

二、HTTP 协议

HTTP 是超文本传输协议,用于浏览器和服务器之间的通信。其特点包括:

  • 无状态性:HTTP 不保存客户端和服务器之间的状态
  • 可请求性:服务器可以根据客户端的请求返回响应
  • 可缓存性:客户端可以缓存服务器返回的资源
  • HTTP 请求与响应

    • 请求行:包含请求方法、资源路径和 HTTP 版本
    • 请求头部:包含附加信息,如授权认证、内容类型等
    • 空行:标识请求头部结束
    • 请求数据:请求的主体内容

    响应也由四个部分组成:

    • 状态行:包含 HTTP 版本、状态码和状态消息
    • 消息报头:包含服务器感知的附加信息
    • 空行:标识消息报头结束
    • 响应正文:服务器返回给客户端的文本信息

    常见的 HTTP 方法

    • GET:默认方法,用于从服务器获取资源
    • POST:用于提交数据(常用于表单提交)
    • HEAD:与 GET 类似,但不返回响应正文
    • PUT:用于更新资源
    • DELETE:用于删除资源
    • CONNECT:用于代理服务器连接
    • OPTIONS:用于获取可支持的 HTTP 方法

    HTTP 状态码

    状态码分为五个类别:

    • 1xx:信息性状态(表示请求接收成功)
    • 2xx:成功状态(表示请求处理成功)
    • 3xx:重定向状态(表示进一步操作需要)
    • 4xx:客户端错误(请求语法错误或无法实现)
    • 5xx:服务器错误(服务器未能处理合法请求)

    三、跨域(Cross-Origin)

    什么是跨域?

    跨域指的是不同域名或不同源的网页之间的通信。由于浏览器的同源策略,跨域通信受到限制。

    跨域的原因

  • 同源策略:浏览器限制不同源的内容互动
  • 安全性:防止恶意脚本访问其他域的数据
  • 跨域的实现方法

  • 前端方式
    • postMessage
    • window.name
    • document.domain
    • image.src(获取图片数据,但返回空对象)
    • jsonp(通过script标签获取数据)
  • 后端方式
    • CORS:服务器设置响应头 Access-Control-Allow-Origin
    • 服务器代理:通过代理服务器访问目标资源
  • JSONP 跨域

    利用 script 标签加载远程脚本,通过 src 属性实现跨域数据获取。优点:

    • 简便易行
    • 支持 GET 请求 缺点:
    • 不支持 POST 请求
    • 不安全(若目标服务器不可信)

    四、瀑布流布局

    瀑布流布局是一种等宽不等高的多列布局,其实现原理包括:

  • 计算页面宽度:确定可放置数据块的列数
  • 记录数据块高度:存储各数据块的高度
  • 绝对定位:依次将数据块填充到页面中
  • 动态更新:当浏览器窗口大小改变或滚动时,重新排列数据块

  • 五、HTML5 和 CSS3

    HTML5 新特性

  • 语义化标签:如 articlefooterheader
  • 新表单控件calendardatetime
  • ** WebGL**:用于 3D 渲染
  • ** WebSocket**:用于实时通信
  • ** Geolocation**:用于定位服务
  • CSS3 新特性

  • 选择器扩展:如 ::before::after 等伪类
  • 渐变效果linear-gradientradial-gradient
  • 盒阴影和圆角box-shadowborder-radius
  • 文字效果word-wraptext-overflow
  • 转换效果transformtransition

  • 六、盒模型

    标准盒模型

    • 宽度 = margin-left + padding-left + width + padding-right + margin-right
    • 高度 = margin-top + padding-top + height + padding-bottom + margin-bottom

    怪异盒模型

    • 宽度 = margin-left + padding-left + width + margin-right
    • 高度 = margin-top + padding-top + height + margin-bottom

    两种盒模型的区别

    • 标准盒模型适用于大多数浏览器
    • 怪异盒模型在 IE 浏览器中使用较多

    七、闭包(Closure)

    什么是闭包?

    闭包是函数内部能够访问函数外部变量的能力。常见用途:

  • 提供私有功能 2.缓存变量
  • 闭包的优点

    • 保护变量安全
    • 实现封装

    闭包的缺点

    • 增大内存占用
    • 可能导致内存泄漏

    八、深拷贝与浅拷贝

    • 浅拷贝:仅复制引用(内存地址相同)
    • 深拷贝:递归复制对象中的所有属性

    实现方法:

  • JSON.stringifyJSON.parse
  • jQuery的 extend 方法

  • 九、事件模型

    事件捕获与事件冒泡

    • 事件捕获:从最不精确的对象(如 document)开始触发
    • 事件冒泡:从最精确的对象(如元素)开始触发

    如何控制事件

    • 使用 addEventListener 的第三个参数:
      • true 表示事件捕获
      • false 表示事件冒泡

    取消默认事件

    • W3C 方法event.preventDefault()
    • IE 方法event.returnValue = false

    十、this 指向问题

    this 在 JavaScript 中的指向:

  • 全局变量:挂载在 window 对象
  • 函数内变量:指向调用者
  • 箭头函数:指向定义位置
  • callapply:可指定 this 对象

  • 十一、new 操作符

    new 操作符的作用:

  • 创建一个新对象
  • 将新对象的属性和方法添加到 this
  • 返回 this

  • 十二、继承

    在 JavaScript 中,对象的继承通过 prototype 实现。常见方式:

  • 构造函数继承
    function B extends A {
    constructor() {
    this.a = 1;
    super();
    }
    }
  • ES6 类继承
    class B extends A {
    constructor() {
    super();
    this.a = 1;
    }
    }

  • 十三、冒泡排序

    冒泡排序的原理:

  • 比较相邻两元素
  • 将较大的元素向上冒泡
  • 重复直到数组排序完成

  • 十四、浏览器标签页通信

    方法

  • StoragelocalStoragesessionStorage
  • 地址栏参数
  • Cookie:小型文本文件存储在客户端
  • 区别

  • sessionStorage:仅在当前窗口/标签页中有效
  • localStorage:永久存储
  • cookie:由客户端管理

  • 十五、性能优化

    减少 HTTP 请求

    • 压缩静态文件:使用 Gzip 或 Brotli
    • 合并请求:将多个资源合并为一个请求

    减少 DOM 操作

    • 事件委托:减少 DOM 操作次数
    • 单次 DOM 操作:避免频繁操作

    使用框架

    • Vue.js:简化状态管理
    • React.js:高效的状态管理

    十六、applycall 的区别

    apply

    • 最多接收两个参数:thisObjargArray
    • 适用于需要传递多个参数或参数数组的场景

    call

    • 可接收多个参数:thisObj 和后续的参数列表
    • 适用于需要改变 this 指向并传递多个参数的场景

    区别

    • apply 的参数格式为数组或 arguments 对象
    • call 的参数直接传递

    转载地址:http://uuob.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现bfs 最短路径算法(附完整源码)
    查看>>
    Objective-C实现BF算法 (附完整源码)
    查看>>
    Objective-C实现Bilateral Filter双边滤波器算法(附完整源码)
    查看>>
    Objective-C实现binary exponentiation二进制幂运算算法(附完整源码)
    查看>>
    Objective-C实现binary tree mirror二叉树镜像算法(附完整源码)
    查看>>
    Objective-C实现binary tree traversal二叉树遍历算法(附完整源码)
    查看>>
    Objective-C实现BinarySearchTreeNode树算法(附完整源码)
    查看>>
    Objective-C实现binomial coefficient二项式系数算法(附完整源码)
    查看>>
    Objective-C实现bisection二分法算法(附完整源码)
    查看>>
    Objective-C实现bisection二等分算法(附完整源码)
    查看>>
    Objective-C实现BitMap算法(附完整源码)
    查看>>
    Objective-C实现bitonic sort双调排序算法(附完整源码)
    查看>>
    Objective-C实现bogo sort排序算法(附完整源码)
    查看>>
    Objective-C实现boruvka博鲁夫卡算法(附完整源码)
    查看>>
    Objective-C实现Boyer-Moore字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现BP误差逆传播算法(附完整源码)
    查看>>
    Objective-C实现breadth First Search广度优先搜索算法(附完整源码))
    查看>>
    Objective-C实现BreadthFirstSearch广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现BreadthFirstShortestPath广度优先最短路径算法(附完整源码)
    查看>>
    Objective-C实现bubble sort冒泡排序算法(附完整源码)
    查看>>