面试 JavaScript 框架八股文十问十答第七期

面试 JavaScript 框架八股文十问十答第七期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)原型修改、重写

在 JavaScript 中,可以通过修改或重写对象的原型来改变对象的行为。原型修改指的是直接修改对象的原型,而原型重写指的是创建一个新的对象,并将其作为原型赋值给目标对象。这两种操作都会影响到所有基于该原型创建的实例。

示例:

function Person(name) {this.name = name;
}// 修改原型
Person.prototype.sayHello = function() {console.log("Hello, I'm " + this.name);
};const john = new Person("John");
john.sayHello(); // 输出: Hello, I'm John// 重写原型
Person.prototype = {sayGoodbye: function() {console.log("Goodbye!");}
};const alice = new Person("Alice");
// john.sayHello(); // 报错:john.sayHello is not a function
alice.sayGoodbye(); // 输出: Goodbye!

在上面的示例中,首先修改了 Person 的原型,添加了 sayHello 方法,然后重写了 Person 的原型,赋值一个新对象。因此,对于之前创建的 john 对象,仍然可以调用 sayHello 方法,但对于之后创建的 alice 对象,则无法调用 sayHello 方法。

2)原型链指向

在 JavaScript 中,每个对象都有一个原型(prototype)属性,它指向另一个对象,这个对象就是当前对象的原型。通过原型链,对象可以访问其他对象的属性和方法。

当试图访问一个对象的属性或方法时,如果该对象本身没有定义该属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法或者到达原型链的终点为止。

3)原型链的终点是什么?

在 JavaScript 中,原型链的终点是 null。当试图访问一个对象的属性或方法时,如果在对象本身及其原型链上都找不到该属性或方法,则返回 undefined。原型链的终点是 null 是因为 null 是 JavaScript 中的原始值之一,不是对象,因此没有原型。

const obj = {};console.log(obj.toString()); // 输出: [object Object]

在上面的示例中,obj 对象本身没有定义 toString 方法,但由于 obj 的原型链上存在 Object.prototype.toString 方法,因此可以调用成功。如果在整个原型链上都找不到 toString 方法,则会返回 undefined

4)如何打印出原型链的终点?

要打印出原型链的终点,可以通过循环访问对象及其原型链,并判断原型是否为 null。以下是一个简单的方法:

function printPrototypeChain(obj) {let currentObj = obj;while (currentObj !== null) {console.log(currentObj);currentObj = Object.getPrototypeOf(currentObj);}
}const exampleObj = {}; // 你可以替换为具体的对象
printPrototypeChain(exampleObj);

这个函数会依次打印出对象及其原型链上的所有对象,直到原型为 null

5)如何获得对象非原型链上的属性?

要获得对象自身的属性(即非原型链上的属性),可以使用 Object.keys()Object.values()Object.entries() 方法。这些方法会返回对象自身可枚举属性的键、值或键值对。

示例:

function Person(name, age) {this.name = name;this.age = age;
}Person.prototype.sayHello = function() {console.log("Hello, I'm " + this.name);
};const john = new Person("John", 30);// 获取对象自身的属性
const ownProperties = Object.keys(john);
console.log(ownProperties); // 输出: ["name", "age"]// 或者使用 for...in 循环
for (const prop in john) {if (john.hasOwnProperty(prop)) {console.log(prop); // 输出: "name", "age"}
}

在上述示例中,Object.keys(john) 返回 john 对象自身的属性数组,即 ["name", "age"]

6)对闭包的理解

闭包是指在函数内部创建的函数,它可以访问包含它的外部函数的变量,即使外部函数已经执行完毕。闭包是 JavaScript 中强大且常见的特性,可以用于创建私有变量、实现模块化等。

简单说,闭包就是一个函数和其相关的引用环境的组合。当函数被定义时,它就记住了自己被创建时的作用域,即使在其定义的地方之外调用它,它依然可以访问这个作用域内的变量。

function outerFunction() {let outerVar = "I am from outer function";function innerFunction() {console.log(outerVar);}return innerFunction;
}const closureExample = outerFunction();
closureExample(); // 输出: I am from outer function

在这个例子中,innerFunction 是一个闭包,它可以访问 outerFunction 中声明的 outerVar 变量,即使 outerFunction 已经执行完毕。通过将 innerFunction 赋值给 closureExample,我们创建了一个闭包,可以在之后的任何时候调用它,而它仍然能够访问到 outerVar

7)对作用域、作用域链的理解

作用域(Scope): 作用域是指在程序中定义变量的区域,它规定了变量的可访问性和生命周期。在 JavaScript 中,有全局作用域和局部作用域。全局作用域指的是在整个程序中都可访问的范围,而局部作用域则是在函数内部或块级作用域中定义的变量范围。

作用域链(Scope Chain): 作用域链是指在 JavaScript 中,每个函数都有一个作用域链,用于查找变量。当在一个函数内访问一个变量时,JavaScript 引擎会首先查找当前函数的作用域,如果找不到就会顺着作用域链向上查找,直到找到该变量或到达全局作用域。

8)对执行上下文的理解

执行上下文(Execution Context): 执行上下文是 JavaScript 中代码执行的环境,包含了变量对象、作用域链、this 指向等信息。每次调用函数时,都会创建一个新的执行上下文。全局上下文是在程序开始执行时创建的,每个函数调用都会创建一个新的函数执行上下文。

执行上下文分为三种类型:

  • 全局执行上下文: 在程序执行之初创建,全局上下文是唯一的,负责整个程序的执行。
  • 函数执行上下文: 每次调用函数时创建,包含了函数的局部变量和参数。
  • eval 函数执行上下文: 在使用 eval 函数时创建,eval 函数可以动态地执行一段 JavaScript 代码。

9)对this对象的理解

this 对象: 在 JavaScript 中,this 是一个关键字,代表当前执行代码的对象。具体指向的对象取决于函数的调用方式。在全局上下文中,this 指向全局对象(在浏览器环境中通常是 window),而在函数内部,this 的值取决于函数的调用方式。

示例:

function exampleFunction() {console.log(this);
}exampleFunction(); // 在浏览器中,输出: windowconst obj = {method: function() {console.log(this);}
};obj.method(); // 输出: obj 对象

10)call() 和 apply() 的区别?

call()apply() 都是 JavaScript 中用于调用函数的方法,它们的作用是改变函数执行时的上下文(即 this 的值)。它们的区别在于传递参数的方式。

  • call() 方法: call() 方法接收一个参数列表,参数之间用逗号分隔。

    function greet(name) {console.log(`Hello, ${name}! I am ${this.title}.`);
    }const person = { title: 'Mr.' };greet.call(person, 'John');
    
  • apply() 方法: apply() 方法接收两个参数,第一个参数是函数执行时的上下文,第二个参数是一个数组或类数组对象,包含了传递给函数的参数。

    function greet(name) {console.log(`Hello, ${name}! I am ${this.title}.`);
    }const person = { title: 'Mr.' };greet.apply(person, ['John']);
    

总的来说,call()apply() 的目的都是在特定的上下文中调用函数,只是传递参数的方式不同。在现代 JavaScript 中,通常使用扩展运算符 ... 来代替 apply(),因为它更灵活,同时不需要明确指定上下文。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

已 300 + Star!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

OCP使用CLI创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image创建route检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 通过 crc console --credentials 可以查看登录信息&…

Stable Video Diffusion图片转视频——Stability AI开源视频模型

我们前期介绍过Stable Diffusion,stable diffusion模型是Stability AI开源的一个text-to-image的扩散模型,其模型在速度与质量上面有了质的突破,玩家们可以在自己消费级GPU上面来运行此模型。 文生图大模型已经火了很长一段时间了&#xff0c…

Vue 前置导航

Vue 前置导航(Vue Front Navigation)是一种在 Vue.js 框架中实现导航功能的常见方式。它通常用于构建单页应用程序(Single Page Application),通过在页面顶部或侧边栏显示导航菜单,使用户能够轻松切换到不同…

专业130+总分410+苏州大学837信号系统与数字逻辑考研经验电子信息与通信,真题,大纲,参考书

今年考研总分410,专业837信号系统与数字逻辑130,整体每门相对比较均衡,没有明显的短板,顺利上岸苏大,总结一下自己这大半年的复习经历,希望可以对大家有所帮助,也算是对自己考研做个总结。 专业…

Java:常用API接上篇 --黑马笔记

一、 StringBuilder类 StringBuilder代表可变字符串对象,相当于是一个容器,它里面的字符串是可以改变的,就是用来操作字符串的。 好处:StringBuilder比String更合适做字符串的修改操作,效率更高,代码也更…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

【element-ui】输入框组件el-input输入数字/输出Number类型:type=“number“、v-model.number用法

输入框组件el-input输入数字/输出Number类型 1、基础用法 输入&#xff1a;任何文本 → 输出&#xff1a;String类型 <el-input v-model"inputText"></el-input> <!-- 输入 abc —— inputText输出 "abc" 输入 123 —— inputText输出 …

JavaEE作业-实验四

目录 1.实验内容 2.实验要求 3.思路 4.程序源码 1.实验内容 简单的线上图书交易系统的服务层 2.实验要求 &#xff08;1&#xff09;使用Spring框架&#xff0c;采用XML配置 &#xff08;2&#xff09;要求具有如下服务层功能&#xff1a;商品分类、订单、购物车、库存…

11 插入排序和希尔排序

1. 插入排序 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;基本思想&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 在玩扑克牌时&#xff0c;就用…

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…

Python pandas中read_csv函数的io参数

前言 在数据分析和处理中&#xff0c;经常需要读取外部数据源&#xff0c;例如CSV文件。Python的pandas库提供了一个强大的 read_csv() 函数&#xff0c;用于读取CSV文件并将其转换成DataFrame对象&#xff0c;方便进一步分析和处理数据。在本文中&#xff0c;将深入探讨 read…

【网页设计】春节页面背景模板

无偿下载地址&#xff1a;https://download.csdn.net/download/weixin_47040861/88811143 1.实现效果 2.代码 1.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

go c 通过内存原始二进制内容直接传递结构体

go c 通过内存原始二进制内容直接传递结构体 传统数据传输通常通过半结构化数据(json/yaml/xml…)来交换信息。但是go 支持 二进制数据层面支持c 结构体。带来的好处就是相较于半结构化数据类型来说更快(在go中&#xff0c;解析和生成json/yaml/xml…到结构体都会经过一层反射…

【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据

针对图像到图像生成模型遗忘学习&#xff1a;超高效且不需要重新训练就能从生成模型中移除特定数据 提出背景如何在不重训练模型的情况下从I2I生成模型中移除特定数据&#xff1f; 超高效的机器遗忘方法子问题1: 如何在图像到图像&#xff08;I2I&#xff09;生成模型中进行高效…

推荐系统|召回04_离散特征处理

离散特征处理 离散特征是什么 怎么处理离散特征 One-hot编码 Embedding嵌入 从one-hot到Embedding&#xff0c;已经节省了很多的存储空间&#xff0c;但当数据量大的时候&#xff0c;还是占空间&#xff0c;所以工业界仍会对Embedding进行优化 而一个物品所对应的Embedding参数…

设计模式(前端)

设计模式 1.环境搭建 1&#xff09;初始化npm环境 下载node.js 执行npm init命令 (生成package.json) 根目录下&#xff0c;新建src文件夹&#xff0c;src文件夹下新建index.js文件&#xff1a; alert("Hello World");2&#xff09;安装webpack npm install webpa…

基于JSP的网上购书系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88825694?spm1001.2014.3001.5503 Java项目-15 源码论文数据库配置文件 基于JSP的网上购书系统 摘要 在当今的社会中&#xff0c; 随着社会经济的快速发展以及计算机网络技术和通讯技术…

8种基本类型的包装类(与String的转换)

java针对8种基本数据类型&#xff0c;定义了相应的引用类型&#xff1a;包装类(封装类)&#xff0c;有了类的特点&#xff0c;就能调用类中的方法&#xff0c;java才是真正的面向对象。 基本数据类型 包装类byte Byteshort Shortint Integerlong Longfloat Floa…

国产光耦2024:发展机遇与挑战全面解析

随着科技的不断进步&#xff0c;国产光耦在2024年正面临着前所未有的机遇与挑战。本文将深入分析国产光耦行业的发展现状&#xff0c;揭示其在技术创新、市场需求等方面的机遇和挑战。 国产光耦技术创新的机遇&#xff1a; 国产光耦作为光电器件的重要组成部分&#xff0c;其技…

Python操作MySQL基础

除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库。在Python中&#xff0c;使用第三方库: pymysql来完成对MySQL数据库的操作。 安装第三方库pymysql 使用命令行,进入cmd&#xff0c;输入命令pip install pymysql. 创建到MySQL的数据库连接…