# JavaScript 核心概念# 🌐 JavaScript 是什么?定义 :运行在客户端的 解释型
脚本语言核心作用 : ✅ 网页特效 - 响应用户行为实现动态交互 ✅ 表单验证 - 对输入数据进行合法性校验 ✅ 数据交互 - 前后端数据通信与渲染 🚀 服务端开发 - Node.js 运行时环境📌 特性:单线程 / 事件驱动 / 非阻塞 I/O
# 🧱 JavaScript 组成体系# 1. ECMAScript
(语言基础)<pre class="mermaid">graph TD ES [ECMAScript] --> 语法 ES --> 类型系统 ES --> 关键字 ES --> 内置对象 </pre>
# 2. Web APIs
(浏览器扩展)模块 功能描述 典型 API 示例 DOM 文档对象模型 <br> 操作页面元素 querySelector()
<br> addEventListener()
BOM 浏览器对象模型 <br> 控制浏览器行为 alert()
<br> localStorage
const JavaScript = { ECMAScript : { version : 'ES2022' , features : [ '箭头函数' , 'Promise' , '解构赋值' ] } , WebAPIs : { DOM : [ '节点操作' , '事件处理' ] , BOM : [ '窗口控制' , '历史记录' ] } } ;
# 🔑 核心知识总结# 1. ECMAScript 三要素<pre class="mermaid">pie title 语言基础组成 "变量与类型系统" : 35 "流程控制" : 25 "函数与作用域" : 40</pre>
# 2. Web APIs 能力矩阵分类 关键能力 典型应用场景 DOM 节点操作 / 事件监听 / 样式控制 动态表单 / 页面交互 BOM 窗口控制 / 存储 / 导航 本地存储 / 页面跳转
# 3. 执行机制要点console. log ( 'Start' ) ; setTimeout ( ( ) => console. log ( 'Timeout' ) , 0 ) ; Promise. resolve ( ) . then ( ( ) => console. log ( 'Promise' ) ) ; console. log ( 'End' ) ;
# 4. 关键概念对比概念 特点 示例 var/let/const
作用域 / 提升 / 重复声明 let
块级作用域== vs ===
类型转换差异 0 == false
→ true同步 / 异步 执行队列优先级 Promise > setTimeout
# 5. DOM 操作三步骤获取元素 querySelector()
/ getElementById()
绑定事件 addEventListener('click', handler)
更新状态 修改 className/style/innerHTML
等属性📌 来自当前案例的最佳实践: 在按钮切换样式中,通过 className
属性更新类名实现状态切换,注意这会覆盖原有类名
💡 扩展阅读:MDN Web Docs - JavaScript 指南
# JavaScript 书写位置# 📍 代码组织方式# 1. 内部脚本(Internal)<! DOCTYPE html > < html> < body> < script> console. log ( '内部脚本执行' ) ; </ script> </ body> </ html>
特点 :
🟢 快速原型开发 🔴 难以维护 / 复用 ⚠️ 多个脚本按顺序执行 # 2. 外部脚本(External)< head> < script src = " app.js" defer > </ script> </ head>
模块化方案 : <pre class="mermaid">graph LR HTML --> Script [script 标签] Script --> JS [JS 文件] JS --> Function [功能模块] Function --> Export [导出] HTML --> Import [导入使用]</pre>
加载策略 执行时机 适用场景 defer
DOM 解析后顺序执行 常规依赖 async
异步加载立即执行 独立第三方库
# 3. 内联脚本(Inline) ⚠️慎用< button onclick = " handleClick ( ) " > 点击</ button>
替代方案 :
document. querySelector ( 'button' ) . addEventListener ( 'click' , handleClick) ;
三种方式对比 :
类型 可维护性 缓存 适用场景 内部 ★☆☆☆☆ 无 快速测试 / 小型项目 外部 ★★★★★ 有 中大型项目 内联 ★☆☆☆☆ 无 特殊演示场景
📌 最佳实践 :
生产环境推荐使用 外部脚本+defer
避免混用多种加载方式 使用 ES Module 实现现代模块化 # JavaScript 输入输出语法# 💻 输出方式对比<pre class="mermaid">flowchart TD A [输出方式] --> B [页面输出] A --> C [控制台输出] A --> D [弹窗输出] B --> B1{document.write} C --> C1{console.log} D --> D1{alert}</pre>
# 1. 页面内容输出< script> document. write ( '<h3>动态内容</h3>' ) ; document. write ( '<p style="color:blue">异步内容</p>' ) ; </ script>
特点 :
🟢 快速插入内容 🔴 覆盖已有文档流(在已加载的页面中使用会清空内容) ⚠️ 仅适合初始化阶段使用 # 2. 控制台输出console. debug ( '调试信息' ) ; console. warn ( '警告信息' ) ; console. error ( '错误信息' ) ;
调试技巧 : <pre class="mermaid">pie title 控制台使用频率 "console.log" : 65 "断点调试" : 25 "其他方法" : 10</pre>
# 3. 弹窗输出# ⌨️ 输入方式const userName = prompt ( '请输入用户名:' ) ;
输入处理流程 : <pre class="mermaid">sequenceDiagram 用户 ->> 浏览器:点击确认 浏览器 ->>JS: 返回输入值 用户 ->> 浏览器:点击取消 浏览器 ->>JS: 返回 null</pre>
# ⚡ 执行特性# 代码执行优先级同步代码 > 弹窗交互 > DOM 渲染 示例现象: < script> alert ( '阻断渲染' ) ; document. write ( '内容' ) ; </ script>
# 最佳实践建议场景 推荐方式 原因 调试信息 console.debug 无副作用 / 分类明确 用户交互 自定义模态框 样式可控 / 体验更好 页面初始化 document.write 便捷高效 生产环境日志 console.info 便于日志收集
⚠️ 注意事项 :
alert () 会阻塞事件循环,现代前端框架中已较少使用 prompt () 返回值需做类型检查:const input = prompt() || 'default'
# JavaScript 变量使用指南# 📦 变量声明三剑客<pre class="mermaid">flowchart TD A [声明方式] --> B ["var(旧标准)"] A --> C ["let(块级作用域)"] A --> D ["const(常量)"]</pre>
# 声明方式对比特性 var let const 作用域 函数级 块级 块级 重复声明 ✅允许 ❌禁止 ❌禁止 暂时性死区 ❌不存在 ✅存在 ✅存在 变量提升 ✅声明提升 ❌ ❌ 初始值要求 ❌不需要 ❌不需要 ✅必须
# 🔧 使用场景示例# 1. 基础使用let count = 0 ; const MAX_SIZE = 100 ; var oldVar = '弃用' ; count = count + 1 ;
# 2. 作用域差异function demo ( ) { if ( true ) { var a = 1 ; let b = 2 ; const c = 3 ; } console. log ( a) ; }
# 3. 变量提升现象console. log ( x) ; var x = 5 ; let y = 10 ;
# 🚩 最佳实践# 命名规范<pre class="mermaid">pie title 命名风格 "camelCase" : 65 "CONSTANT_CASE" : 25 "其他" : 10</pre>
基础规则 :
语义化命名 :
let a = 3600 ; const MAX_TIMEOUT_MS = 3600 ; let userLoginToken;
# 使用建议优先使用 const
,其次 let
,不用 var
使用 'use strict'
开启严格模式 复杂对象使用 Object.freeze()
创建深层常量const config = Object. freeze ( { api : 'https://api.example.com' } ) ;
# ❗ 常见问题# 1. 未声明变量function demo ( ) { count = 10 ; }
# 2. 动态类型陷阱let price = 100 ; price = '$100' ;
# 3. 闭包引用for ( var i= 0 ; i< 3 ; i++ ) { setTimeout ( ( ) => console. log ( i) , 100 ) ; }
💡 调试技巧:使用 typeof
检查类型:console.log(typeof count); // "number"
# 变量存储原理与命名规范# 🧠 变量本质与内存管理let a = 10 ; a = 'text' ; let b = a;
# 核心概念内存单元
每个变量占用特定内存空间 大小由数据类型决定(Number: 8 字节,Boolean: 1 字节...) 变量生命周期
声明阶段 → 分配内存 赋值阶段 → 写入数据 使用阶段 → 读取数据 销毁阶段 → 内存释放(垃圾回收) 特殊现象
let arr1 = [ 1 , 2 ] ; let arr2 = arr1; arr2. push ( 3 ) ; console. log ( arr1) ;
# 📝 命名规则(强制遵守)# 语法规则✅ 允许字符:字母 / 数字 / 下划线 (_)/ 美元符 ($) ✅ 开头禁止:数字开头无效( let 2name; // ❌
) ✅ 大小写敏感: name
≠ Name
✅ 保留字禁用: let class = 'test'; // ❌
# 作用域规则function test ( ) { var localVar = '局部' ; let blockVar = '块级' ; }
# 🎨 命名规范(推荐遵守)# 基础原则规范类型 正确示例 错误示例 语义化命名 userAge
a
避免单个字母 index
i
(循环变量除外)常量全大写 MAX_SIZE
maxSize
布尔值前缀 isValid
/ hasToken
check
# 进阶建议项目一致性
选择一种命名风格(camelCase/PascalCase)并统一 避免缩写
calculatePrice
而非 calcPrc
类型暗示
const users = [ 'Alice' , 'Bob' ] ; function validateForm ( ) { } let loginAsync = fetch ( '/api' ) ;
# ⚠️ 注意事项严格模式要求 全局污染风险 function setGlobal ( ) { globalVar = '危险!' ; }
命名冲突检测 # 数组操作基础# 🧩 数组声明与初始化let fruits = [ '苹果' , '香蕉' ] ; let numbers = new Array ( 1 , 2 , 3 ) ; let mixed = [ 1 , '文本' , true , { name : '对象' } ] ;
# 声明方式对比方式 可读性 特殊场景 注意点 字面量 ★★★★★ 常规初始化 首选方式 构造函数 ★★☆☆☆ 创建空数组 / 指定长度数组 new Array(3)
创建长度为 3 的空槽数组
# 🔍 数据访问与操作let firstFruit = fruits[ 0 ] ; fruits[ 2 ] = '橘子' ; let count = fruits. length; console. log ( fruits[ 5 ] ) ;
# 索引规则索引类型 示例 返回值 安全性 有效正索引 arr[0] 元素值 ✅安全 负索引 arr[-1] undefined ⚠️需转换 超范围索引 arr[100] undefined ⚠️注意 非整数索引 arr[1.5] undefined ⚠️无效
# 🌟 数组特性# 1. 动态类型支持let smartArray = [ 100 , '字符串' , { type : '对象' } , [ 1 , 2 ] , function ( ) { return '函数' } ] ;
# 2. 长度动态变化let arr = [ ] ; arr[ 5 ] = '跳跃赋值' ; console. log ( arr. length) ; console. log ( arr) ;
# 3. 引用类型特性let a = [ 1 , 2 ] ; let b = a; b. push ( 3 ) ; console. log ( a) ;
# 🚩 最佳实践初始化建议 :
let arr = [ ] ; let arr = new Array ( ) ; let nums = Array ( 5 ) . fill ( 0 ) ;
安全访问技巧 :
let last = arr[ arr. length - 1 ] || '默认值' ; let value = arr?. [ 10 ] ?? '不存在' ;
类型检测 :
console. log ( typeof [ ] ) ; console. log ( Array. isArray ( [ 1 , 2 ] ) ) ;
⚠️ 常见错误 :
混淆索引与长度: arr[arr.length] = ...
导致越界 误用对象语法: arr{0: '错误'}
应该用方括号 跳过索引赋值: arr[5] = ...
产生空位 # 常量声明与使用规范# 🚨 核心特性const PI = 3.14159 ; const USER = { name : 'Alice' } ; USER . age = 25 ;
# 常量 vs 变量特性 const
let
重新赋值 ❌ ✅ 块级作用域 ✅ ✅ 必须初始化 ✅ ❌ 提升行为 TDZ(暂时性死区) TDZ(暂时性死区)
# 📝 声明与使用# 1. 基础语法# 2. 引用类型处理const COLORS = [ 'red' , 'green' ] ; COLORS . push ( 'blue' ) ; const CONFIG = { debug : true } ; CONFIG . debug = false ;
# 3. 深度冻结技巧const IMMUTABLE_OBJ = Object. freeze ( { key : 'value' } ) ;
# 🚩 最佳实践# 命名规范<pre class="mermaid">pie title 常量命名风格 "全大写 + 下划线" : 75 "PascalCase" : 15 "其他" : 10</pre>
基础规则 :
全大写字母 + 下划线分隔( MAX_RETRIES
) 位于文件顶部集中声明 优先用于配置项和魔法数字 使用场景 :
const GOLDEN_RATIO = 1.618 ; const API_ENDPOINT = 'https://api.example.com' ; const HTTP_CODES = Object. freeze ( { OK : 200 , NOT_FOUND : 404 } ) ;
# ⚠️ 注意事项# 1. 暂时性死区(TDZ)# 2. 重复声明检查# 3. 浏览器兼容# 4. 引用类型陷阱const USERS = [ 'Alice' ] ; USERS = [ 'Bob' ] ; USERS [ 0 ] = 'Bob' ; Object. freeze ( USERS ) ;
💡 扩展技巧 : 使用 Object.defineProperty()
创建不可配置、不可写的属性:
const CONST_DATA = { } ; Object. defineProperty ( CONST_DATA , 'value' , { value : 100 , writable : false , configurable : false } ) ;
# JavaScript 数据类型体系# 📌 两大分类<pre class="mermaid">graph LR A [数据类型] --> B [基本类型] A --> C [引用类型] B --> 数字 B --> 字符串 B --> 布尔 B --> Undefined B --> Null B --> Symbol C --> 对象 C --> 数组 C --> 函数 </pre>
# 🔢 数字类型(Number)let price = 99 ; let score = 89.5 ; let temp = - 40 ; let result = 0 / 0 ;
# 特殊值处理值 说明 示例 Infinity
超出数值范围的极大数 1.7976931348623157E+10308
-Infinity
超出数值范围的极小数 -1.7976931348623157E+10308
NaN
无效数学操作的结果(具有粘性) 0/0 → NaN
, NaN + 5 → NaN
# 📜 字符串类型(String)let s1 = "双引号" ; let s2 = '单引号' ; let s3 = ` 模板字符串: ${ s1} 和 ${ s2} ` ;
# 模板字符串特性const poem = ` 床前明月光 疑是地上霜` ; console. log ( ` 结果: ${ 2 + 3 * 4 } ` ) ;
# 转义字符表符号 含义 示例 \n
换行 "第一行\n第二行"
\\
反斜杠 "路径:C:\\"
\t
制表符 "姓名\t年龄"
# 🎲 布尔类型(Boolean)let isLogin = true ; let hasPermission = false ;
# 逻辑运算规则操作 结果 说明 true && 5
5 返回最后一个真值 false || 0
0 返回最后一个假值 !''
true 空字符串转为 false 取反
# ❓ Undefined 与 Nulllet uninitialized; let emptyObj = null ;
# 对比差异特性 Undefined Null 类型检测 "undefined"
"object"
产生场景 变量未初始化时 显式赋空值时 等同性检测 ==
返回 true===
返回 false
# 🔍 类型检测typeof 42 ; typeof 'text' ; typeof true ; typeof null ; typeof function ( ) { } ;
# 检测技巧function isNull ( value ) { return value === null ; } Array. isArray ( [ 1 , 2 ] ) ;
# 类型转换指南# 🔄 转换类型对比<pre class="mermaid">graph TD A [类型转换] --> B [隐式转换] A --> C [显式转换] B --> D [算术运算自动转换] B --> E [逻辑运算自动转换] C --> F["Number()"] C --> G["parseInt()"] C --> H["parseFloat()"]</pre>
# 🕵️ 隐式转换规则# 运算符行为差异运算符 转换规则 示例 结果 + 任意操作数为字符串则字符串拼接 '3' + 2
"32" - * / 全部转换为数字进行运算 '8' - '3'
5 == 类型转换后比较 '5' == 5
true === 严格不转换比较 '5' === 5
false
# 实用技巧let price = + '99.5' ; let count = '10' * 1 ; console. log ( 2 + '2' ) ;
# 🔧 显式转换方法# 1. Number()Number ( '123' ) Number ( '12.3元' ) Number ( true ) Number ( '' )
# 2. parseInt()parseInt ( '12px' ) parseInt ( '101' , 2 ) parseInt ( '3.9' )
# 3. parseFloat()parseFloat ( '3.14.15' ) parseFloat ( '¥99.9' )
# ⚠️ 注意事项NaN 特性 :
typeof NaN ; NaN === NaN ; isNaN ( '字符串' ) ; Number. isNaN ( '字符串' ) ;
空值处理 :
Number ( null ) Number ( undefined )
布尔转换 :
Number ( false ) Number ( true )
💡 最佳实践 :表单输入处理优先使用 parseFloat
组合验证
let input = '¥99.5' ; let value = parseFloat ( input. replace ( / [^\d.] / g , '' ) ) || 0 ;
# JavaScript 运算符详解# 💰 赋值运算符运算符 示例 等价于 说明 =
x = 5
- 基础赋值 +=
x += 3
x = x + 3
加法赋值 -=
x -= 2
x = x - 2
减法赋值 *=
x *= 4
x = x * 4
乘法赋值 /=
x /= 2
x = x / 2
除法赋值 %=
x %= 3
x = x % 3
取余赋值
let count = 10 ; count += 5 ; count **= 2 ;
# 🔢 一元运算符<pre class="mermaid">flowchart TD A [一元运算符] --> B [算术运算] A --> C [类型转换] B --> 自增 / 自减 C --> 正负号转换 </pre>
# 常用操作符运算符 示例 说明 ++
x++
后置自增(先返回值再 + 1) --
--x
前置自减(先 - 1 再返回值) +
+'5'
转换为数字 -
-true
转换为数字并取反 → -1 !
!0
逻辑非 → true
let a = 5 ; console. log ( a++ ) ; console. log ( ++ a) ;
# ⚖️ 比较运算符运算符 说明 示例 结果 ==
值相等(隐式转换) '5' == 5
true ===
严格相等 '5' === 5
false !=
值不等 5 != '5'
false !==
严格不等 5 !== '5'
true >
大于 10 > '8'
true <=
小于等于 5 <= '5'
true
console. log ( null == undefined ) ; console. log ( NaN === NaN ) ;
# 🧠 逻辑运算符<pre class="mermaid">pie title 逻辑运算符使用频率 "&&" : 45 "||" : 35 "!" : 20</pre>
# 特性说明运算符 说明 短路特性示例 &&
逻辑与 false && alert()
不执行||
逻辑或 true || alert()
不执行!
逻辑非 !'' → true
const username = input || '匿名用户' ; isValid && submitForm ( ) ;
# 🏆 运算符优先级let result = 3 + 4 * 2 ; let flag = 5 > 4 && 2 ;
# 常见优先级排序()
分组++
--
一元操作*
/
%
+
-
>
>=
<
<=
==
!=
===
!==
&&
||
=
赋值💡 最佳实践 :复杂表达式使用括号明确优先级
let value = ( a + b) * ( c - d / 2 ) ;
# JavaScript 语句精要# 表达式 vs 语句类别 特点 示例 表达式 可被求值,能作为赋值操作右值 3 + 4
、 x * y
语句 执行操作,通常以分号结尾 if(...){...}
📌 关键差异:let x = (表达式)
✅ 有效let x = if(...){...}
❌ 无效
# 分支结构# if 语句标准结构if ( 条件1 ) { } else if ( 条件2 ) { } else { }
实践建议 :
简单判断可省略花括号(但不推荐) 多条件时优先使用 else if
而非嵌套 if
使用严格比较 ===
避免类型转换问题 # 循环与调试# 循环基础for ( 初始化; 条件; 迭代) { } while ( 条件) { }
# 断点调试要点浏览器开发者工具 → Sources 面板 点击行号设置断点 使用控制按钮逐步执行:Resume:继续执行 Step over:跳过函数 Step into:进入函数 观察变量变化和调用栈 调试场景 :
# JavaScript 数组操作全解# 📦 增:元素添加方法 说明 时间复杂度 示例 push()
末尾追加元素 O(1) arr.push('新元素')
unshift()
开头插入元素 O(n) arr.unshift('首元素')
splice()
指定位置插入 O(n) arr.splice(2,0,'插入')
扩展运算符 合并数组 O(n) [...arr1, ...arr2]
let fruits = [ '苹果' ] ; fruits. push ( '香蕉' ) ; fruits. unshift ( '葡萄' ) ; fruits. splice ( 1 , 0 , '芒果' ) ;
# 🗑️ 删:元素移除方法 说明 返回值 示例 pop()
移除最后一个元素 被删元素 arr.pop()
shift()
移除第一个元素 被删元素 arr.shift()
splice()
删除指定元素 被删元素数组 arr.splice(0, 2)
filter()
过滤创建新数组 新数组 arr.filter(x => x !== '苹果')
let arr = [ 1 , 2 , 3 , 4 ] ; arr. pop ( ) ; arr. splice ( 1 , 2 ) ;
# ✏️ 改:元素修改方式 说明 示例 直接索引赋值 简单直接修改 arr[1] = '新值'
splice()
替换指定元素 arr.splice(2,1,'替换值')
fill()
填充数组 arr.fill(0)
let colors = [ 'red' , 'green' ] ; colors[ 1 ] = 'yellow' ; colors. splice ( 0 , 1 , 'blue' ) ;
# 🔍 查:元素检索方法 说明 返回值 示例 indexOf()
查找元素索引 索引 /-1 arr.indexOf('苹果')
includes()
判断是否存在 boolean arr.includes('香蕉')
find()
查找首个符合条件元素 元素 /undefined arr.find(x => x > 2)
some()
是否存在符合条件的元素 boolean arr.some(x => x % 2 === 0)
const nums = [ 5 , 12 , 8 ] ; console. log ( nums. indexOf ( 12 ) ) ; console. log ( nums. find ( x => x > 10 ) ) ; console. log ( nums. includes ( 5 ) ) ;
# 🚩 最佳实践性能优化 :大数据量操作优先使用 push/pop
代替 unshift/shift
使用 filter/map
创建新数组而非直接修改原数组 现代语法 :const newArr = arr. toSpliced ( 1 , 1 ) ;
链式操作 :arr. map ( x => x* 2 ) . filter ( x => x > 10 ) . sort ( ( a, b ) => a- b) ;
💡 注意 :
splice
会直接修改原数组, slice
则返回新数组使用 Object.defineProperty()
可以创建不可变数组 推荐使用 for...of
替代传统 for 循环遍历数组 # 🎯 函数体系# 📌 函数声明function getUser ( ) { return data; }
# 🧩 核心特性# 🔑 命名规范✅ 动词前缀 + 小驼峰 ✅ 语义化命名,如: ▪ calculateTotal() ▪ validateForm() ▪ fetchUserData()
# 🚀 参数传递function createOrder ( item, quantity ) { } const safeSum = ( x = 0 , y = 0 ) => x + y;
# 💡 返回值要点▪ 使用 return
输出结果 ▪ 执行后立即终止函数 ▪ 无返回值时默认返回 undefined
# ⚠️⚠️ 重要注意function demo ( ) { } function demo ( ) { } function test ( a, b ) { console. log ( arguments) ; } test ( 1 , 2 , 3 , 4 ) ;
# 🌍 作用域规则const globalVar = '全局' ; function checkScope ( ) { const localVar = '局部' ; console. log ( globalVar) ; } console. log ( localVar) ;
# 🔍 访问原则局部变量 → 闭包变量 → 全局变量
# 匿名函数# ➤ 函数表达式const action = function ( ) { } ; action ( ) ;
# ➤ IIFE 模式( function ( ) { console. log ( '立即执行' ) ; } ) ( ) ; ( function ( ) { console. log ( '立即执行' ) ; } ( ) ) ;
▲ 核心特性 ▸ 两种语法等效 ▸ 隔离作用域防止污染 ▸ 推荐结尾加分号
# 🔮 布尔类型转换# 🎯 转换规则# ▎假值清单(6 种)值 转换结果 示例 ""
❌ false Boolean("")
0
/ NaN
❌ false Boolean(0)
null
❌ false Boolean(null)
undefined
❌ false Boolean(undefined)
false
❌ false 自身
# ▎逻辑运算特性0 && alert ( ) '' && 'test' NaN && 20 0 || '默认值' null || undefined
# 🔄 隐式类型转换# 🧠 转换逻辑图<pre class="mermaid">flowchart TD A [运算类型] --> B {含字符串?} B -->| 是 | C [字符串拼接] B -->| 否 | D [转数字计算]</pre>
# 📜 核心规则# 1. 算术运算策略运算符 转换规则 示例 结果 +
任意操作数为字符串则拼接 '3' + 2
"32" -*/%
全部转为数字计算 '10' - '5'
5
# 2. 特殊值处理null + 10 undefined + 1 true + false [ ] + { }
# ⚠️ 高频陷阱空字符串转 0 :'' - 5 → -5
(易导致非预期结果)
无效数字污染 :'a' * 2 → NaN
(后续运算全为 NaN)
布尔值参与运算 :true + true → 2
(易误判为逻辑运算)
对象类型转换 :[1] + [2] → "12"
(数组转字符串拼接)
# 🎯 对象体系# 🧩 核心概念<pre class="mermaid">graph TD A [对象] --> B [属性] A --> C [方法] B --> 数据值 C --> 函数功能 </pre>
本质 :无序键值对集合,用于描述实体(如用户 / 商品)
# 🔑 属性操作# ➤ 增删改查操作 语法 注意点 示例 查 对象.属性
属性名需合法标识符 user.age
对象['属性']
支持特殊字符 / 变量访问 user['user-name']
改 对象.属性 = 值
直接覆盖原值 user.age = 30
删 delete 对象.属性
删除整个属性 delete user.address
增 对象.新属性 = 值
自动添加新属性 user.gender = 'male'
# ➤ 多词属性处理const book = { 'book-title' : 'JavaScript指南' , '出版日期' : '2023-01' } ; console. log ( book[ 'book-title' ] ) ;
# 🚀 方法使用const calculator = { add : function ( a, b ) { return a + b } , multiply ( a, b ) { return a * b } , divide : ( a, b ) => a / b } ; calculator. add ( 2 , 3 ) ; calculator[ 'multiply' ] ( 2 , 3 ) ;
# 🔄 对象遍历const phone = { brand : 'Xiaomi' , model : '13 Pro' , price : 4999 } ; for ( let key in phone) { console. log ( ` 属性: ${ key} → 值: ${ phone[ key] } ` ) ; } 属性:brand → 值:Xiaomi 属性:model → 值:13 Pro 属性:price → 值:4999 */
# 📊 Math 对象# ▎核心方法速查方法 功能 示例 结果 Math.PI
圆周率常量 Math.PI 3.14159... random()
[0,1) 随机数 Math.random() 0.687... ceil()
向上取整 Math.ceil(3.2) 4 floor()
向下取整 Math.floor(3.8) 3 round()
四舍五入 Math.round(3.5) 4 max()
最大值 Math.max(2,5,1) 5 min()
最小值 Math.min(2,5,1) 1 pow()
幂运算 Math.pow(2,3) 8 abs()
绝对值 Math.abs(-5) 5
# ▎随机数生成公式 * 生成 N-M 范围内的整数 * @param {number} N - 最小值 * @param {number} M - 最大值 * @returns {number} 随机整数 */ function getRandomInt ( N , M ) { return Math. floor ( Math. random ( ) * ( M - N + 1 ) ) + N ; } console. log ( getRandomInt ( 10 , 20 ) ) ;
⚠️ 注意事项 :
for...in
会遍历原型链属性,建议配合 hasOwnProperty
使用方法中的箭头函数会改变 this
指向,需谨慎使用 删除不存在的属性不会报错,返回 true
# 基本数据类型和引用数据类型简单类型又叫 iben 数据类型或者值类型,复杂类型又叫引用类型。
值类型:简单数据类型 / 基本数据类型,再存储变量的是值本身,因此被叫做值类型 值类型变量的数据直接存放在变量(栈空间)中 let num1 = 10 ; let num2 = num1; num2 = 20 ; console. log ( num1) ;
引用类型:复杂数据类型,在存储变量中存储的仅仅是地址 (引用),因此叫做引用数据类型通过 new 关键字创建的对象。 引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中。 let obj1 = { age : 18 ; } let obj2 = obj1; obj2. age = 20 ; console. log ( obj1. age) ;
# 变量声明建议:const 优先,尽量用 const
let arr = [ 'red' , 'green' ] ; arr. push ( 'pink' ) ; console. log ( arr) ;
这里可以把 let 改为 const
const 声明的值不能更改,而且 const 声明变量的时候需要在里面进行初始化 但是对于引用数据类型,const 声明的变量,里面存的不是值,不是值,是地址,所以只要不更改地址,那么里面的值是可以更改的。 建议数组和对象使用 const 声明