前端基础面试题·第三篇——JavaScript(其二)

news/2024/9/17 3:24:19/ 标签: javascript, 面试

1.深浅拷贝

1.浅拷贝
浅拷贝会创建一个新的对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝就是改引用类型的地址。

    // 常见的浅拷贝1.Object.assign({},obj) //对象浅拷贝assign⽅法可以⽤于处理数组,不过会把数组视为对象,⽐如这⾥会把⽬标数组视为是属性为012的对象,所以源数组的01属性的值覆盖了⽬标对象的值。2.Array.concat({}) // 数组浅拷贝3.Array.slice() // 数组浅拷贝4.扩展运算符

2.深拷贝
深拷贝会创建一个新的对象,这个对象有着原始对象属性值的一份完整拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,就会将引用数据类型复制一份存到内存中,将其地址值赋值给新对象。

    // 常见的深拷贝1.JSON.parse(JSON.stringfy(obj)) // 对象深拷贝2.递归拷贝3.loadsh第三方库

2.freeze属性

Object.freeze()方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,并且返回当前对象。
这⾥是关于属性的四个基本类型

  1. [[Configurable]] :表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认为 true 。
  2. [[Enumerable]] :
    表示属性是否可以通过for-in循环返回。默认为 true 。
  3. [[Writable]] :
    表示属性的值是否可以被修改。默认为 true 。
  4. [[Value]] :
    表示属性实际的值。默认为 undefined 。
    当我们显式的添加⼀个属性之后,它的值就会被设置到 [[Value]] 中,⽽ [[Writable]]表示我们能否读这个值进⾏修
    改,如果设置为 false ,那么当我们修改这个值的时候回就会报错,同理其他的属性也是⼀样的。⽽如果我们要修
    改属性的类型的值的时候 ,是使⽤ Object.defineProperty()⽅法 来进⾏修改的。

freeze作用:

  • 设置 Object.preventExtension(),禁⽌添加新属性 ( 绝对存在 )
  • 设置 Writable 为 false,禁⽌修改 ( 绝对存在 )
  • 设置 Configurable 为 false,禁⽌配置 ( 绝对存在 )
  • 禁⽌更改访问器属性 ( getter 和 setter )

3.函数

1.函数声明
函数声明:function 函数名(){}
函数表达式:var 函数名 = function(){}
箭头函数: 函数名 = () => {}
2. 3种声明函数的区别

  1. 函数声明:函数声明会提升,在代码执行前被提前加载。
  2. 函数表达式:函数表达式不会提升,只有在代码执行到它的时候才会被加载。
  3. 箭头函数:箭头函数不会提升,在代码执行到它的时候才会被加载。

匿名函数
匿名函数:没有名字的函数,只能通过变量来调用。没有被显示进⾏赋值操作的函数。 使⽤场景——多作为⼀个参数传⼊另⼀个函数中
函数⾃执⾏,其实是匿名函数的⼀种应⽤
回调函数
回调函数:⼀个函数作为参数传⼊到另一个函数中,这个函数就是回调函数。使⽤场景——多作为⼀个参数传⼊另⼀个函数中
高阶函数
高阶函数:⼀个函数 接收另⼀个函数作为参数或返回另⼀个函数

特征
函数是第⼀等公⺠
所谓"第⼀等公⺠"(first class),是函数与其他数据类型⼀样,处于平等地位,可以赋值给其他变量,也可以作为
参数,传⼊另⼀个函数,或者作为别的函数的返回值
只⽤"表达式",不⽤"语句"
“表达式”(expression)是⼀个单纯的运算过程,总是有返回值;“语句”(statement)是执⾏某种操作,没有返
回值。函数式编程要求,只使⽤表达式,不使⽤语句。每⼀步都是单纯的运算,都有返回值
函数式编程期望⼀个函数有输⼊,也有输出
纯函数
即:只要是同样的参数传⼊,返回的结果⼀定是相等的

4.函数柯里化

函数柯里化:
这里有一个函数(假设叫做addCurry),接收函数A作为参数,运⾏后返回⼀个新的函数。并且这个新的函数能够处理函数A的剩余参数

    let addCurry = curry1((a, b) => a + b);console.log(addCurry()(11)(1));function curry1(fn) {let judge = (...args) => {if (args.length === fn.length) {return fn.call(this, ...args);}//获取偏函数,返回包装器,重新组装参数并传⼊return (...arg) => judge(...arg, ...args)}return judge;}

5.函数的length

length属性返回函数接收的参数个数,不包括rest参数。 这里不包括在参数定义位置赋了默认值的形参,同时也不包括剩余参数。

  1. 形参个数
    来看看下⾯这个例⼦
function fn1 () {}
function fn2 (name) {}
function fn3 (name, age) {}
console.log(fn1.length) // 0
console.log(fn2.length) // 1
console.log(fn3.length) // 2

可以看出,function有多少个形参,length就是多少。但是事实真是这样吗?继续往下看
2. 默认参数
如果有默认参数的话,函数的length会是多少呢?

function fn1 (name) {}
function fn2 (name = '林三⼼') {}
function fn3 (name, age = 22) {}
function fn4 (name, aaa, age = 22, gender) {}
function fn5(name = '林三⼼', age, gender, aaa) {}
console.log(fn1.length) // 1
console.log(fn2.length) // 0
console.log(fn3.length) // 1
console.log(fn4.length) // 2
console.log(fn5.length) // 0

上⾯可以看出,function的length,就是第⼀个具有默认值之前的参数个数
3. 剩余参数
在函数的形参中,还有剩余参数这个东⻄,那如果具有剩余参数,会是怎么算呢?

function fn1(name, ...args) {}
console.log(fn1.length) // 1

6.普通函数与箭头函数的区别

  1. 普通函数在ES6之前就有,箭头函数是在ES6中1引入
  2. 普通函数中存在this关键字,箭头函数中不存在
  3. 普通函数中存在arguments对象,箭头函数中不存在
  4. 普通函数存在原型,箭头函数不存在
  5. 由于普通函数存在原型,因此可以作为构造函数使用,箭头函数不行
  6. 普通函数存在原型链,箭头函数不存在原型链
  7. 普通函数可以定义为生成器函数,又yield关键字,箭头函数不行

7.构造函数

1.构造函数
在js中,通过一个new 关键字来创建对象的函数称为构造函数,也就是初始化一个实例对象,构造函数的命名一般都是首字母大写

构造函数创建对象的过程即本文上面提到的new关键字创建对象的过程

2.构造函数的返回值
构造函数中,一般不允许自己写返回值,当在函数中返回一个基本数据类型时,返回值无效,并不会返回给外面接收变量,但当返回一个引用数据类型时,这个引用数据类型将会覆盖本次创建的对象,从而会导致构造函数没有效果,因此不建议在构造函数中返回值

8.执行上下文

在js代码运行时,会产生三种执行上下文,分别是全局上下文,函数上下文和eval上下文,每种执行上下文都有三个重要属性:变量对象,作用域链,this
1.全局上下文
全局上下文在js代码执行之前就已经存在了,当js代码开始执行时,会首先进入全局上下文,全局上下文中包含有全局对象和this,在全局上下文中,作用域为全局作用于,this指向全局对象(在浏览器端指向window)
2.函数上下文
当函数被调用时,会创建函数上下文,函数上下文包含有变量对象,作用域链,this,函数上下文中的this指向调用函数的对象,如果没有对象调用函数,那么this指向全局对象(在浏览器端指向window)
3.eval上下文
eval函数执行时,会创建eval上下文,eval上下文包含有变量对象,作用域链,this,eval上下文中的this指向全局对象(在浏览器端指向window)

9.闭包

简单来说,闭包就是在一个函数中返回另一个函数,而返回的函数使用到了原函数中定义的变量,这样导致原函数执行完之后会残留一个变量被返回函数一直引用,无法被垃圾回收机制回收,同时在原函数外部根本除了返回函数外无法被其他方式访问到,因此就形成了闭包
闭包 = 函数 + 函数能够访问的⾃由变量。
本质上,闭包就是一个定义在上级作用域中的变量,在下级作用域中引用到了这个变量,本应在上级作用域结束时释放的变量因为间接引用没有被释放,因此就形成了闭包
作用

  1. 封装变量,方式变量污染
  2. 实现变量结果缓存,避免重复计算
  3. 实现私有变量,防止外部访问

运用

  1. 防抖节流
    function debounce(fn, delay = 300) {let timer; //闭包引⽤外界变量return function () {consr args = arguments;if (timer) {clearTimeout(timer);}timer = setTimeout(() => {fn.apply(this, args);}, delay);};}
  1. 模拟块级作用域
    function OutPutNum(cnt) {(function () {for (let i = 0; i < cnt; i++) {alert(i);}})();alert(i);}

10.this

this指向在函数被调⽤时确定,即执⾏上下⽂被创建时确定。函数执⾏过程中,⼀旦this指向被确定就不可更改。
在⼀个函数上下⽂中,this由调⽤者提供,由调⽤函数的⽅式来决定。如果调⽤者函数,被某⼀个对象所拥有,那
么该函数在调⽤时,内部的this指向该对象。如果函数独⽴调⽤,那么该函数内部的this,则指向undefined。但
是在⾮严格模式中,当this指向undefined时,它会被⾃动指向全局对象

1.严格模式
全局:
在严格模式中,全局上下⽂中的this值是undefined,⽽不是指向全局对象。
函数:在严格模式中,⾮箭头函数内部的this值是undefined,⽽不是指向全局对象或undefined。
对象方法:在严格模式中,对象⽅法中的this指向对象。
2.非严格模式
全局:在非严格模式中,全局上下⽂中的this值是全局对象。
函数:在非严格模式中,⾮箭头函数内部的this值是全局对象。
对象方法:在非严格模式中,对象⽅法中的this指向调用该方法的对象。
3.箭头函数
箭头函数中没有自己的this,沿用了上层作用域的this
作为⽅法的箭头函数 this 指向当前被定义变量的上下⽂环境。
箭头函数的this 为定义时所在的 this,不绑定this (因为箭头函数没有Constructor这个内部槽),会捕获其所在上下
⽂的 this 作为⾃⼰的 this。(箭头函数的this就是它在外⾯的第⼀个不是箭头函数的函数的this)**
4.修改this指向
bind():改变this指向,返回一个新函数原函数的副本,并绑定this指向bind的第一个参数,接受的第一个参数是需要绑定的this,其余参数是原函数的参数
call():改变this指向,立即执行原函数,并绑定this指向call的第一个参数,接受的第一个参数是需要绑定的this,其余参数是原函数的参数
apply():改变this指向,立即执行原函数,并绑定this指向apply的第一个参数,接受的第一个参数是需要绑定的this,接受的第二个参数是原函数的参数

手写以上三个函数

    Function.prototype.myCall = function (obj,...args) {obj.fn = thisconst res = obj.fn(...args)delete obj.fnreturn res}Function.prototype.myApply = function (obj,args) {obj.fn = thisconst res = obj.fn(...args)delete obj.fnreturn res}Function.prototype.myBind = function (obj,...args) {const fn = thisreturn function (...args1) {const res = fn.apply(obj,args.concat(args1))return res}}

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

相关文章

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

【2024数学建模国赛赛题解析已出】原创免费分享

2024数模国赛赛题已正式发布 数模加油站初步分析评估了此次竞赛题目&#xff1a; A题&#xff1a;偏数学仿真建模&#xff0c;难度偏难&#xff0c;适合数学专业背景的同学 B题&#xff1a;评价决策类&#xff0c;自由度大&#xff0c;容易水&#xff0c;适合基础不太好的同…

requestIdleCallback和requestAnimationFrame有什么区别?

由react fiber引起的关注 组件树转为链表&#xff0c;可分段渲染渲染时可以暂停&#xff0c;去执行其他高优先级任务&#xff0c;空闲时在继续渲染&#xff08;JS是单线程的&#xff0c;JS执行的时候没法去DOM渲染&#xff09;如何判断空闲&#xff1f;requestIdleCallback 区…

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件

Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件&#xff0c;提供Fat32、NTFS、Exfat、mac os扩展格式的转换&#xff0c;稳定性好&#xff0c;传输速度极快。Tuxera NTFS for Mac功能丰富&#xff0c;能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…

C++入门9——list的使用

目录 1.什么是list&#xff1f; 2.list的构造 3.list迭代器的使用&#xff08;list iterator&#xff09; 4.list capacity 5.list modifiers 6.list的其他操作 1.什么是list&#xff1f; 在官网中&#xff0c;对list有这样的介绍&#xff1a; Lists are sequence co…

《数字信号处理》学习05-单位冲击响应与系统响应

目录 一&#xff0c;单位冲激响应 二&#xff0c;LTI系统对任意序列的系统响应 三&#xff0c;LTI系统的性质 通过上一篇文章《数字信号处理》学习04-离散时间系统中的线性时不变系统-CSDN博客的学习&#xff0c;我已经知道了离散时间线性时不变系统&#xff08;LTI&#x…

输送线相机拍照信号触发(博途PLC高速计数器中断立即输出应用)

博途PLC相关中断应用请参考下面文章链接: T法测速功能块 T法测速功能块(博途PLC上升沿中断应用)-CSDN博客文章浏览阅读165次。本文介绍了博途PLC中T法测速的原理和应用,包括如何开启上升沿中断、配置中断以及T法测速功能块的使用。重点讲述了在中断事件发生后执行的功能块处…

git submodule子模块的使用

子模块的使用 添加子模块 添加子模块 git submodule add <子仓库URL> <子仓库路径> 例子&#xff1a; git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco 若子模块存在好几个分支&#xff0c;可以在添加子模块时&#xff0c;指定分支 g…

fastadmin 文件上传腾讯云

1-安装腾讯云SDK composer require qcloud/cos-sdk-v5 2-腾讯云配置 <?phpnamespace app\common\controller;use Qcloud\Cos\Client; use think\Controller; use think\Db;class Tencent extends Controller {/*** 上传文件* param $config* param $key* return array*/p…

点云处理实操(四) -PCL中的点云三角化

目录 一、什么是点云三角化 二、常见的三角化算法 1. 贪婪投影三角化(Greedy Projection Triangulation) 2. 泊松表面重建(Poisson Surface Reconstruction) 3. Delaunay三角化(Delaunay Triangulation) 4. 球面法三角化(Ball Pivoting Algorithm, BPA) 5. Alpha…

vue ts as断言处理

在Vue中&#xff0c;使用TypeScript时&#xff0c;你可能会遇到需要初始化数组并为其指定类型的情况。在这种情况下&#xff0c;你可以使用TypeScript的as关键字来断言数组的类型。 例如&#xff0c;如果你有一个Item类型&#xff0c;你可以这样初始化一个空数组并将其类型断言…

Matlab simulink建模与仿真 第十一章(端口及子系统库)【上】

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、端口及子系统库中的模块概览 注&#xff1a;In模块、Out模块和Subsystem模块在第二章中均有介绍&#xff0c;本章不再赘述&#xff1b;Subsystem Examples子系统实例模块也不进行介绍。 二、使能及其子模…

原型模式prototype

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/prototype 能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类 所有的原型类都必须有一个通用的接口&#xff0c; 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对…

【爬虫软件】小红薯评论区采集工具

一、采集目标与应用场景 您好&#xff01;我利用Python技术自主研发了一款高效的爬虫软件&#xff0c;批量收集小红薯平台上的评论&#xff0c;包括主评论及其下的二级评论。 为了拓宽用户群体&#xff0c;让不具备编程基础的小白用户也能轻松上手&#xff0c;我开发成了界面…

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码&#xff08;压缩&#xff09;视频数据&#xff1f;✨如何编码&#xff08;压缩&#xff09;数据&#x1f384;简单的例子&#x1f384;音视频编码方式&#x1f384;视频编码格式H264编码是什么&#xff1f;发展历程&#xff1f;H.264基…

UnLua环境搭建

一、环境搭建 1、下载UnLua工程&#xff1a;https://github.com/Tencent/UnLua 2、复制Plugins/UnLua目录下的插件到自己的项目中 3、重新生成自己的VS工程 4、打开VS工程的项目名.Build.cs文件&#xff0c;引用UnLua插件,重新编译工程 PublicDependencyModuleNames.AddRan…

数组与贪心算法——605、121、122、561、455、575(5简1中)

605. 种花问题&#xff08;简单&#xff09; 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xf…

【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明&#xff08;等四问全部更新完再写&#xff09;5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…

【网络安全】Exif 数据储存型XSS

未经许可,不得转载。 文章目录 Exif步骤Exif EXIF(Exchangeable Image File Format)数据是一种存储在图像文件中的元数据格式,常用于数码照片和扫描图像。它包含了与图像相关的各种信息,比如拍摄日期和时间、相机品牌和型号、拍摄时的设置(如曝光时间、光圈、ISO等)、地…