前端JS面试题-JS Web Api

时间:2021-07-16 15:39:01   收藏:0   阅读:51

JS基础知识,只规定了语法(ECMA 262 标准)
JS Web Api,是网页操作的API(W3C标准)
前者时后者的基础,两者结合才能真正实际应用。

本文包括以下部分:

一、DOM

题目

  1. DOM是哪种数据结构
  2. DOM操作常用的API
  3. attr和property的区别
  4. 一次性插入多个DOM节点,考虑性能

1. DOM是哪种数据结构

树型结构 DOM树

2. DOM操作常用的API

分为两类: DOM 节点操作和 DOM 结构操作
参考知识点2和3

3. attr和property的区别

4. 一次性插入多个DOM节点,考虑性能

const listNode = document.getElementById(‘list‘)

// 创建一个文档片段,此时还没有插入到 DOM 树中
const frag = document.createDocumentFragment()

// 执行插入
for (let x = 0; x < 10; x++) {
  const li = document.createElement(‘li‘)
  li.innerHTML = ‘list item ‘ + x
  frag.appendChild(li)
}

// 都完成之后,再插入到 DOM 树中
listNode.appendChild(frag)

知识点

1. DOM本质

2. DOM节点操作

获取DOM节点

const pList = document.querySelectorAll(‘p‘)
const p = pList[0]
p.getAttribute(‘data-name‘)
p.getAttribute(‘data-name‘, ‘imooc‘)
p.getAttribute(‘style‘)
p.getAttribute(‘style‘, ‘font-size: 30px‘)
const pList = document.querySelectorAll(‘p‘)
const p = pList[0]
p.style.width = ‘100px‘
p.className = ‘p1‘
console.log(p.nodeName)
console.log(p.nodeType)

3. DOM结构操作

新增/插入节点

const div1 = document.getElementById(‘div1‘)
// 添加新节点
const p1 = document.createElement(‘p‘)
p1.innerHTML = ‘this is p1‘
div1.appendChild(p1)  // 添加新创建的元素
// 移动已有节点
const p2 = document.getElementById(‘p2‘)
div1.appendChild(p2)

获取子元素列表,获取父元素

// 获取父元素
console.log(p1.parentNode)
// 获取子元素列表
const div1ChildNodes = div1.childNodes
const div1ChildNodesP = Array.prototype.slice.call(div1.childNodes).filter(child => {
  if (child.nodeType === 1) {
    return true
  }
  return false
})
console.log(‘div1ChildNodesP‘, div1ChildNodesP)

删除节点

const div1 = document.getElementById("div1")
const child = div1.childNodes
div1.removeChild(child[0])

4. DOM性能

DOM操作非常“昂贵”,避免频繁的DOM操作
对DOM查询做缓存
将频繁操作改为一次性操作
DOM查询做缓存
技术分享图片
将频繁操作改为一次性操作
技术分享图片

二、BOM

题目

  1. 如何识别浏览器的类型
  2. 分析拆解url各个部分

1. 如何识别浏览器的类型

const ua = navigator.userAgent
const isChrome = ua.indexOf(‘Chrome‘)
console.log(isChrome)

2. 分析拆解url各个部分

location.href  // 整个网址
location.protocol  // 协议
location.host  // 域名
location.pathname  // 路径
location.search  // 常用参数
location.hash  // 哈希,# 后的内容

知识点

1. navigator

const ua = navigator.userAgent
const isChrome = ua.indexOf(‘Chrome‘)
console.log(isChrome)

2. screen

技术分享图片

3. location

location.href  // 整个网址
location.protocol  // 协议
location.host  // 域名
location.pathname  // 路径
location.search  // 常用参数
location.hash  // 哈希,# 后的内容

整个网址是由上面的信息拼接起来的

4. history

history.back()  // 后退
history.forward()  // 前进

三、事件

题目

  1. 编写一个通用的事件监听函数
  2. 描述事件冒泡的流程
  3. 无线下拉的图片列表,如何监听每个图片的点击

1. 编写一个通用的事件监听函数

注意代理问题 this问题

// 既支持普通绑定,也支持代理绑定
function bindEvent(elem, type, selector, fn) {
  // 可传入3个参数,也可传入4个参数
  if(fn == null){
    fn = selector
    selector = null
  }
  elem.addEventListener(type, event=>{
    const target = event.target
    if(selector){
      // 代理绑定
      if (target.matches(selector)) {
        fn.call(target, event)
      }
    }else{
      // 普通绑定
      fn.call(target, event)
    }
  })
}

2. 描述事件冒泡的流程

3. 无线下拉的图片列表,如何监听每个图片的点击

要点:

知识点

1. 事件绑定

// 普通的事件绑定
const btn = document.getElementById(‘btn1‘)
btn.addEventListener(‘click‘, event=>{
	console.log(‘clicked‘)
})

// 较为通用的绑定函数
function bindEvent(elem, type, fn) {
  elem.addEventListener(type, fn)
}
const a = document.getElementById(‘link1‘)
bindEvent(a, ‘click‘, e=>{
	e.preventDefault()  // 阻止默认行为
	alert(‘clicked‘)
})

2. 事件冒泡

3. 事件代理

事件代理参考
“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown......)委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。

优点:

但是,不要滥用;可以应用于瀑布流

// html
<div id="div3">
    <a href="#">a1</a><br>
    <a href="#">a2</a><br>
    <a href="#">a3</a><br>
    <a href="#">a4</a><br>
    <button>加载更多...</button>
</div>

// js
const div3 = document.getElementById(‘div3‘)
bindEvent(div3, ‘click‘, event=>{
	event.preventDefault() // 阻止 a 的跳转的默认行为
	const target = event.target
	if(target.nodeName === ‘A‘){ // 判断是否是 a 标签
		alert(target.innerHTML)
	}
})

不好每个都挨个绑定事件,那么我们把事件绑定到父元素上,这就是事件代理。

四、Ajax

题目

  1. 手写一个Ajax,支持post get,支持404
  2. 跨域的常用实现方式

1. 手写一个Ajax,支持post get,支持404

2. 跨域的常用实现方式

知识点

1. XMLHttpRequest

XMLHttpRequest 对象用于在后台与服务器交换数据。并且可以

// get 请求
const xhr = new XMLHttpRequest()
xhr.open(‘GET‘, ‘data/test.json‘, true)
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if(xhr.status === 200) {
      console.log(
        alert(xhr.responseText)
    }
  }
}
xhr.send(null)

// post 请求
const xhr = new XMLHttpRequest()
xhr.open(‘POST‘, ‘/login‘, true)
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4) {
    if(xhr.status === 200) {
      console.log(
        alert(xhr.responseText)
    }
  }
}
const postData = {
	userName: ‘zhangdan‘,
	password: ‘xxx‘
}
xhr.send(JSON.stringify(postData))

2. 状态码

readyState

responseStatus

3. 跨域

同源策略

跨域解决方案(待整理)

五、存储

题目

  1. 描述cookie localStorage sessionStorage 区别
    从以下三方面来进行描述:

知识点

技术分享图片
cookie 的缺点

2. localStorage sessionStorage

技术分享图片

两者区别

原文:https://www.cnblogs.com/wumengcheng/p/15014902.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!