前端进阶--深入理解JavaScript

news2024/11/25 0:44:57

1、JS的作用域和作用域链

  • 作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和函数。
  • 作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(也就是全局对象)始终是作用域链的最后一个对象。
  • 当我们查找一个变量时,如果当前执行环境中没有找到,我们可以沿着作用域链向后查找。

2、函数表达式和函数申明

函数声明存在变量提升,会被提升到作用域最前面。
函数表达式,不会被提升,仍然按照从上往下读取。
函数的4种类型:函数声明、箭头函数、函数表达式、函数对象

// 1️⃣:函数声明
async function fn() {
  await f()
}
// 2️⃣:函数表达式
const fn = async function () {
  await f()
};
// 3️⃣:箭头函数
const fn = async () => {
  await f()
};
// 4️⃣:async函数定义在对象中
const obj = {
  async fn() {
      await f()
  }
}

3、原型,原型链

参考阅读: 深入理解JavaScript5:强大的原型和原型链
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype 所以这就是我们新建的对象为什么能够使用 toString() 等方法的原因。
在这里插入图片描述

4、this指向及apply call bind 的区别

this ,函数执行的上下文,可以通过 apply , call , bind 改变 this 的指向。对于匿名函数或者直接调用的函数来说,this指向全局上下文(浏览 器为window,NodeJS为 global ),剩下的函数调用,那就是谁调用它, this 就指向谁。当然还有es6的箭头函数,箭头函数的指向取决于该箭头函 数声明的位置,在哪里声明, this 就指向哪里。

5、变量提升

推荐阅读:深入理解JavaScript系列:变量对象Variable Object
当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境。在生成执行环境时,会有两个阶段。第一个阶段是创建的阶段,JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined ,所以在第二个阶段,也就是代码执行阶段,我们可以直接提前使用

6、JS的继承

原型链继承、借用构造函数继承、组合继承(组合原型链继承和借用构造函数继承)(常用)、原型式继承、寄生组合式继承(常用)
推荐阅读:JS继承的6种方式

7、new操作符具体干了什么呢

  • 1、创建了一个空的js对象(即{})
  • 2、设置原型,将对象的原型设置为函数的 prototype 对象
  • 3、将空对象作为构造函数的上下文(改变this指向)
  • 4、判断构造函数的返回值类型,如果是值类型,则返回新对象。如果是引用类型,就返回这个引用类型的对象
/*   create函数要接受不定量的参数,第一个参数是构造函数(也就是new操作符的目标函数),
其余参数被构造函数使用。   
new Create() 是一种js语法糖。我们可以用函数调用的方式模拟实现 */
function create(Con,...args){    
//1、创建一个空的对象    
 let obj = {}; // let obj = Object.create({});     
//2、将空对象的原型prototype指向构造函数的原型     
Object.setPrototypeOf(obj,Con.prototype); // obj.__proto__ = Con.prototype     
//3、改变构造函数的上下文(this),并将剩余的参数传入    
 let result = Con.apply(obj,args);    
//4、在构造函数有返回值的情况进行判断     
return result instanceof Object?result:obj;}

这里需要注意对构造函数返回值的判断
在new的时候,会对构造函数的返回值做一些判断:
1、如果返回值是基础数据类型,则忽略返回值;
2、如果返回值是引用数据类型,则使用return 的返回,也就是new操作符无效

8、闭包的概念及应用和缺陷

推荐阅读:深入理解JavaScript系列:闭包(Closures)

9 、箭头函数

箭头函数以及和普通函数的区别

10、事件循环 eventLoop 宏任务 微任务

JavaScript事件循环与实践应用

11、Promise async await Promis.all 和 Promic.race的区别

Promise对象与宏任务、微任务

12、ES6语法

阮一峰 ECMAScript 6入门

13、global对象、window对象、document对象

14、什么是堆?什么是栈?它们之间有什么区别和联系?

  • 堆和栈的概念存在于数据结构中和操作系统内存中。
  • 在数据结构中,栈中数据的存取方式为先进后出。而堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。完全
  • 二叉树是堆的一种实现方式。 在操作系统中,内存被分为栈区和堆区。
  • 栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 堆区内存一般由程序员分配释放,若程序员不释放,程序结束时可能由垃圾回收机制回收。

15、如何将浮点数点左边的数每三位添加一个逗号

function format(number) {
  return number && number.replace(/(?!^)(?=(\d{3})+\.)/g, ",");
}

16、JavaScript 常用函数图解

在这里插入图片描述

17、 prototype、__proto__与constructor

  1. 我们需要牢记两点:
    ①__proto__和constructor属性是对象所独有的;
    ② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
  2. __proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,然后返回undefined,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链
  3. prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.proto === Foo.prototype
  4. constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function

18、import动态引入

/** moduleA.ts */
export default function testA() {
  console.log('this is A');
  const name = 'testA';
  return name;
}


/** moduleB.ts */
export default function testB() {
  const name = 'testB';
  console.log('this is B');
  return name;
}


/**main.vue*/
import testA from './moduleA';
onMounted(() => {
  testA();
  // 动态引入moduleB
  import('./moduleB').then(module => {
    module.default();
    console.log('log内容testb', module.default.name);
  });
  console.log('log内容testA', testA.name);
});
/**输出
this is A
log内容testA testA
this is B
log内容testb testB
*/

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

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

相关文章

openpnp - use STM32 arduino on SchultzController

文章目录 openpnp - use STM32 arduino on SchultzController概述笔记官方的起始文档增加arduino第三方开发板库索引地址改好后, 能编译过的工程SchultzController.inoFeeder.hFeeder.cpp再验证一下内存是否够用补充 - 如果是自己做的板子END openpnp - use STM32 arduino on S…

开发者福利!李彦宏将在百度世界大会手把手教你做AI原生应用

目录 一、写在前面 二、大模型社区 2.1 加入频道 2.2 创建应用 一、写在前面 1. “把最先进的技术用到极致,把最先进的应用做到极致。” 2. “每个产品都在热火朝天地重构,不断加深对AI原生应用的理解。” 3. “这就是真正的AI原生应用,这…

深度学习修炼(三)卷积操作 | 边界填充、跨步、多输入输出通道、汇聚池化

文章目录 1. 卷积基本操作2 现代卷积进阶武器操作2.1 边界 填充2.2 跨步 步幅2.3 多输入输出通道2.4 汇聚 池化 3. 卷积层设计 之前我们讲了 线性分类器 深度学习修炼(一)线性分类器 | 权值理解、支撑向量机损失、梯度下降算法通俗理解_Qodi的博客-CSDN博…

看完这篇 教你玩转渗透测试靶机Vulnhub——Toppo: 1

Vulnhub靶机Toppo: 1渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:①:信息收集:②:SSH登入:③:SUID提权(python2.7):④&#x…

JAVA面经整理(2)

一)解决哈希冲突的方法有哪些? 哈希冲突指的是在哈希表中,不同的键值映射到了相同的哈希桶,也就是数组索引,导致键值对的冲突 1)设立合适的哈希函数:通过哈希函数计算出来的地址要均匀的分布在整个空间中 2)负载因子调节: 2.1)开放…

Python yaml 详解

文章目录 1 概述1.1 特点1.2 导入 2 对象2.1 字典2.2 数组2.3 复合结构 3 操作3.1 读取3.2 写入 1 概述 1.1 特点 yaml 文件是一种数据序列化语言,广泛用于配置文件、日志文件等特点: ① 大小写敏感。② 使用缩进表示层级关系。缩进时不允许使用 Tab 键…

【VastbaseG100】 FATAL: The account has been locked.

使用VastbaseG100 数据库,查询数据报错。 org.postgresql.util.PSQLException: FATAL: The account has been locked. 帐户已被锁定。 解锁账户呗 ALTER ROLE doc ACCOUNT UNLOCK;ALTER ROLE 用户名 ACCOUNT UNLOCK; 修改密码 ALTER ROLE doc IDENTIFIED BY ZhangS…

【实战项目之个人博客】

目录 项目背景 项目技术栈 项目介绍 项目亮点 项目启动 1.创建SSM(省略) 2.配置项目信息 3.将前端页面加入到项目中 4.初始化数据库 5.创建标准分层的目录 6.创建和编写项目中的公共代码以及常用配置 7.创建和编写业务的Entity、Mapper、…

【操作系统笔记】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序: ① 当前运行的进程:陷阱程序(系统调用) 和 故障程序(page fault) ,进程运行在内核态的时候,其实就是在执行进程在用户态触发的…

Qt使用I.MX6U开发板上的按键(原理:将电脑键盘方向键↓在Qt中的枚举值与开发板中按键定义的枚举值一致,这样电脑端测试效果就与开发板的一致)

在上篇介绍了Qt点亮I.MX6U开发板的一个LED,对于Qt控制I.MX6U开发板的一个蜂鸣器原理也是一样的,就不做详细介绍,具体可参考Qt控制I.MX6U开发板的一个蜂鸣器,本篇介绍Qt使用I.MX6U开发板上的按键的相关内容。 文章目录 1. 开发板硬…

第一个 Go 程序“hello,world“ 与 main 函数

第一个 Go 程序"hello,world" 与 main 函数 文章目录 第一个 Go 程序"hello,world" 与 main 函数一.创建“hello,world”示例程序二. “hello,world” 程序结构拆解三、main 函数四、Go 语言中程序是怎么编译…

selenium+python实现基本自动化测试

安装selenium 打开命令控制符输入:pip install -U selenium 火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回…

坚鹏:浙江农商联合银行同业核心产品解读与差异化分析培训第7期

浙江农商联合银行同业核心产品解读与差异化分析培训第7期 1952年,浙江第一家农村信用社成立。2004年4月18日,浙江省农信联社成立,承担对全省农信社的管理、指导、协调和服务职能。2021年10月,经国务院批准同意、银保监会批复&…

多目标优化算法:基于非支配排序的鱼鹰优化算法(NSOOA)MATLAB

一、鱼鹰优化算法 鱼鹰优化算法(Osprey optimization algorithm,OOA)由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出,其模拟鱼鹰的捕食行为。 Python:鱼鹰优化算法(Osprey optimization algorithm&a…

自动驾驶中的决策规划

参考: 【干货篇】轻舟智航:自动驾驶中的决策规划技术(附视频回放 PPT 下载) - AIQ 如图所示, 各模块介绍 定位模块主要负责解答的问题是“车现在在哪里”,是在道路上还是在路口,是在高架桥上还是在停车场里。 感知…

图像锐化,求图像锐化后的图像(数字图像处理大题复习 P6)

文章目录 1. 梯度差分方法 & 罗伯特差分法梯度差分方法罗伯特差分法使用梯度差分法解决本题 2. 有阈值 (T4) 的二值图像输出 用不同图像输出方法求图像锐化后的图像 g(x, y) 梯度图像直接输出设阈值 T4,求二值图像输出 1. 梯度差分方法 & 罗伯特差分法 梯度…

C++ Qt零基础入门进阶与企业级项目实战教程与学习方法分享

Qt是一个卓越的客户端跨平台开发框架,可以在Windows、Linux、macOS进行客户端开发,无缝切换,一统三端;当然除了桌面端,在移动端的早期,Qt也展现了其多才多艺,在Android和ios也可以使用Qt编写app…

外部打开微信小程序支付,H5 、APP

手机浏览器H5打开微信小程序支付,自定义传参_h5调起微信小程序支付_我是小木木的博客-CSDN博客H5网站打开小程序,调用小程序支付功能_h5调起微信小程序支付https://blog.csdn.net/chen_mumu119/article/details/132104048

**20.迭代器模式(Iterator)

意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 上下文:集合对象内部结构常常变化各异。对于这些集合对象,能否在不暴露其内部结构的同时,让外部Client透明地访问其中包含的元素…

大数据+大模型的尽头——数据分析师的未来会怎样?

大数据大模型的尽头一定是干掉数据分析师吗? | 近匠