2024年Web前端最全JavaScript面试真题(2),2024年最新b站面试题目

ES6

  • 列举常用的ES6特性:

  • 箭头函数需要注意哪些地方?

  • let、const、var

  • 拓展:var方式定义的变量有什么样的bug?

  • Set数据结构

  • 拓展:数组去重的方法

  • 箭头函数this的指向。

  • 手写ES6 class继承。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

微信小程序

  • 简单描述一下微信小程序的相关文件类型?

  • 你是怎么封装微信小程序的数据请求?

  • 有哪些参数传值的方法?

  • 你使用过哪些方法,来提高微信小程序的应用速度?

  • 小程序和原生App哪个好?

  • 简述微信小程序原理?

  • 分析微信小程序的优劣势

  • 怎么解决小程序的异步请求问题?

66. ★★ jQuery 优点和缺点

// 答案:

优点

1.出色的浏览器兼容性

2、出色的DOM操作的封装,使他具备强大的选择器,可以进行快速的DOM元素操作

3、可靠的事件处理机制、jq在处理事件绑定的时候是相当的可靠

4、完善的ajax(对ajax的封装非常好,不需要考虑复杂的浏览器的兼容和XMLhttprequest对象的创建和使用)

5、支持链式操作(什么是链式操作?通过‘.’来操作)和隐士迭代

6、减少服务器的压力和带宽并且加快了加载速度(为什么这么说?原因就是:当你打开网页之前打开了其他的网页,并且该网页也用了cdn的方式来

加载相同版本的jq文件,那么,浏览器就不会加载第二次,为啥舍近求远呢,和生活中的道理一样一样的!)

7、支持丰富的插件,当然你也可以自定义插件,再加上jq的文档也很丰富,对于程序员来说,是一件非常美好的事情

缺点

1.不能向后兼容。

每一个新版本不能兼容早期的版本。举例来说,有些新版本不再支持某些selector,新版jQuery却没有保留对它们的支持,而只是简单的将其移除。这可能会影响到开发者已经编写好的代码或插件。

2.插件兼容性。

与上一点类似,当新版jQuery推出后,如果开发者想升级的话,要看插件作者是否支持。通常情况下,在最新版jQuery版本下,现有插件可能无法正常使用。开发者使用的插件越多,这种情况发生的几率也越高。我有一次为了升级到jQuery 1.3,不得不自己动手修改了一个第三方插件。

3.多个插件冲突。

在同一页面上使用多个插件时,很容易碰到冲突现象,尤其是这些插件依赖相同事件或selector时最为明显。这虽然不是jQuery自身的问题,但却又确实是一个难于调试和解决的问题。

4.jQuery的稳定性。

jQuery没有让浏览器崩溃,这里指的是其版本发布策略。jQuery 1.3版发布后仅过数天,就发布了一个漏洞修正版1.3.1。他们还移除了对某些功能的支持,可能会影响许多代码的正常运行。我希望类似修改不要再出现。

5.对动画和特效的支持差。

在大型框架中,jQuery核心代码库对动画和特效的支持相对较差。但是实际上这不是一个问题。目前在这方面有一个单独的jQuery UI项目和众多插件来弥补此点。

67. ★★★ ES6 class 关键字原理跟 function 什么区别?

// 答案:

function 可以用call apply bind 的方式 来改变他的执行上下文

但是class 却不可以 class 虽然本质上也是一个函数 但是 其内(babel)部做了一层代理 来禁止了这种行为

关于构造器constructor

在function定义的构造函数中,其prototype.constructor属性指向构造器自身

在class定义的类中,constructor其实也相当于定义在prototype属性上

重复定义

function会覆盖之前定义的方法

class会报错

原型或者类中方法的枚举

class中定义的方法不可用Object.keys(Point.prototype)枚举到

function构造器原型方法可被Object.keys(Point.prototype)枚举到,除过constructor

所有原型方法属性都可用Object.getOwnPropertyNames(Point.prototype)访问到

68. ★★★ iframe 跨域问题,页面之间怎么传值?

// 答案:

一般有两个解决方案,一个是建立一个代理页面,通过代理页面传值,

另一个方法是通过H5的postMessage方法传值,今天用的是第二种。

首先,在父页面A中建立一个iframe,其中src要写好子页面B的地址,然后在A页面中写如下方法:

var iframe = document.getElementById(“onemap”);

var msg = {loginName:‘arcgis’,loginPassword:‘Esri1234’};

var childDomain = “https://geoplat.training.com”;

iframe.contentWindow.postMessage(msg,childDomain);

记住,childDomain与A的iframe的src地址不一样,childDomain是域,而src是域中的一个页面

msg是传输的信息,可以是字符串,也可以是对象。

上面的方法一定要写在一个函数中,并通过点击事件调用,如果希望iframe开始为空,点击后在设置src,

可以在设置src之后,通过setTimeout设置一定时间后在传输信息。

在子页面B中,通过对window添加事件获取传输过来的信息:

window.addEventListener(“message”,function(obj){

var name = obj.data.loginName;

var password = obj.data.loginPassword;

login.iframeChildLogin(name,password);

},false);

这样就完成了从不同域的父页面向子页面传值的过程

69. ★★★ 简述 commonJS、AMD 和 CMD

// 答案:

CommonJS导出模块的方法是exports,导入模块的是require,具体规范如下

1)如果一个JS文件中存在exports或require,该JS文件是一个模块

2)模块内的所有代码均为隐藏代码,包括全局变量、全局函数,这些全局的内容均不应该对全局变量造成任何污染

3)如果一个模块需要暴露一些API提供给外部使用,需要通过exports导出,exports是一个空的对象,你可以为该对象添加任何需要导出的内容

4)如果一个模块需要导入其他模块,通过require实现,require是一个函数,传入模块的路径即可返回该模块导出的整个内容

【注】CommonJS只是一个规范,相当于告诉你按什么标准制造汽车,但是具体怎么制造还是得看生产商。因此,有了规范以后,nodejs就去实现模块化了

AMD

AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。

AMD 推崇依赖前置。

CMD

CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。

CMD 推崇依赖就近

70. ★★★ require.js 源码看过吗?怎么做到异步加载的

/**

  • Creates the node for the load command. Only used in browser envs.

*/

req.createNode = function (config, moduleName, url) {

var node = config.xhtml ?

document.createElementNS(‘http://www.w3.org/1999/xhtml’, ‘html:script’) :

document.createElement(‘script’);

node.type = config.scriptType || ‘text/javascript’;

node.charset = ‘utf-8’;

node.async = true;

return node;

};

requirejs 导入模块的方式实际就是创建脚本标签,一切的模块都需要经过这个方法创建。requirejs 使用 onload 事件来处理回调函数:

71. ★★ jQuery,$() 能传什么参数? html 代码怎么解析? 传 function 呢?

这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组元素。

jQuery 的核心功能都是通过这个函数实现的。

jQuery中的一切都基于这个函数,或者说都是在以某种方式使用这个函数。这个函数最基本的用法就是向它传递一个表达式(通常由 CSS 选择器组成),然后根据这个表达式来查找所有匹配的元素。

默认情况下, 如果没有指定context参数,$()将在当前的 HTML document中查找 DOM 元素;如果指定了 context 参数,如一个 DOM 元素集或 jQuery 对象,那就会在这个 context 中查找。在jQuery 1.3.2以后,其返回的元素顺序等同于在context中出现的先后顺序。

72. ★★ AMD 怎么加载文件的?

AMD 即Asynchronous Module Definition,中文名是异步模块定义的意思。它是一个在浏览器端模块化开发的规范

由于不是JavaScript原生支持,使用AMD规范进行页面开发需要用到对应的库函数,也就是大名鼎鼎RequireJS,实际上AMD 是 RequireJS 在推广过程中对模块定义的规范化的产出

requireJS主要解决两个问题

多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器

js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长

看一个使用requireJS的例子

// 定义模块 myModule.js

define([‘dependency’], function(){

var name = ‘Byron’;

function printName(){

console.log(name);

}

return {

printName: printName

};

});

// 加载模块

require([‘myModule’], function (my){

my.printName();

});

语法

requireJS定义了一个函数 define,它是全局变量,用来定义模块

define(id?, dependencies?, factory);

id:可选参数,用来定义模块的标识,如果没有提供该参数,脚本文件名(去掉拓展名)

dependencies:是一个当前模块依赖的模块名称数组

factory:工厂方法,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值

在页面上使用require函数加载模块

require([dependencies], function(){});

require()函数接受两个参数

第一个参数是一个数组,表示所依赖的模块

第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块

require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。

73. ★★ jQuery 怎么找到事件源元素

$(“.btn”).click(function(e){

// e 就是事件对象

e.target; // 事件的目标 dom

e.currentTarget; // 事件处理程序正在处理事件的那个元素

e.srcElement; // 事件的目标 ie

});

74. ★★★★ 模板引擎原理

模板引擎是通过字符串拼接得到的

let template = ‘hello <% name %>!’

let template = 'hello ’ + name + ‘!’

字符串是通过new Function执行的

let name = ‘world’

let template = `

let str = 'hello ’ + name + ‘!’

return str

`

let fn = new Function(‘name’, template)

console.log(fn(name)) // hello world!

将模板转换为字符串并通过函数执行返回

let template = ‘hello <% name %>!’

let name = ‘world’

function compile (template) {

let html = template.replace(/<%([\s\S]+?)%>/g, (match, code) => {

return ' + ${code} + '

})

html = let str = '${html}'; return str

return new Function(‘name’, html)

}

let str = compile(template)

console.log(str(name)) // hello world!

函数只能接收一个name变量作为参数,功能太单一了,一般会通过对象来传参,with来减少变量访问。

with功能

let params = {

name: ‘张三’,

age: 18

}

let str = ‘’

with (params) {

str = 用户${name}的年龄是${age}岁

}

console.log(str) // 用户张三的年龄是18岁

实现简单的模板引擎

let template = ‘hello <% name %>!’

let name = ‘world’

function compile (template) {

let html = template.replace(/<%([\s\S]+?)%>/g, (match, code) => {

return ' + ${code.trim()} + '

})

html = '${html}'

html = let str = ''; with (params) { str = ${html}; } return str

return new Function(‘params’, html)

}

let str = compile(template)

console.log(str({ name })) // hello world!

75. ★★ map 和 foreach 的区别

forEach()方法不会返回执行结果,而是undefined。也就是说,forEach()会修改原来的数组。

map()方法会得到一个新的数组并返回。

76. ★★★★ ES6 的新特性

  1. const与let

  2. 模板字符串

  3. 解构赋值

  4. 对象简写法

  5. for…of循环

  6. 展开运算符

  7. 剩余参数(可变参数)

  8. ES6箭头函数

  9. 参数默认值

10.类和继承

11.模块化规范

77. ★★ 2018/01/01 转换成 2018年/1月/1日

function fun(str){

var date = new Date(str)

return date.getFullYear()+‘年/’+date.getMonth()+‘月/’+date.getDate()+‘日’

}

78. ★★★ 0.1+0.2 等不等于 0.3?自己封装一个让他们相等的方法

在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!==0.3,这是为什么呢?这个问题也会偶尔被用来当做面试题来考查面试者对JavaScript的数值的理解程度。

在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果为false。

方法1:设置一个误差范围值,通常称为”机器精度“,而对于Javascript来说,这个值通常是2-52,而在ES6中,已经为我们提供了这样一个属性:Number.EPSILON,而这个值正等于2-52。这个值非常非常小,在底层计算机已经帮我们运算好,并且无限接近0,但不等于0,。这个时候我们只要判断(0.1+0.2)-0.3小于Number.EPSILON,在这个误差的范围内就可以判定0.1+0.2===0.3为true。

function numbersequal(a,b){

return Math.abs(a-b)<Number.EPSILON;

}

方法2:转为整数运算

79. ★★★ 跨域是什么?有哪些解决跨域的方法和方案?

什么是跨域?

所谓的同源是指,域名、协议、端口均为相同。

所谓的跨域,不同的域名、协议、端口皆为不同域

一个域与另一个域名、协议或者端口不同的域的之间访问都叫跨域

解决跨域的方法和方案:

1:通过服务端代理请求。如PHP,服务端语言php是没有跨域限制的,让服务器去别的网站获取内容然后返回给页面。

2:第二种:jsonp跨域

  1. jsonp跨域就是利用script标签的跨域能力请求资源

  2. jsonp与ajax没有半毛钱关系!!

  3. 浏览器的同源策略限制了js的跨域能力,但没有限制link img iframe script 的跨域行为

实现方式:

  1. 利用js创建一个script标签,把json的url赋给script的scr属性,

  2. 把这个script插入到页面里,让浏览器去跨域获取资源

  3. JS先声明好回调函数,插入页面后会代为执行该函数,并且传入json对象为其参数。

注意:

  1. jsonp只针对get请求

  2. script标签加载回来的资源会被当成js在全局执行

3:CORS 跨域资源共享(xhr2)

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制

整个CORS通信过程,都是浏览器自动完成,不需要用户参与

对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样

实现CORS通信的关键是服务器,只要服务器实现了CORS接口,就可以跨源通信

4:nginx代理跨域

通过nginx服务器转发跨域请求,达到跨域的目的

80. ★★★ 什么是函数式编程?什么的声明式编程?

函数式编程:

函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。

函数式编程最重要的特点是“函数第一位”,即函数可以出现在任何地方,比如你可以把函数作为参数传递给另一个函数,不仅如此你还可以将函数作为返回值。

声明式编程:

声明式编程是以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该做什么,但不指定具体要怎么做。

SQL 语句就是最明显的一种声明式编程的例子,例如:

SELECT * FROM collection WHERE num > 5

除了 SQL,网页编程中用到的 HTML 和 CSS 也都属于声明式编程。

特点:

1:是它不需要创建变量用来存储数据。

2:不包含循环控制的代码如 for, while。

81. ★★★ super() 是否必须执行?不执行怎么让它不报错?

非必须,

在 JavaScript 中,super 指的是父类的构造函数

如果想在构造函数中使用this,你必须首先调用super。 先让父类做完自己的事

不执行无法使用this,

不报错的方法:

1:不使用this

2:手动修正this

82. ★★★ eventloop 渲染在哪一步?

任务队列

所有的任务可以分为同步任务和异步任务,同步任务,顾名思义,就是立即执行的任务,同步任务一般会直接进入到主线程中执行;而异步任务,就是异步执行的任务,比如ajax网络请求,setTimeout 定时函数等都属于异步任务,异步任务会通过任务队列( Event Queue )的机制来进行协调。

同步和异步任务分别进入不同的执行环境,同步的进入主线程,即主执行栈,异步的进入 Event Queue 。主线程内的任务执行完毕为空,会去 Event Queue 读取对应的任务,推入主线程执行。 上述过程的不断重复就是我们说的 Event Loop (事件循环)。

在事件循环中,每进行一次循环操作称为tick,通过阅读规范可知,每一次 tick 的任务处理模型是比较复杂的,其关键的步骤可以总结如下:

在此次 tick 中选择最先进入队列的任务( oldest task ),如果有则执行(一次)

检查是否存在 Microtasks ,如果存在则不停地执行,直至清空Microtask Queue

更新 render

主线程重复执行上述步骤

那么,什么是 microtasks ?规范中规定,task分为两大类, 分别是 Macro Task (宏任务)和 Micro Task(微任务), 并且每个宏任务结束后, 都要清空所有的微任务,这里的 Macro Task也是我们常说的 task 。

(macro)task 主要包含:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)

microtask主要包含:Promise、MutaionObserver、process.nextTick(Node.js 环境)

整体 script 作为第一个宏任务进入主线程,遇到 console.log,输出 script start

遇到 setTimeout,其回调函数被分发到宏任务 Event Queue 中

遇到 Promise,其 then函数被分到到微任务 Event Queue 中,记为 then1,之后又遇到了 then 函数,将其分到微任务 Event Queue 中,记为 then2

遇到 console.log,输出 script end

至此,Event Queue 中存在三个任务,如下表:

宏任务 微任务

setTimeout then1

  • then2

执行微任务,首先执行then1,输出 promise1, 然后执行 then2,输出 promise2,这样就清空了所有微任务

此时,所有的mircotask执行完毕,本轮事件循环结束,UI 开始 render,当 UI render 完毕,开始下一轮事件循环.

执行 setTimeout 任务,输出 setTimeout, 至此,输出的顺序是:script start, script end, promise1, promise2, setTimeout

UI渲染

根据HTML Standard,一轮事件循环执行结束之后,下轮事件循环执行之前开始进行 UI render。即:macro-task任务执行完毕,接着执行完所有的micro-task任务后,

此时本轮循环结束,开始执行UI render。UI render完毕之后接着下一轮循环。

83. ★★★★ 图片懒加载怎么实现?

原理:随着滚轮滚动,底部的图片会被不断地加载,从而显示在页面上,按需加载,当页面需要显示图片的时候才进行加载,否则不加载

  1. 页面加载完成时记录每个img标签的src值的字符串,

  2. 用鼠标滚轮判断图片是否出现在屏幕,如果是,则把记录的src值赋值给src属性

  3. 然后让image的src来发起请求,获取对应的图片放置到DOM树的这个位置上,从而实现图片的页面渲染!

于是就可以知道,当进入页面的时候,其实我们已经把所有的图片的这个地址信息拿到了,图片懒加载的作用就是让这个图片的src按需发起请求,获取图片。

84. ★★ for-in 循环会遍历出原型上的属性吗?怎么避免遍历到原型上的属性

使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问

只遍历对象自身的属性,而不遍历继承于原型链上的属性,需要使用hasOwnProperty 方法过滤一下。

Object.prototype.say=“cgl”;

var person ={

age: 18

};

for (var key in person) {

if(person.hasOwnProperty(key)){

console.log(key, eval(“person.”+key));

}

}

85. ★★★ 简述call、apply、bind,call 和 apply哪个性能更好?

1、call()

call() 方法调用一个函数, 其具有一个指定的 this值和分别地提供的参数(参数的列表)。 第一个参数:在 fun 函数运行时指定的 this 值;如果指定了 null 或者 undefined 则内部 this 指向 window,后面的参数:指定的参数列表

var fn = function(arg1, arg2) {

};

fn.call(this, arg1, arg2);

var numbers = [5, 458 , 120 , -215 ];

var maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //获取数组中的最大值458

2、apply()

apply()方法调用一个函数, 其具有一个指定的 this 值,以及作为一个数组(或类似数组的对象)提供的参数。apply() 与 call() 非常相似,不同之处在于提供参数的方式。apply() 使用参数数组而不是一组参数列表。

var fn = function(arg1, arg2) {

};

fn.apply(this, [arg1, arg2])

var numbers = [5, 458 , 120 , -215 ];

//umber 本身没有 max 方法,但是 Math 有,我们就可以借助 call 或者 apply 使用其方法。

var maxInNumbers = Math.max.apply(Math, numbers), //获取数组中的最大值458

3、bind()

bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的call属性)。

当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。

一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

/* ------call 和 apply哪个性能更好?------ */

call的性能要比apply好一些,尤其是传递给函数的参数超过3个时所以后期开发的时候,可以使用call多一些

(传参数3个以内的话,call和apply性能差不多,超过3个以上call更好一些)

86. ★★ ES6 箭头函数和普通函数有什么差异?

  1. 相比普通函数更简洁的语法

  2. 没有this,捕获其所在上下文的 this 值,作为自己的 this 值

  3. 不能使用new,箭头函数作为匿名函数,是不能作为构造函数的,不能使用new

  4. 不绑定arguments,用rest参数…解决

let test3=(…a)=>{console.log(a[1])} //22

  1. 使用call()和apply()调用:由于 this 已经在词法层面完成了绑定,通过 call() 或 apply() 方法调用一个函数时,只是传入了参数而已,对 this 并没有什么影响:

  2. 箭头函数没有原型属性

  3. 不能简单返回对象字面量

let fun5 = ()=>({ foo: x }) //如果x => { foo: x } //则语法出错

  1. 箭头函数不能当做Generator函数,不能使用yield关键字

  2. 箭头函数不能换行

let a = ()

=>1; //SyntaxError: Unexpected token =>

87. ★★★ Promise 避免回调地狱的语法糖–实现链式调用的核心点是什么?

解决回调地狱的终极方法 async/await ES7的语法,可以通过 async/await让代码看起来像同步的

async异步 await等待

await 等待 就是当后面跟的是promise对象,就让他停止 ,先让里面的异步事情做完,在把结果返回给前面的新变量,在继续向后执行

他只生效当前作用域内部,也就是async函数内部。

实现链式调用的核心点:

在 then 中新创建的 Promise,它的状态变为 fulfilled 的节点是在上一个 Promise的回调执行完毕的时候。也就是说当一个 Promise 的状态被 fulfilled 之后,会执行其回调函数,而回调函数返回的结果会被当作 value,返回给下一个 Promise(也就是then 中产生的 Promise),同时下一个 Promise的状态也会被改变(执行 resolve 或 reject),然后再去执行其回调,以此类推下去…

88. ★★★ 进程线程区别是什么?

什么是进程?什么是线程?

进程是系统中正在运行的一个程序,程序一旦运行就是进程。

进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。线程与进程的一个主要区别是,统一进程内的一个主要区别是,同一进程内的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时,每个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。

线程是进程的一个实体,是进程的一条执行路径。

线程是进程的一个特定执行路径。当一个线程修改了进程的资源,它的兄弟线程可以立即看到这种变化。

进程和线程的区别体现在以下几个方面:

1.地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程内不可见。

2.通信:进程间通信IPC(管道,信号量,共享内存,消息队列),线程间可以直接独写进程数据段(如全局变量)来进程通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

3.调度和切换:线程上下文切换比进程上下文切换快得多。

4.在多线程OS中,进程不是一个可执行的实体。

89. ★★★ 禁止事件冒泡,禁止默认事件

/-----禁止事件冒泡:-----/

function stopBubble(e) {

//如果提供了事件对象,则这是一个非IE浏览器

if ( e && e.stopPropagation )

//因此它支持W3C的stopPropagation()方法

e.stopPropagation();

else

//否则,我们需要使用IE的方式来取消事件冒泡

window.event.cancelBubble = true;

}

/-----阻止浏览器的默认行为-----/

function stopDefault( e ) {

//阻止默认浏览器动作(W3C)

if ( e && e.preventDefault )

e.preventDefault();

//IE中阻止函数器默认动作的方式

else

window.event.returnValue = false;

return false;

}

Vue 面试题

1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?

算法

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  1. 冒泡排序
  2. 选择排序
  3. 快速排序
  4. 二叉树查找: 最大值、最小值、固定值
  5. 二叉树遍历
  6. 二叉树的最大深度
  7. 给予链表中的任一节点,把它删除掉
  8. 链表倒叙
  9. 如何判断一个单链表有环
  10. 给定一个有序数组,找出两个数相加为一个目标数

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666

/-----阻止浏览器的默认行为-----/

function stopDefault( e ) {

//阻止默认浏览器动作(W3C)

if ( e && e.preventDefault )

e.preventDefault();

//IE中阻止函数器默认动作的方式

else

window.event.returnValue = false;

return false;

}

Vue 面试题

1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?

[外链图片转存中…(img-N3RQzjhg-1715370308141)]

算法

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  1. 冒泡排序
  2. 选择排序
  3. 快速排序
  4. 二叉树查找: 最大值、最小值、固定值
  5. 二叉树遍历
  6. 二叉树的最大深度
  7. 给予链表中的任一节点,把它删除掉
  8. 链表倒叙
  9. 如何判断一个单链表有环
  10. 给定一个有序数组,找出两个数相加为一个目标数

    [外链图片转存中…(img-Mcr1DhsT-1715370308142)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值