JavaScript基础

简介: 本文详解JavaScript核心概念:变量类型(值类型与引用类型)、typeof检测、===与==区别及应用场景、内置函数、原型链规则与属性查找机制、instanceof原理,以及函数声明与表达式差异和执行上下文(全局、函数、eval)与调用栈机制。

1 变量类型和计算

1.1 值类型和引用类型的区别?

  1. 值类型:每个变量都会存储各自的值。不会相互影响
  2. 引用类型:不同变量的指针执行了同一个对象(数组,对象,函数)

1.2 typeof可以及检测的数据类型有哪些?

Note

  • 基本数据类型:Undefined null bool string number
  • 关键点:typeof只能区分值类型,不能区分引用类型
  • JS中的基本数据类型:null, undefined, bool, string, number(typeof可以区分除了null以外的四种值类型)
  • typeof 6种类型:Object({},[],null), Undefined, Boolean, Number, Function, String
  • typeof可以区分值类型,typeof null = Object

1.3 JS中===和==的区别?

1.3.1 区别?

== 会进行强制类型转换之后再比较,=== 不会进行强制类型转换的

1.3.2 应用场景?

  1. (用于判断对象属性是否存在):if (obj == null) ===>>> 等价于if (obj == null || obj == undefined),可以简化代码,其他情形都使用===进行比较
  2. 用于判断函数的参数是否存在: function(a, b){ if(a == null) { // ... }}
  3. 对于函数内部或者是一个对象的参数进行判断只会出现undefined, 而不会报错(慎用)

1.3.3 其他?

js中类型转换为false的有哪些(6种):null, undefined, NaN, '', false, 0

1.4 JS中的内置函数有哪些?

Note

  • 内置函数: Object Array Boolean Number String Function Date RegExp Error
  • 内置对象:Math, JSON

2 原型和原型链

2.1 原型链的5条规则

  1. 所有的引用类型(数组,对象,函数),都是具有对象特性的,即可以自由扩展属性(除了null以外)
  2. 所有的引用类型(数组、对象、函数),都有一个proto 属性(隐式原型),这个属性的值是一个普通对象
  3. 所有的函数,都有一个prototype属性(显式原型),这个属性值是一个普通的对象
  4. 所有的引用类型(数组、对象、函数),proto的属性值指向(完全相等)它的构造函数的“prototype”的属性值
  5. 当试图得到一个对象的某一个属性的时候,如果一个对象本身没有这个属性的话,就会去它的proto( 也就是它的构造函数中去寻找这个属性)

2.2 JS中寻找对象属性的过程

  1. 当一个对象没有这个toString()这个属性的时候,就回去自己的隐式原型proto中去寻找这个属性,也就是去自己额构造函数的显示原型prototype中寻找这个属性(对象自身的隐式原型就是他的构造函数的显式原型)
  2. 发现FOO.prototype中也没有这个toString属性,这也是一个对象,name就去这个对象{}的proto中寻找toString()这个属性

2.3 instanceof的作用?

是用于判断【引用类型】属于哪个【构造函数】的方法

Note

总结:f.proto 一层一层向上寻找,能否找到FOO.prototype,找到为true,否则为false

3 作用域和闭包

3.1 函数表达式和函数声明的区别?

  1. 函数声明中函数名是必须的,函数表达式中则是可选的。
  2. 用函数声明定义的函数,函数可以在函数声明之前调用,而用函数表达式定义的函数则只能在声明之后调用。Note

总结:( 根本原因在于解析器对于这两种定义方式读取的顺序不同:解析器会实现读取函数声明,即函数声明放在任意位置都可以被调用;而对于函数表达式,解析器只有在读到函数表达式所在那一行时才会开始执行)

3.2 对执行上下文的理解?

Note

执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。JavaScript中的运行环境大概包括三种情况。

  • a. 全局环境:JavaScript代码运行起来会首先进入的环境
  • b. 函数环境:当函数被调用执行时,会进入被调用的函数中执行代码
  • c. eval(不推荐使用会对JS的执行效率产生影响)

因此在一个JavaScript程序中,必定会产生多个执行上下文,JavaScript引擎会以栈的方式来处理它们,这个栈,我们称其为函数调用栈(call stack)。栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。当代码在执行过程中,遇到以上三种情况,都会生成一个执行上下文,放入栈中,而处于栈顶的上下文执行完毕之后,就会自动出栈。

相关文章
|
1天前
|
运维 安全 算法
别再把端到端加密当护身符了:多租户系统里,合规比加密更难
别再把端到端加密当护身符了:多租户系统里,合规比加密更难
53 17
|
8天前
|
机器学习/深度学习 自然语言处理 算法
从贝叶斯视角解读Transformer的内部几何:mHC的流形约束与大模型训练稳定性
大模型训练常因架构改动破坏内部贝叶斯几何结构,导致不稳定。研究表明,Transformer通过残差流、注意力与值表征在低维流形上实现类贝叶斯推理。mHC通过约束超连接保护这一几何结构,确保规模化下的训练稳定与推理一致性。
187 7
从贝叶斯视角解读Transformer的内部几何:mHC的流形约束与大模型训练稳定性
|
1月前
|
Kubernetes Cloud Native Nacos
MCP 网关实战:基于 Higress + Nacos 的零代码工具扩展方案
本文介绍一种基于开源 Higress 与 Nacos 的私有化 MCP 智能体网关架构,实现工具动态注册、Prompt 实时更新、多租户安全隔离,并支持在无外网、无 Helm 的生产环境中一键部署。
315 25
MCP 网关实战:基于 Higress + Nacos 的零代码工具扩展方案
|
1月前
|
监控 Kubernetes 调度
干货推荐:容器可观测新视角—SysOM 延时抖动监控助力定位业务抖动原因
为了解决这一挑战,本文将结合实战案例,介绍如何在 Kubernetes 环境中使用 ack-sysom-monitor Exporter 对内核延迟进行可视化分析与定位,帮助你快速识别问题根因,并高效缓解由延迟引发的业务抖动。
|
1天前
|
存储 弹性计算 人工智能
阿里云服务器租用费用价格表(2026年最新)一年、1个月和1小时收费
2026年阿里云服务器最新价格出炉,涵盖轻量应用服务器、ECS、GPU服务器等多种类型。38元/年起秒杀轻量服务器,99元/年畅享2核2G配置,按月、按小时灵活计费,支持个人开发、企业建站及AI计算全场景需求,高性价比优选。
77 12
|
12天前
|
监控 安全 Unix
iOS 崩溃排查不再靠猜!这份分层捕获指南请收好
从 Mach 内核异常到 NSException,从堆栈遍历到僵尸对象检测,阿里云 RUM iOS SDK 基于 KSCrash 构建了一套完整、异步安全、生产可用的崩溃捕获体系,让每一个线上崩溃都能被精准定位。
194 29