JS面试高频知识点(持续整理)

JS知识体系
1、JS基础知识,规定语法(ECMA 262标准)
(1)变量类型和计算
  • 值类型vs引用类型
    • 值类型number,boolean,,string,undefined( 就是声明了变量但未给变量赋值,使用该变量是undefined) ,null( null类型,一般用来占位,当某个变量的值或者方法不在需要时,用null赋值给该变量),symbol( ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值)
    • 引用类型 object,Array等(对象,数组,函数)
    • 区别:值类型是存储在栈里,引用类型是存储在堆里。栈从上往下排列,堆从下往上排列,引用类型在栈里赋值的是内存地址,通过内存地址找到堆里存放的那个值。
    • 为什么引用类型只能赋值内存地址??还是性能问题,值类型只有一个值,占用空间比较少,所以可以直接在栈里赋值;而引用类型会太大,不好管理,直接复制的时候会非常慢。
  • typeof运算符
    • 能够识别所有值类型,识别函数,判断是否是引用类型
    • 几个特别的:
      • NaN在JavaScript中代表的是特殊非数字值,它本身是一个数字类型。 Infinity无穷数。
      • (对象,数组,null)返回object。
      • 未定义的变量typeof的类型值是undefined。
    •    
  • 变量计算-类型转换
    • 强制类型转换,也叫显式转换。是指能直接看见将一种数据类型转换成另外一种数据类型,在程序上的表现就是借助一些方法来实现转换,如:Number() String() Boolean() parseInt()取整 parseFloat()取小数
    • 字符串拼接
    • ==运算符与===运算符
      • “==”:叫相等运算符
      • “===”:叫严格运算符
      • 它们两有什么区别呢?
      • == :表示值相等则都为true
      • ===:表示不仅要值相等,双方类型也要相等才为true
    • &&与,||或(逻辑&&的优先级高于||)
(2)原型与原型链
  1. class
    • constructor构造函数
    • 属性
    • 方法
  2. 继承
  3. 原型
    • 原型关系
      • 显式原型:prototype
      • 隐式原型:__proto__
      • 总结在纸上 
    • 基于原型的执行规则
      • 获取属性xiaoluo.name或执行方法xiaoluo.sayhi()时
      • 先在自身属性和方法寻找
      • 如果找不到则自动去__proto__(隐式原型)中查找
  4. 原型链
    • hasOwnProperty检查本身是否有这个属性, ,这个方法在Object里面
  5. instanceof
    • 可以判断前面那个变量是不是由后面的class给构建出来的
(3)作用域和闭包
  1. 作用域: 一条数据可以在哪个范围中使用。作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
    • 全局作用域:在全局都可使用
    • 函数作用域:只能在当前函数内使用
    • 块级作用域(ES6新增):在if,for等后面有大括号形成的块内使用。 
  2. 自由变量
    • 一个变量在当前作用域没有定义,但被使用了
    • 向上级作用域,一层一层依次寻找,直到找到为止
    • 如果到全局作用域都没找到,则报错xx is not defined
  3. 闭包
    • 闭包是什么?
      • 函数外部无法访问函数内部的局部变量,但函数内部的函数可以访问本函数内的局部变量,故通过闭包实现函数外部访问函数内部局部变量。 容易造成内存泄露。
      • 闭包是嵌套的内部函数
      • 包含被引用的函数(变量)的对象
    • 闭包产生的条件:
      • 函数嵌套
      • 内部函数引用了外部函数的数据,就是执行了外部函数
    • 闭包其实是作用域应用的特殊情况,有两种表现:
      • 1、函数作为参数被传递
      • 2、函数作为返回值被返回
      • 所有的(包括闭包的)自由变量的查找,是在函数定义的地方,向上一级作用域查找,不是在执行的地方!!
    • 实际开发中闭包的应用
      • 隐藏数据
  4. this
    • 使用场景
      • 第一种情况: 全局下this。函数直接调用(this指向Window)
      • 第二种情况:构造函数
        • (1).当函数作为构造函数调用时,this代表new出来的对象;
        • (2).如果没有使用new而是直接调用函数,this===window;
        • (3).不仅仅是构造函数的prototype,即便是在整个原型链中,this代表的也是当前对象的值; 
      • 第三种情况:函数作为对象的一个属性
        • 这里有两种情况
        • (1).函数作为对象的一个属性被调用的时候,this指向的是该对象;
        • (2).函数作为对象的一个属性被赋值到另一个变量中调用,this===window
      • 第四种情况: 函数用apply() call() bind()调用时,this取得是传入的对象
      • 箭头函数,(找它上级作用域的this的值来确定)
    • (1)函数直接调用 this指向window
    • (2)函数被别人调用 谁调用this就指谁
    • (3)new一个实例 this指向new的实例
    • (4)apply、call、bind时 this 会改变。
    • (5)箭头函数
    • this在各个场景中取什么样的值,是在函数执行的时候确认的,不是在函数定义的时候确认的
(4)异步
  • JS是单线程语言,只能同时做一件事
  • 浏览器和nodejs已经支持JS启动进程,如Web Worker
  • JS和DOM渲染共同用同一个线程,因为JS可修改DOM结构
  • 遇到等待(网络请求,定时任务)不能卡住,所以需要异步,回调callback函数形式
  1. 单线程 
  2. callback
  3. 应用场景
  4. Promise
(5)模块化
  • ES6 Module
2、JS Web API,网页操作的API(W3C标准)
(1)DOM(Document Object Model 文档对象模型)
  • DOM本质就是树结构操作
  • DOM节点操作
    • 获取DOM节点
    • attribute(通过getAttribute,setAttribute去修改html属性,改变html的结构/修改标签)
    • property(一种形式,用js的属性操作的一种形式/修改的是js变量的属性,不会体现到html结构中)
    • property和attribute都有可能引起DOM重新渲染
  • DOM结构操作
    • 新增/插入节点
    • 获取子元素列表,获取父元素
    • 删除子元素
  • DOM性能
    • DOM操作会占用CPU比较多,有可能会导致浏览器的重排和重新渲染,如果频繁操作可能会造成卡顿问题,所以要避免频繁的DOM操作。
    • 对DOM查询做缓存,减少DOM操作
    • 将频繁操作改为一次性操作
(2)BOM(Browser Object Model浏览器对象模型)
  • navigator(浏览器的信息)
  • screen(屏幕的信息,如宽度高度)
  • location(地址的信息,分析url的信息)
  • history(前进后退)
(3)事件
  • 事件绑定
  • 事件冒泡(基于DOM树形结构,事件会顺着触发元素向上冒泡,应用场景:代理)
  •   
  • 事件代理:所谓代理就是因为要绑定的数量太多太复杂,不好去每个挨个去绑定事件,我们把事件绑定在父元素上,然后判断子元素是否是我们想要的元素,拿到这个元素再做我们想要的动作。
    • 代码简洁
    • 减少浏览器内存占用
    • 但是,不要滥用
(4)ajax
  • XMLHttpRequest
  • 状态码
    • xhr.readyState
      • 0 ->(未初始化)还没有调用send()方法
      • 1 ->(载入)已调用send()方法,正在发送请求
      • 2 ->(载入完成)send()方法执行完成,已经接收到全部响应内容
      • 3 ->(交互)正在解析相应内容
      • 4 ->(完成)响应内容解析完成,可以在客户端调用
    • xhr.status
      • 2xx ->表示成功处理请求,如200
      • 3xx ->需要重定向,浏览器直接跳转,如301:永久重定向。  302:临时重定向。 304:资源未改变。
      • 4xx ->客户端请求错误,如404:请求的地址有错误 ,服务器找不到。 403:客户端没有权限。
      • 5xx ->服务器端错误
(5)跨域:
  • 同源策略:ajax请求时,浏览器要求当前网页和server必须同源(安全)。
    • 同源:协议、域名、端口,三者必须一致
  • 跨域解决方法
    • 加载图片、css、js可以无视同源策略
      • <img src="跨域的图片地址" />
      • <link href="跨域的css地址" />
      • <script src="跨域的js地址"></script>
    • <img/>可以用于统计打点,可使用第三方统计服务。
    • <link/><script>可使用CDN,CDN一般都是外域。所以css,js可以无视同源策略。
    • <script>可实现JSONP
  • 所有的跨域,都必须经过server端允许和配合,未经server端允许就实现跨域,说明浏览器有漏洞,危险信号
  • JSONP
    • <script>可绕过跨域限制
    • 服务器可以任意动态拼接数据返回。访问 https://xx.com/,服务器返回的只要符合html格式要求,不一定返回html文件。同理<script src="xx.js"">,只要服务器端拼接返回的数据符合js格式,执行不报错就可以。
    • 所以<script>就跨域获得跨域的数据,只要服务器愿意返回。
  • 跨域的实现方法:JSONP,CORS(纯服务端做的)
(6)存储
  • cookie
    • 本身用于浏览器和server通讯,用于http请求的一部分。
    • 被“借用”到本地存储来
    • 可用document.cookie='...'来修改。
    • 前端对cookie赋值,不管怎么刷新,值都是在的,所以cookie可以用作存储。
    • 缺点:
      • 存储太小,最大4KB
      • http请求时需要发送到服务端(存储的数据也会被发送到服务端),增加请求数据量
      • 只能用document。cookie = '..'来修改,太过简陋
  • localStorage和sessionStrorage
    • HTML5专门为存储而设计的,最大可存5M(针对每个域存储5M)
    • API简单易用setItem getItem
    • 不会随着http请求被发送出去
  • localStorage和sessionStrorage的区别
    • localStorage数据会永久存储,除非手动或代码删除。
    • sessionStorage数据只存在于当前会话,浏览器关闭则清空。(当前会话就是当前你和浏览器的连接)
    • 一般用localStorage会更多一些
  • 描述cookie localStorage sessionStorage的区别?
    • 容量
    • API易用性,cookie是用document.cookie='...',localStorage和sessionStorage是用setItem/getItem。
    • 是否跟随http请求发送出去
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值