首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。
1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址.
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
3. 数据类型判断
- typeof
typeof 基本可以正常判断基本数据类型,没法正确识别 Null,可以区分function,但是对于其他引用数据类型会返回 Object,这是因为 typeof 的原理:
-
所有数据类型在计算机中存储的都是按照“二进制”存储
-
Null -> 000000
-
对象都以 000 开头
-
typeof 检测的时候,是按照计算机存储的二进制来检测的
typeof null // “object”
typeof function(){} // “function”
typeof [] // “object”
typeof /./ // “object”
- instanceof
原理:根据原型对象来判断类型
function instanceof(left, right) {
const rightVal = right.prototype
const leftVal = left.proto
// 若找不到就到一直循环到父类型或祖类型
while(true) {
if (leftVal === null) {
return false
}
if (leftVal === rightVal) {
return true
}
leftVal = leftVal.proto // 获取祖类型的__proto__
}
}
首先需要了解JS的作用域链,内部可以访问外部的变量,但是外部却不可以访问内部的变量,所以当我们有需求访问函数内部的变量时,我们就需要利用闭包去访问。
因此可以明确闭包的四个特性:
-
闭包一定是函数对象
-
闭包和词法作用域,作用域链,垃圾回收机制息息相关
-
当函数一定是在其定义的作用域外进行的访问时,才产生闭包
-
闭包是由该函数和其上层执行上下文共同构成
我们可以通过最简单的闭包例子来分析
function foo() {
let a = 2;
function bar() {
console.log( a );
}
return bar;
}
console.log(a) // Uncaught ReferenceError: a is not defined
let baz = foo();
baz(); // 2
但是滥用闭包同样会造成弊端
- 内存泄漏(Memory Leak)
闭包阻止了垃圾回收机制对变量进行回收,因此变量会永远存在内存中,即使当变量不再被使用时,这样会造成内存泄漏,会严重影响页面的性能。因此当变量对象不再适用时,我们要将其主动释放,尤其是涉及 DOM 的操作时。
function foo() {
let a = 2;
function bar() {
console.log( a );
}
return bar;
}
let baz = foo();
baz(); //baz指向的对象会永远存在堆内存中
baz = null; //如果baz不再使用,将其指向的对象释放
- this指向不明
var object = {
name: ‘object’,
getName: function() {
return function() {
console.log(this.name)
}
}
}
object.getName()() // underfined
事件流分为3个阶段:
1 - 5 为捕获阶段
5 - 6 为目标阶段
6 - 10 为冒泡阶段
优点:
-
节省内存
-
新增对象无需再次绑定
实现方法: 通过给父元素增加监听器获取target,便可拿到子元素的标签名和class,id等属性,从而进行操作
例:
window.onload = function(){
var oUl = document.getElementById(‘ul1’)
oUl.onmouseover = function(ev){
var ev = ev || window.event
var oLi = ev.srcElemnt || ev.target
oLi.style.background = ‘red’
}
}
其中,
IE中event对象有srcElement,无target,有window.event,无ev;
Firefox中event对象无srcElement,有target,无window.event,有ev;
/**
-
@desc 节流
-
@param {number} delay 延迟时间
-
@param {func} cb 回调
*/
export function throttle(delay,cb){
let timeoutID;
let lastExec = 0;
function wrapper() {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
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 替我们做了哪些工作?
…
算法
- 冒泡排序
- 选择排序
- 快速排序
- 二叉树查找: 最大值、最小值、固定值
- 二叉树遍历
- 二叉树的最大深度
- 给予链表中的任一节点,把它删除掉
- 链表倒叙
- 如何判断一个单链表有环
- 给定一个有序数组,找出两个数相加为一个目标数
…
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
深度
7. 给予链表中的任一节点,把它删除掉
8. 链表倒叙
9. 如何判断一个单链表有环
10. 给定一个有序数组,找出两个数相加为一个目标数
…
[外链图片转存中…(img-0IAYIQTi-1712912446243)]
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-wVYS9Uns-1712912446244)]