Javascript前端面试基础5【每日更10】

let与var的区别

  • let命令不存在变量提升,如果在let前使用,会导致报错(var存在变量提升)
  • 如果块区中存在let和const命令,就会形成封闭作用域
  • 不允许重复声明,因此,不能在函数内部重新声明参数
     

map与forEach的区别

  • forEach方法,是最基本的方法,就是遍历与循环,默认有3个传参:分别是遍历的数组内容 item 、数组索引 index 、和当前遍历数组Array
  • map方法,基本用法与forEach 一致,但是不同的,它会返回一个新的数组,所以在callback需要有return值,如果没有,会返回undefined

谈一谈你理解的函数式编程

  • 简单说,“函数式编程"是一种"编程范式”( programming paradigm),也就是如何编写程序的方法论
  • 它具有以下特性:闭包和高阶函数、惰性计算、递归、函数是"第一等公民"、只用"表达式"
     

函数式编程(Functional Programming, FP)是一种编程范式,它强调使用函数作为基本构建块来编写程序,并尽量避免使用可变状态(mutable state)和副作用(side effects)。函数式编程的核心思想是将计算视为对数据的数学函数映射,这种思想使得代码更加模块化、易于理解和测试,同时也促进了并行和并发计算的发展。

以下是对函数式编程几个关键特性的理解:

  1. 函数作为一等公民(First-class citizens):在函数式编程中,函数被视为与数据(如整数、字符串等)同等的实体。这意味着函数可以作为参数传递给其他函数,也可以作为返回值从函数中返回,甚至可以存储在变量或数据结构中。

  2. 纯函数(Pure functions):纯函数是函数式编程中的一个核心概念。一个函数被认为是纯的,如果它满足以下两个条件:一是给定相同的输入,总是返回相同的输出(即没有副作用);二是它不修改其外部状态(即不依赖于或修改程序中的可变状态)。纯函数使得代码更加可预测和可靠。

  3. 避免可变状态(Immutable state):函数式编程鼓励使用不可变数据结构,即一旦创建就不能被修改的数据结构。这样做可以减少程序中的错误来源,因为不可变数据结构保证了数据在程序执行过程中的一致性,同时也有助于并行和并发计算,因为多个线程可以同时安全地读取相同的数据。

  4. 高阶函数(Higher-order functions):高阶函数是至少满足下列一个条件的函数:接受一个或多个函数作为输入,或者输出一个函数。高阶函数允许函数式编程实现更高级别的抽象,如柯里化(Currying)、部分应用(Partial Application)和函数组合(Function Composition)等。

  5. 惰性求值(Lazy evaluation):在函数式编程中,惰性求值是一种求值策略,它推迟表达式的计算直到该表达式的值真正需要时为止。这有助于优化程序性能,特别是在处理大量数据或执行复杂计算时。

  6. 模式匹配(Pattern matching):函数式编程语言通常支持模式匹配,这是一种通过检查数据结构并与一系列预定义的模式进行匹配来执行不同操作的机制。模式匹配使得处理复杂数据结构(如列表、树等)变得更加简单和直观。

总之,函数式编程通过强调函数、纯函数、不可变状态和高阶函数等概念,提供了一种强大的编程范式,有助于提高代码的可读性、可维护性和可测试性。同时,函数式编程也促进了并行和并发计算的发展,使得处理大规模数据和复杂计算变得更加高效和可靠。

 普通函数与箭头函数

1. 定义语法

  • 普通函数:使用function关键字定义,后面跟着函数名和一对圆括号(包含参数列表),然后是花括号内的函数体。

  • 箭头函数:使用=>符号定义,更简洁。如果函数体只有一条语句(且为返回语句),可以省略花括号和return关键字。箭头函数没有自己的function关键字和函数名(除非它被赋值给一个变量或常量,从而可以间接引用)。

2. this的绑定

  • 普通函数this的值在函数调用时确定,它依赖于函数是如何被调用的。例如,作为对象的方法调用时,this指向该对象;在全局作用域中调用时,this指向全局对象(在浏览器中是window)。

  • 箭头函数:不绑定自己的this,而是继承自它所在的上下文(即父执行上下文)的this值。这意味着,在箭头函数内部,this的值不会随着调用方式的改变而改变,它始终指向定义时所在的作用域中的this

3. arguments对象

  • 普通函数:每个普通函数都会接收到一个名为arguments的类数组对象,它包含了传递给函数的所有参数。

  • 箭头函数:不接收arguments对象。如果需要访问传递给函数的参数列表,可以使用剩余参数(...args)语法。

4. new操作符

  • 普通函数:可以使用new操作符来调用,这时函数会作为构造函数执行,并创建一个新的对象实例。

  • 箭头函数:不能被用作构造函数,使用new操作符调用箭头函数会抛出一个TypeError

 5.prototype属性

  • 普通函数:具有prototype属性,它是一个对象,可以被该函数的实例对象所继承。

  • 箭头函数:没有prototype属性,因此不能用作构造函数,也无法通过prototype添加共享属性或方法。

6. 返回值

  • 普通函数:使用return语句显式地返回值。

  • 箭头函数:如果函数体只有一条语句(且该语句为返回语句),可以省略花括号和return关键字,函数会自动返回该语句的结果。

7. 性能和用途

  • 性能:在大多数情况下,普通函数和箭头函数的性能差异可以忽略不计。然而,在需要优化性能的极端情况下,应仔细考虑它们的使用。

  • 用途:箭头函数因其简洁性和对this的特殊处理,常用于定义回调函数、事件处理器等场景。普通函数则更适用于需要作为构造函数、需要访问arguments对象或需要prototype属性的场景。

this指向

this 的基本指向规则

  1. 全局上下文:在全局执行上下文中(在任何函数体外部),this 指向全局对象。在浏览器中是 window 对象,在 Node.js 中是 global 对象。

  2. 函数上下文:在普通函数中,this 的值取决于函数是如何被调用的。

    • 如果函数作为某个对象的方法被调用,则 this 指向该对象。
    • 如果函数作为普通函数被调用(即非方法调用),this 指向全局对象(在严格模式下,this 是 undefined)。
    • 使用 call()apply() 或 bind() 方法可以改变 this 的指向。
  3. 箭头函数:箭头函数不绑定自己的 this,它会捕获其所在上下文(即父执行上下文)的 this 值作为自己的 this 值。

如何改变 this 指向

  1. 使用 call() 方法

    call() 方法调用一个函数,其具有一个指定的 this 值和分别提供的参数(参数的列表)。

function greet(greeting, punctuation) {  console.log(greeting + ', ' + this.name + punctuation);  
}  const person = {  name: 'John'  
};  greet.call(person, 'Hello', '!'); // 输出: Hello, John!

 2.  使用 apply() 方法

apply() 方法调用一个函数,其具有一个指定的 this 值,以及以一个数组(或类数组对象)的形式提供的参数。

greet.apply(person, ['Hi', '.']); // 输出: Hi, John.

使用 bind() 方法

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

const boundGreet = greet.bind(person, 'Howdy');  
boundGreet('!'); // 输出: Howdy, John!

注意,bind() 返回的是一个新的函数,而 call() 和 apply() 是直接调用函数。

  1. 在 ES6 箭头函数中

    由于箭头函数不绑定自己的 this,因此你不能通过 call()apply() 或 bind() 来改变箭头函数中的 this 指向。箭头函数中的 this 总是从外围(函数或者全局)作用域继承。

Javascript中bind、call、apply區別-CSDN博客

异步编程实现

  • 回调函数

      回调函数是最早也是最基本的异步编程方式。它将需要等待的函数作为参数传递给另一个函数,当等待的操作完成时,再调用这个回调函数。但这种方式可能会导致“回调地狱”(Callback Hell),即多层嵌套的回调函数使得代码难以阅读和维护。

function doSomething(callback) {  setTimeout(() => {  console.log('Doing something...');  callback();  }, 1000);  
}  doSomething(() => {  console.log('Done!');  
});
  1. 优点:简单、容易理解
  2. 缺点:不利于维护,代码耦合高
  • 事件监听(采用时间驱动模式,取决于某个事件是否发生):
  1. 优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数
  2. 缺点:事件驱区动型,流程不够清晰
  • 发布/订阅(观察者模式)
  1. 类似于事件监听,但是可以通过‘消息中心',了解现在有多少发布者,多少订阅者
  • Promise对象

Promises是ES6中引入的,用于处理异步操作的对象。它代表了一个最终可能完成或失败的操作及其结果值。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

function doSomething() {  return new Promise((resolve, reject) => {  setTimeout(() => {  resolve('Done!');  // 或者在某些情况下使用 reject('Error!');  }, 1000);  });  
}  doSomething().then(result => {  console.log(result);  
}).catch(error => {  console.error(error);  
});

Promise其实也不难-CSDN博客 

  1. 优点:可以利用then方法,进行链式写法;可以书写错误时的回调函数;
  2. 缺点:编写和理解,相对比较难
  • Generator函数

Generators是ES6中引入的,提供了一种执行暂停和恢复代码的机制。虽然它们本身不直接处理异步操作,但可以通过与Promises结合使用(例如通过co库),来实现异步编程。然而,由于async/await的引入,使得Generators在异步编程中的使用逐渐减少。

  1. 优点:函数体内外的数据交换、错误处理机制
  2. 缺点:流程管理不方便
  • async函数

async/await是ES2017(ES8)中引入的,建立在Promises之上,使得异步代码看起来和同步代码一样。async函数会隐式返回一个Promise,而await关键字则用于等待Promise的解决(resolve)或拒绝(reject),并可以从中检索解决的值。

async function doSomething() {  try {  const result = await new Promise((resolve) => {  setTimeout(() => {  resolve('Done!');  }, 1000);  });  console.log(result);  } catch (error) {  console.error(error);  }  
}  doSomething();
  1. 优点:内置执行器、更好的语义、更广的适用性、返回的是Promise、结构清晰。
  2. 缺点:错误处理机制

 

对原生Javascript了解程度

数据类型、运算、对象、Function、继承、闭包、作用域、原型链、事件、RegExp 、JSON 、Ajax . DOM 、 BOM、内存泄漏、跨域、异步装载、模板引擎、前端MC .路由、模块化、 Canvas  ECMAScript

Js动画与CSS动画区别及相应实现

  1. CSS3的动画的
  • 优点:在性能上会稍微好一些,浏览器会对CSS3的动画做一些优化、代码相对简单
  • 缺点在动画控制上不够灵活。兼容性不好

JavaScript 的动画正好弥补了这两个缺点,控制能力很强,可以单帧的控制、变换,同时写得好完全可以兼容IE6,并且功能强大。对于一些复杂控制的动画,使用javascript会比较靠谱。而在实现一些小的交互动效的时候,就多考虑考虑CSS 吧
 

JS数组和对象的遍历方式,以及几种方式的比较

    通常我们会用循环的方式来遍历数组。但是循环是导致js 性能问题的原因之一。一般我们会采用下几种方式来进行数组的遍历

  • for in 循环
  1. for-in需要分析出array 的每个属性,这个操作性能开销很大。用在key已知的数组上是非常不划算的。所以尽量不要用for-in ,除非你不清楚要处理哪些属性,例如JSON对象这样的情况
  • for 循环
  1. 循环每进行一次,就要检查一下数组长度。读取属性(数组长度)要比读局部变量慢,尤其是当array 里存放的都是DOM元素,因为每次读取都会扫描一遍页面上的选择器相关元素,速度会大大降低
  • forEach
  1. forEach回调中两个参数分别为value ,index
  2. forEach无法遍历对象
  3. IE不支持该方法; Firefox和chrome支持
  4. forEach无法使用break , continue 跳出循环,且使用return是跳过本次循环
     


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3268474.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

springboot中使用knife4j访问接口文档的一系列问题

springboot中使用knife4j访问接口文档的一系列问题 1.个人介绍 🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的…

学习Java的日子 Day56 数据库连接池,Druid连接池

Day56 1.数据库连接池 理解:池就是容器,容器中存放了多个连接对象 使用原因: 1.优化创建和销毁连接的时间(在项目启动时创建连接池,项目销毁时关闭连接池) 2.提高连接对象的复用率 3.有效控制项目中连接的…

C++初阶学习第四弹——类与对象(中)

目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…

Selenium 的使用

selenium 是一个自动化测试工具,利用它可以驱动浏览器完成特定的操作,例如点击,下拉等,还可以获取浏览器当前呈现的页面的源代码,做到所见即所爬,对于一些 JavaScript 动态渲染的界面来说,这种爬…

php+bootstrap 编写简易的步骤进度条

个人笔记记录&#xff0c;步骤进度条。 版本一&#xff1a; 初始版本&#xff0c; 当前版本单纯的根据bootstrapCSS进行完成的简易版本。这个比较简单 样式我放在了最底下。 <div class"form-group steps"><div class"steps-height"><di…

ScriptableObject使用

资料 Scripting/Create modular game architecture in Unity with ScriptableObjects 脚本文档 基础 SO是一个Unity对象&#xff0c;继承UnityEngine.Objec&#xff0c; SO最大的特点是实例文件可共享&#xff0c;有点类似静态数据&#xff0c;同一个实例文件可被多个对象引…

【vim】ubuntu20-server 安装配置 vim 最新最详细

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【vim】ubuntu20-server 安装配置 vim 最新最详细 开发环境一、vim github二、安装必…

Linux系统下非root用户自行安装的命令切换为root权限时无法使用,提示comman not found解决办法

今天在开发的时候遇上了一个问题就是要去我们数据平台中进行数据的提取&#xff0c;数据存储用的是minio&#xff0c;一个MinIO部署由一组存储和计算资源组成&#xff0c;运行一个或多个 minio server 节点&#xff0c;共同作为单个对象存储库。独立的MinIO实例由具有单个 mini…

快速入门C#设计模式【2】结构型模式

结构型模式 适配器模式 (Adapter)桥接模式 (Bridge)组合模式 (Composite)装饰模式 (Decorator)外观模式 (Facade)享元模式 (Flyweight)代理模式 (Proxy) 适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计…

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…

后端采用SpringBoot框架开发的:ADR药物不良反应智能监测系统源码,用于监测和收集药品在使用过程中发生的不良反应的系统

ADR药物不良反应智能监测系统是一套用于监测和收集药品在使用过程中发生的不良反应&#xff08;Adverse Drug Reaction, ADR&#xff09;的系统。该系统基于医院临床数据中心&#xff0c;运用信息技术实现药品不良反应的智能监测、报告管理、知识库查询、统计分析等功能&#x…

昇思25天学习打卡营第22天|CV-Vision Transformer图像分类

打卡 目录 打卡 ViT简介 模型结构 基于ViT实现ImageNet分类任务 环境准备与数据读取 模型解析 Transformer基本原理 Self-Attention模块 代码实现 Transformer Encoder 代码实现 ViT模型的输入 Patch Embedding代码处理输入 整体构建ViT 模型训练与推理 模型训…

通过ATS软件抓取ios手机日志方法记录

1.ios手机下载描述符文件&#xff0c;用于过检测 下载网址&#xff1a;https://developer.apple.com/bug-reporting/profiles-and-logs/?nameB 点击这个下载&#xff0c;之后在手机通用-VPN与设备管理里面找到刚才下载的描述文件然后安装&#xff1b; 2024.6月后注意会提示描…

能链智电的危与机:持续亏损、股价崩塌,CEO王阳如何寻求出路?

近日&#xff0c;能链智电&#xff08;NASDAQ&#xff1a;NAAS&#xff09;发布未经审计的2024年二季度及上半年财报。数据显示&#xff0c;该公司上半年营收增速稳健&#xff0c;核心充电服务的规模效应得到释放。 能链智电在财报中透露&#xff0c;该公司于6月首度实现了单月…

echarts使用案例

1.配置legend icon 根据点击事件动态更换样式 <template><div ref"chart" style"width: 600px; height: 400px;"></div></template><script>import * as echarts from echarts;export default {name: EchartsExample,data(…

图论理论基础

图论理论基础 | 代码随想录 图的基本概念 二维坐标中&#xff0c;多个点连成的线就构成了图。图也可以是一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09;。 图的种类 整体上一般分为有向图和无向图。 有向图是指图中边是有方向的&#xff0c;无向图是指图中…

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中&#xff0c;OpenAI 推出的 GPT-4o mini 模型如同一阵春风&#xff0c;给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格&#xff0c;成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时&#xff0c;内心充满了好奇与期待…

Pytorch笔记1

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 整体框架如下 目录 gpu加速数据数据结构张量TensorVariable 预处理数据增强 模型构建模块组织复杂网络初始化网络参数定义网络层 损失函数创建损失函数设置损失函数超参数选择损失函数 优化器管理模型参数管理…

【ESP32 IDF 软件模拟SPI驱动 W25Q64存储与读取数组】

目录 SPISPI介绍SPI时序代码编写&#xff08;spi&w25q64&#xff09; 代码调试 SPI SPI介绍 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;是一种高速、全双工、同步的串行通信总线&#xff0c;常用于微控制器与各种外围设备&…