【手撕面试题】JavaScript(高频知识点一)

news/2024/11/1 18:36:31/

目录

面试官:请你简述 var、let、const 三者之间的区别?

面试官:请你谈谈对深拷贝与浅拷贝的理解

面试官:输入URL的那一瞬间浏览器做了什么?

面试官:说一说cookie sessionStorage localStorage 区别?

面试官:说一说JS数据类型有哪些,区别是什么?

面试官:说一说你对闭包的理解?

面试官:说一说JavaScript有几种方法判断变量的类型?

面试官:说一说null 和 undefined 的区别,如何让一个属性变为null

面试官:说一下有什么方法可以保持前后端实时通信?

面试官:说一说伪数组和数组的区别?


        每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。

面试官:请你简述 var、let、const 三者之间的区别?

我:呃~,好的,三者的作用区别总结如下:

var:最常用的变量;允许重复声明,但会导致数据被覆盖;会产生变量提升;局部变量挂载到全局对象上,会造成全局对象的污染。

console.log(a) // 因变量提升, var a;提到前面但是没有赋值,所以值为undefined
var a = 1
var a = '你好' // var声明的变量会被重新赋值
console.log(a) // a会打印被重新赋值的值
console.log(window.a) // var声明的局部变量会被挂载到全局变量上,造成全局变量的污染。

let:es6新增命令,用法类似var;不允许重复声明;不存在变量提升;常作用于块级作用域而避免局部变量造成全局变量的污染。

let a=10;
console.log(a) // 不存在变量提升,所以值为:10
console.log(window.a) // 不会造成全局污染,所以值为 undefined
for(let i =0;i<3;i++){ // 会生成块级作用域,i 的值只能在块级作用域中使用console.log(i)
}
console.log(i) // 因为拿不到块级作用域中的值,所以报错。

const:es6新增命令,用于声明常量且值无法被修改;声明常量必须立刻初始化,否则后期赋值报错;不能重复声明;const指向变量的地址, 只要变量名所引用的地址不变就不会报错

const arr = ['小张','小王','小李','小赵']
arr[0]='小明'
console.log(arr) // ['小明', '小王', '小李', '小赵']
const arr = [] // 报错

面试官:请你谈谈对深拷贝与浅拷贝的理解

我:呃~,好的,对两者的理解总结如下:

深拷贝:新数据与原数据互不打扰。

// 扩展运算符在一维数组中是属于深拷贝,在多维数组中属于浅拷贝
let arr = [1,2,3]
let newArr = [...arr]
newArr.push(4)
console.log(arr,newArr) // [1, 2, 3],[1, 2, 3, 4]// 深拷贝用法
let list = [{id:1,name:'张三',age:18},{id:2,name:'李四',age:28},{id:3,name:'王五',age:38},
]
let newList = JSON.parse(JSON.stringify(list))
newList.pop()
console.log(list.length,newList.length) // 3 2

当然,深拷贝也有一种标准写法,如下:

// 标准的深拷贝 => 引用数据类型(数组,对象)
function deepClone(source){const targetObj = source.constructor === Array ? [] : {}for(let keys in source){if(source.hasOwnProperty(keys)){// 引用数据类型if(source[keys] && typeof source[keys] === 'object'){targetObj[keys] = source[keys].constructor === Array ? [] : {}// 递归targetObj[keys] = deepClone(source[keys])}else{// 基本数据类型,直接赋值targetObj[keys] = source[keys]}}}return targetObj
}let obj = {name:'张三',age:18,hobby:['抽烟','喝酒','烫头'],action:{am:'敲代码',pm:'睡觉'}
}
let newObj = deepClone(obj)
newObj.name = '李四'
console.log(obj.name,newObj.name)// 张三 李四

浅拷贝:新数据会影响原数据。

let arr = [1,2,3]
let newArr = arr
// 对新数据做出改变,原数据也会发生改变,这种就叫做浅拷贝
newArr.push(4) // [1, 2, 3, 4]
console.log(arr,newArr) // [1, 2, 3, 4]

说白了,深拷贝是重新获得一个新的数据,且和原来的数据没有任何关系;浅拷贝虽然能得到一个新的数据,但是和原来的数据仍有一定的联系。

面试官:输入URL的那一瞬间浏览器做了什么?

我:呃~,URL是由以下几部分组成

https: 传输协议(http和tcp之间加了一层 TSL 或者 SSL 的安全层)

www:服务器

baidu.com:域名

DNS域名系统会匹配真实的IP,第一次访问正常,第二次访问会将域名解析的IP存在本地用来读取浏览器缓存。

输入URL的那一刻经历了:域名 -> DNS域名系统 -> 拿到真实IP -> 建立连接(TCP的三次握手) -> 拿数据,渲染页面 -> 四次挥手

具体实现过程

1. url解析:判断是搜索内容还是请求URL

2. 查找本地缓存:如果有缓存直接返回给页面,没有缓存则进入网络请求阶段

3. DNS解析

4. 通过三次握手建立TCP连接

5. 合成请求头信息,发送http请求

6. 处理响应信息

7. 通过四次挥手断开TCP连接

8. 如果响应状态码301,则重定向

9. 浏览器进行页面渲染:1)解析html,生成DOM树;2)根据css计算节点样式,生成stylesheet;3)生成布局树;4)为特定的元素生成独立图层

面试官:说一说cookie sessionStorage localStorage 区别?

我:呃~,好的,他们之间的关系如下:

相同点

都是浏览器存储,都存储在浏览器本地。

区别

1.cookie由服务器或前端写入, sessionStorage以及localStorage都是由前端写入

2.cookie的生命周期由服务器端写入时就设置好的,localStorage是写入就一直存在,除非手动清除,sessionStorage是由页面关闭时自动清除

3.cookie存储空间大小约4kb, sessionStorage及localStorage空间比较大,大约5M

4.3者的数据共享都遵循同源原则,sessionStorage还限制必须是同一个页面

5.前端给后端发送请求时,自动携带cookie, session 及 local都不携带

6.cookie一般存储登录验证信息或者token,localStorage常用于存储不易变动的数据,减轻服务器压力,sessionStorage可以用来监测用户是否是刷新进入页面,如音乐播放器恢复进度条功能

面试官:说一说JS数据类型有哪些,区别是什么?

我:呃~,JS数据类型分为两类:一类是基本数据类型,另一类是引用数据类型,如下:

基本类型:string、number、boolean、null、undefined、symbol、bigInt

引用类型: object、array

基本类型存储在栈中,空间小,操作频繁

引用类型存储在堆中,空间大,在栈中存储了指针,指向在堆中的起始地址

注意:Symbol具有唯一性, 不可枚举 使用getOwnPropertySymbols获取

面试官:说一说你对闭包的理解?

我:呃~,内层函数引用外层函数中变量,这些变量的集合就是闭包。

形成的原理:作用域链,当前作用域可以访问上级作用域中的变量。

解决的问题:能够让函数作用域中的变量在函数执行结束之后不被销毁,同时也能在函数外部可以访问函数内部的局部变量。

带来的问题:由于垃圾回收器不会将闭包中变量销毁,于是就造成了内存泄露,内存泄露积累多了就容易导致内存溢出。

闭包的应用,能够模仿块级作用域,能够实现柯里化,在构造函数中定义特权方法、Vue中数据响应式Observer中使用闭包等。

面试官:说一说JavaScript有几种方法判断变量的类型?

我:呃~,好的,总结如下:

1. typeof(根据二进制判断),不能判断数据类型:null和object

2. intanceof(根据原型链判断),原生数据类型不能判断

3. constructor.name(根据构造器判断),不能判断null数据类型

4. Object.prototype.toString.call()(用Object的toString方法判断)所有类型数据都能判断,记住判断结果打印为:'[object Xxx]'

面试官:说一说null 和 undefined 的区别,如何让一个属性变为null

我:呃~,null 是定义 并赋值null undefined是定义未赋值。

面试官:说一下有什么方法可以保持前后端实时通信?

我:呃~,轮询、长轮询、 iframe流、WebSocket、SSE。

面试官:说一说伪数组和数组的区别?

我:呃~,好的,总结如下:

伪数组的特点:类型是object、不能使用数组方法、可以获取长度、可以使用for in遍历

伪数组可以转换为数组的方法:Array.prototype.slice.call()、Array.from()、[...伪数组]

哪些是伪数组:函数的参数arguments,Map和Set的keys()、values()和entires()


http://www.ppmy.cn/news/24615.html

相关文章

Docker安全

一、Docker 容器与虚拟机的区别1、隔离与共享• 虚拟机通过添加 Hypervisor 层&#xff0c;虚拟出网卡、内存、CPU 等虚拟硬件&#xff0c;再在其上建立虚拟机&#xff0c;每个虚拟机都有自己的系统内核• Docker容器则是通过隔离的方式&#xff0c;将文件系统、进程、设备、网…

【王道数据结构】第八章 | 排序

目录 8.1. 排序的基本概念 8.2. 插入排序 8.2.1. 直接插入排序 8.2.2. 折半插入排序 8.2.3. 希尔排序 8.3. 交换排序 8.3.1. 冒泡排序 8.3.2. 快速排序 8.4. 选择排序 8.4.1. 简单选择排序 8.4.2. 堆排序 8.5. 归并排序和基数排序 8.5.2. 基数排序 8.1. 排序的基本概念 排…

【云原生-Docker】docker镜像制作、上传、dockerfile命令解析

场景 在实际业务场景中&#xff0c;需要制作多个不同版本进行镜像使用&#xff0c;如maven版本、JDK、openJDK不同使用等&#xff0c;所以需要做多个针对不同版本做不同的镜像。这里记录一下之前devops用的openJDK版本、某些部门需要用orcle JDK、特此需要做不同的镜像&#x…

Android java创建子线程的几种方法

1.新建一个类继承自Thread&#xff0c;并重写run()方法&#xff0c;并在里面编写耗时逻辑。 1 2 3 4 5 6 7 class ThreadTest extends Thread { Override public void run() { //具体的耗时逻辑代码 } } new ThreadTest().st…

2023前端面试总结含参考答案

文章目录1. 父子组件生命周期的执行顺序:2. 原型链&#xff1a;3. promise的理解&#xff1a;4. 数组循环&#xff0c;foreach&#xff0c;filter&#xff0c;map&#xff0c;reduce5. 数组去重&#xff0c;set6. 组件通信方式7. 路由钩子8. 首页首屏加载优化&#xff1a;9. th…

一篇文章带你学会Ansible的安装及部署

目录 前言 一、什么是Ansible 二、Ansible的工作方式 三、Ansible的安装 四、构建Anisble清单 1、清单书写方式 2、清单查看 3、清单书写规则 4、主机规格的范围化操作 五、ansible命令指定清单的正则表达式 六、 Ansible配置文件参数详解 1、配置文件的分类与优先…

Linux基础笔记总结

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

「1」线性代数(期末复习)

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 第一章 行列式 行列式是一个数&#xff0c;是一个结果三阶行列式的计算&#xff1a;主对角线的乘…