常见前端面试题

深拷贝,浅拷贝
  • 深拷贝是开辟一块新的内存地址,将源对象的各个属性逐个复制过去,对拷贝对象和源对象各自的操作互不影响
  • 递归方法:(深拷贝)
function deepCopy(obj) {
  var out = (obj.constructor === Array) ? [] : {};
  for (var i in obj) {
    if (typeof obj[i] === 'object') {
      out[i] = (obj[i].constructor === Array) ? [] : {};
      out[i] = deepCopy(obj[i]);
    } else {
       out[i] = obj[i];
    }
  }
  return out;
}

  • 浅拷贝(会导致引用类型A和引用类型B指向同一块内存地址。改变其中一方内容,都是在原来的内存上做修改会导致对象和源对象都发生改变)
let obj = {a: 1}
obj1 = obj

https://www.cnblogs.com/jiajiamiao/p/11641574.html

promise
  • Promise是一种用于解决异步问题的思路、方案或者对象方式。
const fn = new Promise(function (resolve, reject) {
  setTimeout(()=>{
    let num = Math.random()
    if (num > 5) {
      resolve(num)  //返回值
    } else {
      reject(‘error’) // 报错
    }
  },3000)
})
fn.then((res)=>{
  console.log(res) // 随机数
},(err)=>{
  console.log(err) // 报错
})

https://www.cnblogs.com/lunlunshiwo/p/8852984.html

响应式,数据绑定
  • 数据驱动:Vue.js 一个核心思想是数据驱动。所谓数据驱动是指视图是由数据驱动生成的,对视图的修改,不会直接操作 DOM,而是通过修改数据。
  • 在vue.js里面只需要改变数据,Vue.js通过Directives指令去对DOM做封装,当数据发生变化,会通知指令去修改对应的DOM,数据驱动DOM的变化,DOM是数据的一种自然的映射。vue.js还会对View操作做一些监听(DOM Listener),当我们修改视图的时候,vue.js监听到这些变化,从而改变数据。这样就形成了数据的双向绑定。
  • 大致上是使用数据劫持和订阅发布实现双向绑定。通过实例化一个Vue对象的时候,对其数据属性遍历,通过Object.defineProperty()给数据对象添加setter getter,并对模板做编译生成指令对象,每个指令对象绑定一个watcher对象,然后对数据赋值的时候就会触发setter,这时候相应的watcher对其再次求值,如果值确实发生变化了,就会通知相应的指令,调用指令的update方法,由于指令是对DOM的封装,这时候会调用DOM的原生方法对DOM做更新,这就实现了数据驱动DOM的变化。同时vue还会对DOM做事件监听,如果DOM发生变化,vue监听到,就会修改相应的data

https://blog.csdn.net/tangxiujiang/article/details/79594860

$set
  • 受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。
  • 要处理这种情况,我们可以使用$set()方法,既可以新增属性,又可以触发视图更新。
数组===> this.$set( Array, index , value)
对象===>this.$set(Object,''key'',value)

https://blog.csdn.net/aaa333qwe/article/details/80362117

$nextick
  • 定义: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
  • 用法1:created
    Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中,原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载已完成。
  • 用法2:
    当项目中你想在改变DOM元素的数据后基于新的dom做点什么,对新DOM一系列的js操作都需要放进Vue.nextTick()的回调函数中;通俗的理解是:更改数据后当你想立即使用js操作新的视图的时候需要使用它

https://blog.csdn.net/zhouzuoluo/article/details/84752280

节流函数
  • 函数节流:针对调用频率高的函数,通过设置定时器,使其在执行后间隔一段时间,才进行下一次的执行,避免重复频繁的调用导致的浏览器性能以及ajax重复调用问题。
  • 最常见的一些需要节流的事件:onresize,scroll,mousemove ,mousehover,因为这些事件会在页面中频繁被触发
  • 主要实现思路就是通过setTimeout定时器,通过设置延时时间,在第一次调用时,创建定时器,写入需要执行的函数。第二次调用时,会清除前一个定时器并设置新的定时器。如果这时前一个定时器暂未执行,则将其替换为新的定时器。目的在于在一定的时间内,保证多次函数的请求只执行最后一次调用
document.querySelector('.box').addEventListener('mouseenter',function(){
  console.log('鼠标进来啦')
})
节流函数
var clock
document.querySelector('.box').addEventListener('mouseenter',function(){
  clearTimeout(clock)
   clock = setTimeout(function(){
    console.log('鼠标进来啦')
  },1000)
})

https://www.jianshu.com/p/be095def79ec

子组件改变父组件的值

$emit直接调用函数,把参数传给父元素,父元素调用函数时,赋值就可以了。
https://www.cnblogs.com/doing-good/p/10862491.html

vue .sync修饰符
  • vue的prop是单向下行绑定:父级的prop的更新会向下流动到子组件中,但是反过来不行。可是有些情况,我们需要对prop进行“双向绑定”。这个时候,就可以用.sync来解决
<text-document :title.sync="doc.title"></text-document>
当子组件需要更新 title 的值时,它需要显式地触发一个更新事件:
this.$emit('update:title', newValue)

https://www.cnblogs.com/00feixi/p/11526057.html

  • 跨域: jsonp、 document.domain+iframe、window.name、window.postMessage、服务器上设置代理页面
    jsonp的原理是动态插入script标签

  • CSS Sprites 图片精灵

  • 小程序
    https://segmentfault.com/a/1190000018689948

  • 继承:

继承:子类可以使用父类的所有功能,并且对这些功能进行扩展。继承的过程,就是从一般到特殊的过程。

  var arr = [8, 7, 6, 5, 4, 3, 2, 1];
  function maoPao(s) {
    for (var i = 1; i < arr.length; i++) { //进行了7次
      for (var j = 0; j < arr.length; j++) {
        if (arr[j] > arr[j + 1]) {
        var temp; //空杯子
        temp = arr[j]; //大叔放到空杯子
        arr[j] = arr[j + 1]; //小数放到小的位置上
        arr[j + 1] = temp; //da数放到大的位置上
        }
      }
    }
  return arr;
  }
     console.log(maoPao(arr))

https://www.cnblogs.com/yy0419/p/11137205.html

  • es6新增属性,与es5比较

块级作用域 关键字let, 常量const
箭头函数
(1).简化了代码形式,默认return表达式结果。
(2).自动绑定语义this,即定义函数时的this。
promise异步请求数据
set,map
字符串模板 Template strings
var name = "Bob", time = "today";
Hello ${name}, how are you ${time}?
// return "Hello Bob, how are you today?"
https://www.cnblogs.com/sunshinezjb/p/9248533.html

 $('input[name="nw"]'   $("[name='theName']");
  • canvas画圆
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.beginPath();
ctx.arc(100,75,50,0,2*Math.PI);  x,y,r,开始度数,结束度数,圆是360度(2*Math.PI)
ctx.stroke();

https://www.w3school.com.cn/tags/canvas_arc.asp

@media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的。
当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。
https://www.runoob.com/cssref/css3-pr-mediaquery.html

  • 通过navigator属性检查浏览器是什么浏览器
var cu = navigator.userAgent;
if('ActiveXObject' in window){
    alert('是ie浏览器')
}else if(/firefox/i.test(cu)){
   alert('是火狐浏览器')
}else if(/chrome/i.test(cu)){
   alert('是谷歌浏览器')
}

https://blog.csdn.net/qq_35872777/article/details/85272300

原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链。

  • 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。
  • js中的内存泄露
  • 定义:程序不需要的内存,由于某些原因其不会返回到操作系统或者可用内存池中。 内存泄露会导致(运行缓慢 ,高延迟,崩溃)的问题
  • 常见的导致内存泄露的原因有:
    1;意外的全局变量
    2;被遗忘的计时器或回调函数
    3;脱离文档的DOM的引用
    4;闭包
  • 跨域

1.CORS跨域资源共享 后端需要设置Access--Control-Allow-Credentials:true ****
2.jsonp实现跨域:动态创建script,利用src属性进行跨域
3.nginx代理跨域
4.nodejs中间件代理跨域
5WebSokect协跨域
6.window.name+ifram跨域

  • url 参数转对象
let str = "http://localhost:3000/index.html?phone=12345678901&pwd=123123";
let arr = str.split("?")[1].split("&");   //先通过?分解得到?后面的所需字符串,再将其通过&分解开存放在数组里
let obj = {};
for (let i of arr) {
  obj[i.split("=")[0]] = i.split("=")[1];  //对数组每项用=分解开,=前为对象属性名,=后为属性值
}
console.log(obj);

https://www.cnblogs.com/zhangzhiyong/p/9949641.html

  • 防抖函数(单位时间内多次触发只会执行一次)
    //500毫秒内多次触发只会执行一次,
    function de(){
        let timer;
、
        return function(){
            if(timer) clearTimeout(timer);//如果500毫秒内又一次触发,则会重新计算时间

            timer = setTimeout(() => {
              console.log('dddd')
            }, 500)
        }
    }
    document.querySelector('#btn').addEventListener('click',de())

https://blog.csdn.net/weixin_35958891/article/details/94462047

  • @import和link
    优化页面
    sessionStorage用法
    position属性及区别
    去重

  • v-if和c-show 封装一个函数

  • 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
    分为4个步骤:
    (1),当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
    (2), 浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
    (3),一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的GET请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态表示一个正确的响应。
    (4),此时,Web服务器提供资源服务,客户端开始下载资源。

请求返回后,便进入了我们关注的前端模块
简单来说,浏览器会解析HTML生成DOM Tree,其次会根据CSS生成CSS Rule Tree,而javascript又可以根据DOM API操作DOM

面试题网站
https://www.cnblogs.com/jiajiamiao/p/11609335.html OK V
https://www.jianshu.com/p/eb0f269098d5 不是很全 V
https://blog.csdn.net/keyandi/article/details/89227175 OK V

自己了解

<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />

  • 怎么让Chrome支持小于12px 的文字?
    答案:p{font-size:10px;-webkit-transform:scale(0.8);}//0.8是缩放比例

  • Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示,
    可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决.

  • react

  • ajax过程
    (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.
    (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
    (3)设置响应HTTP请求状态变化的函数.
    (4)发送HTTP请求.
    (5)获取异步调用返回的数据.
    (6)使用JavaScript和DOM实现局部刷新

  • ajax 是什么?ajax 的交互模型?同步和异步的区别?如何解决跨域问题?

  1. 通过异步模式,提升了用户体验
  2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
  3. Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。
  4. Ajax的最大的特点是什么。
    Ajax可以实现动态不刷新(局部刷新)
    readyState属性 状态 有5个可取值: 0=未初始化 ,1=启动 2=发送,3=接收,4=完成
    ajax的缺点
    1、ajax不支持浏览器back按钮。
    2、安全问题 AJAX暴露了与服务器交互的细节。
    3、对搜索引擎的支持比较弱。
    4、破坏了程序的异常机制。
    5、不容易调试。
  • 握手(3次)
    1、首先服务器处于LISTEN(监听)状态,客户端向服务器发送请求,其中SYN=1,初始化一个seq为x
    2、服务器接收连接请求报文后,如果同意建立连接,则向A发送连接确认报文,SYN=1,ACK=1,seq=y,ack=x+1
    3、A接收到B发出的连接确认报文后还需要向B发送确认报文。ACK=1,seq=x+1,ack=y+1
    4、B收到A的确认后,连接建立
  • 挥手(4次)
    1、A发送挥手报文,FIN=1, 初始化一个seq=u
    2、B接收到挥手报文后进入CLOSE-WAIT状态,通知应用进程。并向A发出确认。此时TCP处于半连接状态,即B能向A发送数据而A不能向B发送数据。ACK=1,seq=v,ack=u+1
    3、当B不再需要连接时,向A发送第三次挥手报文,FIN=1,ACK=1,ack=u+1
    4、A接收到第三次挥手报文后向B发送确认,并且等待2MSL的时间再关闭。
    5、B接收到确认后直接关闭连接。

https://blog.csdn.net/kenChenFire/article/details/88875832

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容