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

news2024/9/20 12:16:19

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://www.coloradmin.cn/o/1952082.html

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

相关文章

Pcl读取stl文件,并转换成pcd文件,同时显示stl模型和pcd点云

由于不同版本的pcl兼容范围不一样&#xff0c;这里有2个版本的代码&#xff0c;里面的文件路径需要实际情况修改即可&#xff0c;希望对您有所参考或帮助 pcl1.8.1和vs2015版本代码 #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h>…

序列化与反序列化的本质

1. 将对象存储到本地 假如有一个student类&#xff0c;我们定义了好几个对象&#xff0c;想要把这些对象存储下来&#xff0c;该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…

大模型微调部署实战及类GPT工具的高效使用

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委&#xff0c;编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二…

《RMT: Retentive Networks Meet Vision Transformers》CVPR2024

论文&#xff1a;RMT: Retentive Networks Meet Vision Transformers - AMiner 摘要 这篇论文探讨了将Retentive Network&#xff08;RetNet&#xff09;的概念引入到计算机视觉领域&#xff0c;并与Vision Transformer结合&#xff0c;提出了一种新的模型RMT&#xff08;Ret…

牛津剑桥等发现:AI 训 AI 惨遭投毒 9 次大崩溃

【新智元导读】9 次迭代后&#xff0c;模型开始出现诡异乱码&#xff0c;直接原地崩溃&#xff01;牛津、剑桥等机构的一篇论文登上了 Nature 封面&#xff0c;称合成数据就像近亲繁殖&#xff0c;效果无异于投毒。有无破解之法&#xff1f;那就是 —— 更多使用人类数据&#…

护眼灯有没有护眼的效果?一文揭秘用护眼灯到底好不好

护眼灯有没有护眼的效果&#xff1f;在现在这个时代&#xff0c;无论是在学习还是办公&#xff0c;都很难离开一款好用的台灯&#xff0c;所以&#xff0c;为了避免会挑选到质量不好的台灯&#xff0c;我们应该要先避开一些网红小品牌&#xff0c;优先选择有专业技术支持的&…

ClickHouse 24.6 版本发布说明

本文字数&#xff1a;14127&#xff1b;估计阅读时间&#xff1a;36 分钟 作者&#xff1a;ClickHouse team 本文在公众号【ClickHouseInc】首发 又到了发布新版本的时间&#xff01; 发布概要 本次ClickHouse 24.6 版本包含了23个新功能&#x1f381;、24项性能优化&#x1f6…

maven介绍 搭建Nexus3(maven私服搭建)

Maven是一个强大的项目管理工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff1a;Project Object Model&#xff09;的概念&#xff0c;通过XML格式的配置文件&#xff08;pom.xml&#xff09;来管理项目的构建 Maven确实可以被视为一种工程管理工具或项目自动化构…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

简过网:大学生考公,一定要先好好看看这篇文章!

大家好&#xff0c;我是简过网&#xff0c;今天这篇文章我们来聊聊关于大学生考公的那些事儿&#xff0c;希望能给大学生们一点点的帮助&#xff01; 首先&#xff0c;可能有朋友会问了&#xff0c;大学生一般从什么时候开始备考公务员呢&#xff0c;在这里小编建议大家从大三…

《昇思25天学习打卡营第24天|基于MindSpore通过GPT实现情感分类》

基于MindSpore通过GPT实现情感分类 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mind…

yolov5-7环境搭建训练自己的模型

1.下载代码 git clone https://github.com/ultralytics/yolov5 # clone可以切到5-7版本&#xff0c;也可以去github选标签下载 2.配置好conda环境&#xff0c;网上教程比较多&#xff0c;不做讲解&#xff0c;python3.8即可。 3.在环境里安装pyrtorch 按自己的需求选取&am…

每日一练,java05

目录 题目知识点&#xff1a;1.12.13.1 题目 选自牛客网 1.下列表述错误的是&#xff1f;&#xff08;&#xff09; A.int是基本类型&#xff0c;直接存数值&#xff0c;Integer是对象&#xff0c;用一个引用指向这个对象。 B.在子类构造方法中使用super()显示调用父类的构造…

第T6周:使用TensorFlow实现好莱坞明星识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1、加载数据2、数据可视化3、再…

【论文速读】| LLMCloudHunter:利用大语言模型(LLMs)从基于云的网络威胁情报(CTI)中自动提取检测规则

本次分享论文&#xff1a;LLMCloudHunter: Harnessing LLMs for Automated Extraction of Detection Rules from Cloud-Based CTI 基本信息 原文作者&#xff1a;Yuval Schwartz, Lavi Benshimol, Dudu Mimran, Yuval Elovici, Asaf Shabtai 作者单位&#xff1a;Ben-Gurion…

mfc100u.dll 文件缺失?两种方法快速修复丢失mfc100u.dll 文件难题

您的电脑是否遭遇了 mfc100u.dll 文件缺失的问题&#xff1f;这种情况通常由多种原因引起。在本文中&#xff0c;我们将介绍两种修复 mfc100u.dll 文件丢失问题的策略——一种是手动方法&#xff0c;另一种是自动修复的使用。我们将探讨如何有效地解决 mfc100u.dll 文件缺失的几…

Linux下git入门操作

0.创建仓库 可以按这个配置来&#xff0c;.gitignore中存放了上传时忽略的文件类型后缀。 1.clone仓库 在gitee上创建好仓库&#xff0c;点击克隆/下载&#xff0c; 复制地址fyehong/Linux_notes 。 在所需的文件夹中放置仓库。比如我在文件夹lesson9下存储仓库。就在less…

Python爬虫技术 第18节 数据存储

Python 爬虫技术常用于从网页上抓取数据&#xff0c;并将这些数据存储起来以供进一步分析或使用。数据的存储方式多种多样&#xff0c;常见的包括文件存储和数据库存储。下面我将通过一个简单的示例来介绍如何使用 Python 爬取数据&#xff0c;并将其存储为 CSV 和 JSON 文件格…

【数据结构】二叉树链式结构——感受递归的暴力美学

前言&#xff1a; 在上篇文章【数据结构】二叉树——顺序结构——堆及其实现中&#xff0c;实现了二叉树的顺序结构&#xff0c;使用堆来实现了二叉树这样一个数据结构&#xff1b;现在就来实现而二叉树的链式结构。 一、链式结构 链式结构&#xff0c;使用链表来表示一颗二叉树…

【机器学习】解开反向传播算法的奥秘

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 解开反向传播算法的奥秘反向传播算法的概述反向传播算法的数学推导1. 前向传播2…