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

news2024/11/13 10:20:23

在这里插入图片描述

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

核心特色:

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

目录

    • 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); // 输出: 42
   const 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.coloradmin.cn/o/1945540.html

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

相关文章

畅销款超声波眼镜清洗器该怎么选?2024年最强超声波清洗机推荐指南

眼镜是现代生活中不可或缺的物品&#xff0c;但许多人可能不清楚如何正确清洁眼镜。传统的清洁方法可能会对眼镜造成损害&#xff0c;例如使用普通肥皂或清水清洗时容易划伤镜片。为了解决这个问题&#xff0c;家用超声眼镜波清洗机应运而生。超声波清洗机通过超声波振动原理进…

昇思MindSpore 应用学习-CycleGAN图像风格迁移互换

日期 心得 昇思MindSpore 应用学习-CycleGAN图像风格迁移互换&#xff08;AI代码学习&#xff09; CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Trans…

小白0基础怎么快速写一篇激光SLAM论文

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。如有不对的地方欢迎指出&#xff0c;欢迎各位大佬交流讨论&#xff0c;一起进步。博主创建了一个科研互助群Q&#xff1a;9510262…

视频翻译保留原音色pyvideotrans+clone-voice

剪映的视频翻译时长限制5分钟以内&#xff0c;需要积分2700首次有减免大概21.6元&#xff08;1秒9积分/1元100积分&#xff09; • 视频翻译配音工具pyvideotrans 将视频从一种语言翻译为另一种语言&#xff0c;并添加配音 打包链接&#xff1a;夸克网盘分享 升级补丁&#…

三、基础语法1(30小时精通C++和外挂实战)

三、基础语法1&#xff08;30小时精通C和外挂实战&#xff09; 1&#xff0c;开发环境的搭建2&#xff0c;cin和cout3、4&#xff0c;函数重载5&#xff0c;使用IDA分析exe6.1&#xff0c;默认参数6.2&#xff0c;默认参数的本质汇编7&#xff0c;externC1作用8&#xff0c;ext…

防御和进攻编程

防御性编程是许多程序员都听说过的一个术语&#xff0c;对于某些程序&#xff0c;防御性编程是必不可少的。对于其他程序&#xff0c;它可能偶尔使用一下。除此之外&#xff0c;还有攻击性编程。 在本文中&#xff0c;我们将首先研究“正常编程”。我们首先研究它&#xff0c;…

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 &#xff08;1&#xff09;平台版本&#xff08;Android SDK版本号&#xff09; 平台版本也就是我们平时说的安卓8、安卓9、安卓10 &#xff08;2&#xff09;API级别&#xff08;API Level&#xff09; Android 平台提供的框架 API 被称作“API 级别” …

Mongodb的通配符索引

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第95篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

Blender 4.2 安装GIS插件步骤

Blender 4 更新以后插件安装变得复杂&#xff0c;插件界面的安装按钮不显示&#xff0c;界面布局改变&#xff0c;怎么安装插件&#xff1a; 1. 在线安装&#xff1a; “编辑”&#xff08;Edit&#xff09;>进入偏好设置&#xff08;Preferences setting&#xff09;>…

文件粉碎销毁 硬盘粉碎销毁 废弃的文件如何销毁

废弃的文件可以采用多种方法进行销毁&#xff0c;具体取决于文件的敏感性和数量。以下是一些常见的废弃文件销毁方法&#xff1a; 1. 机械粉碎&#xff1a;这是一种常见的方法&#xff0c;尤其适用于含有敏感信息的文件。可以使用碎纸机将文件切碎&#xff0c;对于小批量的资料…

Python新手如何制作植物大战僵尸?这篇文章教会你!

引言 《植物大战僵尸》是一款非常受欢迎的塔防游戏&#xff0c;玩家需要种植各种植物来抵御僵尸的进攻。在这篇文章中&#xff0c;我们将使用Python编写一个简化版的植物大战僵尸游戏&#xff0c;以展示如何使用Python创建游戏。 游戏规则 玩家将种植不同类型的植物来防御僵尸…

微软“蓝屏”事件:对全球IT基础设施韧性与安全性的深刻反思

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

【ai】windows ollama安装qwen

可以直接github下载,或者官方网站下载:参考大神的介绍当前最新0.28安装windows的预览版本,出现一个服务? 直接跑会TLS超时? 配置代理 export https_proxy=http://192.168.50.65:7890 export http_proxy

JavaWeb笔记_Session

Session概述 Session是一种在服务端记录用户会话信息的技术 Session的创建和获取 /*** HttpServletRequest对象中的方法:* public HttpSession getSession()* 如果当前服务端没有session,那就在服务端新建一个session对象* 如果在服务端有这个session,那么就直…

【C++】类和对象之继承

目录 继承的概念和定义 继承的概念 继承的定义 继承的定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 访问权限实例 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 继承的…

别再只知道埋头苦学python了!!学了python后月入1w不在话下,不准你还不知道!!!

在Python接单的过程中&#xff0c;掌握一些技巧、注意相关事项以及选择合适的接单平台是非常重要的 一、Python接单要注意哪些 报酬问题&#xff1a;在接单前&#xff0c;务必明确客户所说的报酬是税前还是税后&#xff0c;以避免后期产生纠纷。时间管理&#xff1a;不要与客户…

nacos get changed dataId error, code: 403

nacos get changed dataId error, code: 403问题解决 问题出现原因&#xff1a;解决办法&#xff1a;需要在运行项目的配置添加权限账号和密码,重启服务 问题出现原因&#xff1a; 由于nacosserver开启了权限验证&#xff0c;项目启动时出现异常 nacos.core.auth.caching.ena…

Java基础06:变量,常量,作用域(狂神说Java)

一.变量 有了static&#xff0c;即类变量&#xff0c;就可以不用new了可以直接调用&#xff0c;类变量之后再细讲 二.常量 三.变量的命名规范

权限(linux)

权限就是文件权限&#xff08;linux万物皆文件&#xff09; 本文主要涉及文件/文件夹权限 涉及指令&#xff1a; shell&#xff1a; kernal &#xff1a; linux内核 shell &#xff1a; 外壳 shell可以方便交互与操作 bash是一个具体的shell su su 切换用户 su -root 变…

AppInventor导入导出项目以及打包apk安装包

AppInventor导入导出项目以及打包apk安装包 1.概述 当项目开发好了之后&#xff0c;如果想将项目分享给其他人&#xff0c;或者导入其他人开发的项目怎么办那。 如果给其他人安装你的项目&#xff0c;如何安装那&#xff1f; 2.自带导出和导入功能 导出项目&#xff0c;在P…