前端面试宝典【Javascript篇】【1】

在这里插入图片描述

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。

核心特色:

  • 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知识到前沿技术,从算法挑战到框架运用,让你在实战中迅速成长。
  • 深度技术解析:不再只是表面文章,我们将带你深入技术的核心,理解每一个知识点背后的原理与- - 应用场景,让你在面试中不仅知其然,更知其所以然。
  • 高质量内容保证:每一期内容都经过精心策划与打磨,确保信息的准确性和实用性,拒绝泛泛而谈,只提供真正有价值的内容。
  • 持续更新迭代:持续关注前端领域的最新动态,及时更新专栏内容,确保你始终站在技术的最前沿。

目录

    • 1. new的实现原理是什么?
    • 2. 如何正确判断this的指向
    • 3. js的with语句

1. new的实现原理是什么?

在JavaScript中,new操作符用于调用一个构造函数并创建一个新的对象。当使用new关键字调用一个构造函数时,会经历以下几个步骤:

  • 创建空对象: 首先,会创建一个新的空对象。

  • 设置原型: 新创建的空对象的原型(__proto__属性或[[Prototype]])会被设置为构造函数的prototype属性所指向的对象。这样就将新对象与构造函数的原型链关联起来。

  • 绑定this: 构造函数内部的this会被绑定到新创建的对象上。这意味着构造函数内部对this的任何引用和修改实际上都是针对这个新对象的。

  • 执行构造函数: 接着,构造函数被调用,通常会初始化新对象的状态,比如给它添加属性和方法。

  • 返回新对象: 如果构造函数没有显式地返回一个对象,则默认返回新创建的对象。如果构造函数返回了一个对象,则返回这个对象;如果返回的是非对象值(如undefined、数字、字符串等),则忽略返回值,仍然返回新创建的对象。

下面是一个简单的示例来说明new操作符的使用:

function Person(name, age) {this.name = name;this.age = age;
}Person.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};const person1 = new Person('Alice', 30);
person1.sayHello(); // 输出: Hello, my name is Alice and I am 30 years old.

在这个例子中,new Person(‘Alice’, 30);会创建一个新的Person对象,并将其__proto__链接到Person.prototype,然后调用Person构造函数来初始化这个对象。

2. 如何正确判断this的指向

在JavaScript中,this的指向取决于函数的调用方式,这可能会导致一些常见的陷阱和错误。以下是一些判断this指向的规则和方法:

  • 全局上下文(非严格模式): 在全局作用域或者非严格模式下的函数调用中,this通常指向全局对象(在浏览器中通常是window)。

  • 对象方法调用: 当函数作为某个对象的方法被调用时,this指向该对象。

   const obj = {value: 42,printValue: function() {console.log(this.value);}};obj.printValue(); // 输出: 42
  • 构造函数调用: 使用new关键字调用函数时,this指向新创建的对象。
   function MyClass() {this.value = 42;}const instance = new MyClass();console.log(instance.value); // 输出: 42
  • 箭头函数: 箭头函数不会绑定自己的this,而是从封闭作用域继承this。
   const obj = {value: 42,printValue: () => {console.log(this.value); // 这里的this不是obj,而是全局对象或undefined(严格模式)}};obj.printValue(); // 输出: undefined 或 全局对象的value属性
  • 事件处理器: 在事件处理器中,this通常指向触发事件的DOM元素。
   <button id="myButton">Click me</button><script>document.getElementById('myButton').addEventListener('click', function() {console.log(this.id); // 输出: myButton});</script>
  • 手动绑定this:
    可以使用.call(), .apply()和.bind()方法来明确指定this的值。
    • .call()和.apply()允许你立即调用函数并传递参数,区别在于参数的传递方式不同。
    • .bind()创建一个新函数,在调用时会使用指定的this值。
   const obj = {value: 42};function printValue() {console.log(this.value);}printValue.call(obj); // 输出: 42const boundPrintValue = printValue.bind(obj);boundPrintValue(); // 输出: 42

理解this的这些规则对于编写可预测和健壮的JavaScript代码至关重要。

3. js的with语句

JavaScript 中的 with 语句允许你在一个代码块中使用一个对象的属性,而无需每次都引用该对象。这在某种程度上提供了局部作用域的概念,使得你可以直接使用对象的属性名,而不需要前缀对象名。

with 语句的基本语法如下:

with (object) {// 在这里可以使用 object 的属性,不需要前缀 object 名称
}
var person = {firstName: "John",lastName: "Doe",age: 30
};with (person) {console.log(firstName + ' ' + lastName + ', ' + age);
}
// 输出: John Doe, 30

然而,with 语句有一些缺点和潜在的问题:

  • 性能影响:由于 with 语句会修改作用域链,这可能导致解析变量时的性能下降。

  • 代码可读性和维护性:使用 with 语句可能会使代码难以阅读和理解,特别是当嵌套使用时。

  • 潜在的错误:如果对象有与外部作用域相同的属性名,那么在 with 块中访问该属性时,会优先使用对象内的属性,这可能导致意外的结果。

  • 严格模式:在严格模式下,with 语句是被禁止的,因为它们可能引入作用域的不确定性,以及性能上的问题。

由于上述原因,with 语句在现代JavaScript编程中并不推荐使用,尤其是在严格模式下。取而代之的是,推荐使用更现代的语言特性,如解构赋值,来达到类似的效果,同时保持代码的清晰性和性能。

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

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

相关文章

VMare centos 7 设置固定ip

第一步获取网关 查看虚拟机的网关-》编辑-》虚拟网络编辑器 NAT模式-》NAT设置 获取网关IP 192.168.70.2 第二步获取主机dns1 在本地主机获取dns1&#xff0c;本地主机调出cmd输入ipconfig dns1为192.168.31.1 用管理员权限的账号进入需要设置固定ip的虚拟机&#xff0c;在t…

使用AOP优化Spring Boot Controller参数:自动填充常用字段的技巧

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 使用AOP优化Spring Boot Controller参数&#xff1a;自动填充常用字段的技巧 前言为什么使用AOP为…

java8函数式编程学习(二):optional,函数式接口和并行流的学习

简介 java8函数式编程中optional的简单使用&#xff0c;函数式接口的了解&#xff0c;并行流的使用。 optional 可以更优雅的来避免空指针异常。类似于包装类&#xff0c;把具体的数据封装到optional对象内部&#xff0c;然后使用optional的方法去操作封装好的数据。 创建o…

Python编程入门指南:从基础到高级

Python编程入门指南&#xff1a;从基础到高级 一、Python编程语言简介 1. Python是什么&#xff1f; Python是一门广泛使用的计算机程序编程语言&#xff0c;由荷兰人吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1991年首次发行。Python是一种解释型、交互式、面…

汽车免拆诊断案例 | 2018 款别克阅朗车蓄电池偶尔亏电

故障现象 一辆2018款别克阅朗车&#xff0c;搭载LI6发动机和GF6变速器&#xff0c;累计行驶里程约为9.6万km。车主反映&#xff0c;该车停放一晚后&#xff0c;蓄电池偶尔亏电。 故障诊断 接车后用虹科Pico汽车示波器和高精度电流钳&#xff08;30 A&#xff09;测量该车的寄…

Spring AOP(2)原理(代理模式和源码解析)

目录 一、代理模式 二、静态代理 三、动态代理 1、JDK动态代理 &#xff08;1&#xff09;JDK动态代理实现步骤 &#xff08;2&#xff09;定义JDK动态代理类 &#xff08;3&#xff09;代码简单讲解 2、CGLIB动态代理 &#xff08;1&#xff09;CGLIB 动态代理类实现…

【数据结构】稀疏数组

问题引导 在编写五子棋程序的时候&#xff0c;有“存盘退出”和“续上盘”的功能。现在我们要把一个棋盘保存起来&#xff0c;容易想到用二维数组的方式把棋盘表示出来&#xff0c;但是由于在数组中很多数值取默认值0&#xff0c;因此记录了很多没有意义的数据。此时我们使用稀…

Apache压测工具ab(Apache Bench)工具的下载安装和使用示例

场景 Jmeter进行http接口压力测试&#xff1a; Jmeter进行http接口压力测试_接口压测两万量-CSDN博客 上面讲压测工具Jmeter的使用&#xff0c;下面介绍另外一个ab(Apache Bench)压测工具的使用。 apache bench apache bench是apache自带的压力测试工具。 ab不仅可以对ap…

基于联盟链Fabric 2.X 的中药饮片代煎配送服务与监管平台

业务背景 近年来&#xff0c;随着公众对中医药青睐有加&#xff0c;中药代煎服务作为中医药现代化的重要一环&#xff0c;在全国各地蓬勃兴起。鉴于传统煎煮方式的繁琐耗时&#xff0c;医疗机构纷纷转向与第三方中药饮片企业合作&#xff0c;采用集中代煎模式。这些第三方煎药中…

没有51基础,能不能学好STM32?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 我们通常准备攻读一本大部…

浅谈监听器之断言结果

浅谈监听器之断言结果 在进行测试过程中&#xff0c;断言是一种关键组件&#xff0c;用于验证采样器&#xff08;如HTTP请求&#xff09;的响应数据是否符合预期。而“断言结果”监听器则是展示这些断言执行情况的重要工具&#xff0c;它帮助用户快速识别哪些断言通过或未通过…

【JAVA多线程】线程的状态控制

目录 1.JDK中的线程状态 2.基础操作 2.1关闭 2.2中断 2.3.等待、唤醒 2.4.阻塞、唤醒 1.JDK中的线程状态 在JDK的线程体系中线程一共6种状态&#xff1a; NEW&#xff08;新建&#xff09;: 当线程对象创建后&#xff0c;但尚未启动时&#xff0c;线程处于新建状态。RUN…

python毕业设计选题校园食堂菜谱推荐系统

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

stack(leetcode练习题,牛客)

文章目录 STL用法总结32 最长有效括号思路代码 496 下一个最大元素思路代码 856 括号的分数思路 最优屏障思路代码 STL用法总结 关于stack的知识&#xff0c;可以看点击查看上面的博客&#xff0c;以下题目前三个全在leetcode&#xff0c;最后一个在牛客 32 最长有效括号 思路…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十章 Linux设备树

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

代理IP在数据采集中具体有哪些作用

在当今信息化高速发展的时代&#xff0c;从市场趋势分析到消费者行为预测&#xff0c;从产品优化到服务改进&#xff0c;大数据都在其中扮演着不可或缺的角色。但数据的采集、整理和分析并非易事&#xff0c;特别是在面对海量的网络数据时&#xff0c;我们往往需要借助一些技术…

前端 SSE 长连接

使用 const options {withCredentials: true, // 默认 false}const eventSource new EventSource(/api, options);eventSource.addEventListener(open, () > {});eventSource.onmessage (event) > {}; // 或addEventListener(message,callback)eventSource.addEvent…

程序员拔火罐技能的分享

一.背景 之前为了考“中医康复理疗师”的证书&#xff0c;自学了拔火罐。自学主要是在自己大腿上练习&#xff0c;然后拿家人做小白鼠。后来考试没有那么严格也就顺利通过了。操作过程中&#xff0c;积累的一些小知识&#xff0c;分享给大家&#xff0c;有空在家里给家人服务体…

CTF ssrf 基础入门 (一)

0x01 引言 我发现我其实并不是很明白这个东西&#xff0c;有些微妙&#xff0c;而且记忆中也就记得Gopherus这个工具了&#xff0c;所以重新学习了一下&#xff0c;顺便记录一下吧 0x02 辨别 我们拿到一个题目&#xff0c;他的名字可能就是题目类型&#xff0c;但是也有可能…

FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章分享FastAPI&#xff08;七十二&#xff09;实战开发《在线课程学习系统》接口开发-- 留言列表开发&#xff0c;这次我们分享如何回复留言 按…