JS基础知识点

目录

前言

 JS是什么?

JS的发展史?

1. JS基础知识

1.1 JS引入方式

1.1.1 内部脚本

1.1.2 外部脚本 

 1.2 JS基础语法

1.2.1 书写规范

 1). 区分大小

 2). 分号使用

3). 注释

4). 大括号表示代码块

 5). 变量命名规范

6). 代码缩进

 1.2.2 JavaScript 的输出语句

1).  交互与提示(window.alert())

2).  页面内容输出(document.write())

3). 调试与日志(console.log()) 

 1.2.3 变量

1).变量的基本概念

2).var 声明变量

3).ES6 新增声明方式(let、const)

1.2.4 数据类型

1). 原始类型(基本类型)

 2).引用类型

 3). 数据类型检测(typeof 与 instanceof )

1.2.5 运算符

1). 算术运算符

 2). 赋值运算符

4).逻辑运算符 

 5).三元运算符(条件运算符 )

 6).运算符优先级

 7).类型转换的核心规则(总结表)

1.2.6 流程控制语句

1).条件判断语句

2).循环执行语句

 1.3 JS对象

1.3.1 Array

1).数组定义

2).数组访问与修改 

3).数组属性与方法 

1.3.2 String

1).字符串创建方式

 2).字符串核心属性

3).常用字符串方法 

4)字符串特点 

1.3.3 JSON

1). JS自定义对象

 2) JSON的概念

3)JSON语法规则 

4)JSON与 JS 对象的区别 

 5)JSON 与 JS 对象的转换

1.3.4 BOM

1). BOM的概念

2). Window(浏览器窗口对象) 

 3). Location(地址栏对象)

 4). History(历史记录对象)

5). Navigator(浏览器对象)

 6). Screen(屏幕对象)

1.3.5 DOM

1).DOM的概念

2).DOM 树结构

3).获取 DOM 元素(Element)

 4).操作 DOM 元素

1.4 JS事件

1.4.1 事件绑定方式

1). HTML 标签属性绑定(内联方式)

2).DOM 属性绑定(脚本方式)

 1.4.2 常见事件类型

1.4.3 事件触发流程


前言

        我们先简单了解一下,人们口中常说的前端三大件是什么:        

  • HTML 是 “骨架”,定义网页的内容和结构;
  •  CSS 是 “皮肤”,负责美化外观和布局;
  • JavaScript 是 “行为”,实现交互逻辑和动态效果。

 JS是什么?

        JS(即 JavaScript )是网页前端开发三大核心技术之一,是一门跨平台、面向对象的脚本语言,主要用于控制网页行为使其具备交互功能,像点击按钮弹出提示、验证表单输入是否合法这类场景,都可借助它实现。它和 Java 是完全不同的语言,当年为了蹭 Java 热度才命名的JavaScript。二者在概念、设计上差异显著,不过基础语法存在相似性(其实很多编程语言的基础语法都有类似之处 ) 。

JS的发展史?

        JavaScript(简称 JS)由 Brendan Eich 于 1995 年发明,并在 1997 年成为 ECMA 标准(即 ECMAScript)。我们常说的 ES6(ECMAScript 6)于 2015 年发布,这个版本引入了众多重要新特性:例如用 let 和 const 声明变量,解决了此前 var 声明变量时存在的作用域混乱问题;箭头函数 () => {} 提供了更简洁的函数定义方式,优化了代码的可读性与书写体验。ES6 还规范了 JavaScript 的模块化系统,通过 import 和 export 语句,开发者能够便捷地管理代码模块,实现代码的复用与拆分。这对大型项目的开发和维护至关重要,既解决了过去 JavaScript 在模块化方面的不足,也让代码结构更清晰、可维护性更强。

        自 ES6 之后,JavaScript 语言规范进入快速迭代且稳定发展的阶段,后续版本均在其基础上进行补充完善。ES6 的出现,标志着 JavaScript 从简单的网页脚本语言向功能强大的通用编程语言转变,不仅推动其在现代 Web 开发等场景广泛应用,还拓展到 Node.js 服务端、小程序等开发领域,成为了行业内默认的开发标准。

        看完本篇文章可以对JS有个基础的认知,也可以将本文章当作简单的复习资料,如果大家想了解更全面的内容可以前往官网查看哦,里面有非常详细的知识点介绍还有对应的示例。w3school 在线教程全球最大的中文 Web 技术教程。https://www.w3school.com.cn/

HTML基础知识点 HTML基础知识点-CSDN博客文章浏览阅读398次,点赞15次,收藏7次。html基础知识点,超详细,适合遗忘后的快速回顾学习,对0基础的小白也具有一定的学习价值 https://blog.csdn.net/m0_71546806/article/details/149711309

CSS基础知识点 CSS基础知识点-CSDN博客文章浏览阅读471次,点赞12次,收藏12次。CSS基础知识点,超详细,适合复习回顾用 https://blog.csdn.net/m0_71546806/article/details/149725229

接下来让我们来一起开始学习吧!

1. JS基础知识

1.1 JS引入方式

1.1.1 内部脚本

把 JS 代码直接写在 HTML 文件里,需用 <script> 标签包裹,用法特点:

  • 语法要求:JS 代码必须放在 <script></script> 标签中间,浏览器会识别并执行标签内的代码。
  • 位置灵活:HTML 里可在任意位置放任意数量的 <script> 标签(<head> 或 <body> 里都行 )。不过建议放 <body> 底部,因为 JS 可能操作 DOM 元素,等页面结构加载完再执行脚本,能避免 “元素未找到” 的错误,还能让页面先显示内容,改善加载速度。
  • 示例:
    <!DOCTYPE html>
    <html>
    <body>
      <button onclick="showAlert()">点我</button>
      <!-- 内部脚本,放在 body 底部 -->
      <script>
        function showAlert() {
          alert("Hello JavaScript"); 
        }
      </script>
    </body>
    </html>

1.1.2 外部脚本 

把 JS 代码单独写在 .js 文件里,再引入到 HTML 中,适合复杂项目(解耦代码、方便复用 ),规则如下:

  • 文件规范:外部 .js 文件只存纯 JS 代码,不能有 <script> 标签。比如创建 demo.js 文件,内容就是业务逻辑:
    // demo.js 内容(无 script 标签)
    function showMsg() {
      alert("Hello from external file!");
    }

 1.2 JS基础语法

1.2.1 书写规范

 1). 区分大小

        JavaScript 是一门区分大小写的编程语言。这意味着变量名、函数名、操作符以及关键字等,字母的大小写不同,就代表不同的实体。在实际开发中,一定要严格注意大小写,否则可能会导致变量未定义、函数调用错误等问题。

 2). 分号使用

        JavaScript 中,每行结尾的分号是可选的。这是因为 JavaScript 解析器会自动通过一些规则来推断语句的结束位置,即自动分号插入(ASI,Automatic Semicolon Insertion)机制。不过,建议手动添加分号,以提高代码的可读性和避免潜在的错误。

// 不加分号可能导致的问题示例
function getValue() {
  return {
    num: 10
  };
}
let result = getValue()
["num"]; // 这里如果没有分号,解析器可能会将其解析为 getValue()["num"],导致错误
// 正确写法,手动加分号
function getValue() {
  return {
    num: 10
  };
}
let result = getValue();
result["num"]; 
3). 注释

单行注释:使用 // 来表示,用于注释一行代码,通常用来解释某一行代码的功能。 例如:

// 定义一个变量存储年龄
let age = 18; 

多行注释:使用 /* */ 来表示,能注释掉多行代码,常用于注释一段代码块或对函数、类等进行功能说明。 例如:

/*
  这个函数用于计算两个数的和
  @param num1 第一个数
  @param num2 第二个数
  @return 两数之和
*/
function sum(num1, num2) {
  return num1 + num2;
}
4). 大括号表示代码块

        大括号 {} 用于定义代码块,比如在 if 语句、for 循环、while 循环、函数定义等场景中,用来包含需要执行的一组语句。即使代码块中只有一条语句,也建议加上大括号,以增强代码的可读性和可维护性,避免在后续添加代码时出现逻辑错误。例如:

// 推荐写法,即使只有一条语句也加上大括号
if (true) {
  console.log("条件为真");
}
for (let i = 0; i < 5; i++) { 
  console.log(i);
}
function sayHello() {
  console.log("Hello!");
}
// 不推荐写法,可能在后续添加代码时导致逻辑问题
if (true) 
  console.log("条件为真"); 
// 如果后续想再添加一条语句,容易遗漏大括号,导致逻辑错误
 5). 变量命名规范

虽然 JavaScript 对变量命名没有严格的强制规范,但遵循良好的命名习惯有助于团队协作和代码维护:

  • 驼峰命名法:变量名、函数名通常使用小驼峰命名法,即第一个单词的首字母小写,后面每个单词的首字母大写,例如 userName、getElementById 。
  • 语义化:变量名要能清晰表达其用途,比如用 count 表示计数,用 isLogin 表示是否登录的状态 。
  • 避免使用保留字:不要使用 JavaScript 中的关键字(如 if、for、let 等)和保留字作为变量名。
6). 代码缩进

 为了让代码结构更加清晰,便于阅读和理解,需要使用合适的缩进。一般来说,推荐使用 2 个空格或 4 个空格进行缩进,在团队开发中要保持统一。

 1.2.2 JavaScript 的输出语句

1).  交互与提示(window.alert())
  • 用途:向用户弹出警告框,显示提示 / 警告信息(如表单验证报错 )。
  • 特点:模态弹窗,会阻塞页面操作,用户点 “确认” 才继续。
2).  页面内容输出(document.write())
  • 用途:直接向 HTML 文档写入内容(如动态生成简单列表 / 文本 )。
  • 风险:页面加载完成后调用,会清空原有内容后重写,需谨慎用。
3). 调试与日志(console.log()) 
  • 用途:向浏览器控制台输出信息(变量值、代码执行状态等 )。开发调试排查问题、验证逻辑时用,是项目调试基础技能。

 1.2.3 变量

1).变量的基本概念

JavaScript 中,变量用于存储数据,是编程里操作数据的基础载体,可存数字、字符串、对象等各类数据 。

2).var 声明变量

        (1). 基础用法

        用 var 关键字声明变量,示例:

var age = 20; // 声明并赋值,存数字类型
var name; 
name = "张三"; // 先声明再赋值,存字符串类型

        (2).  弱类型特性

        JavaScript 是弱类型语言,var 声明的变量可随时改变存储的数据类型,示例:

var a = 20; 
a = "张三"; // 从数字类型转为字符串类型,不会报错

        (3). 变量名规则 

  • 组成字符:字母、数字、下划线(_)、美元符号($)。
  • 限制:数字不能开头,否则是无效变量名,示例:
var _age = 18; // 合法
var $name = "李四"; // 合法
// var 2num = 100; // 非法,数字开头
  • 命名习惯:建议用驼峰命名法,即首单词首字母小写,后续单词首字母大写,示例:var userName = "小明"; 
3).ES6 新增声明方式(let、const)

        (1). let 声明变量

  • 块级作用域:声明的变量仅在所处代码块({} 包裹区域)内有效,示例:
if (true) {
  let num = 10; 
  console.log(num); // 10,代码块内可访问
}
// console.log(num); // 报错,代码块外无法访问
  •  禁止重复声明:同一作用域内,不能重复声明同名变量,示例:
let age = 20; 
// let age = 30; // 报错,重复声明
  • 对比 var:var 存在变量提升等问题,let 让变量作用域更清晰,现代开发中更推荐优先用 let 声明变量 。

        (2).  const 声明常量

  • 只读特性:声明的是常量,一旦赋值,值不能再改变,示例:
const PI = 3.14159; 
// PI = 3; // 报错,尝试修改常量值
  • 块级作用域:和 let 类似,作用域限定在所处代码块内,示例:
if (true) {
  const MAX_NUM = 100; 
  console.log(MAX_NUM); // 100,代码块内可访问
}
// console.log(MAX_NUM); // 报错,代码块外无法访问
  • 声明时赋值:必须在声明时就赋值,不能先声明再赋值,示例:
const COLOR; 
// COLOR = "red"; // 报错,声明时未赋值
const COLOR = "blue"; // 合法
  •  使用场景:存储固定不变的值,如数学常量、配置项等

1.2.4 数据类型

1). 原始类型(基本类型)

原始类型存储的是简单数据值,操作时直接访问值本身,包含 6 种:

    (1). number(数字类型)

  • 涵盖:整数(10、-5 )、小数(3.14、-0.5 )、特殊值 NaN(Not a Number,如 parseInt('abc') 会返回 NaN ,表示 “非数字” )。
  • 特点:弱类型语言特性,变量可随时切换存储数字类型

    (2). string(字符串类型)

  • 定义:由字符组成的文本,用单引号('张三' )或双引号("李四" )包裹,ES6 也支持反引号(Hello ${name}` ,用于拼接变量 )。
  • 场景:存储文字描述、用户输入等

    (3). boolean(布尔类型)   

  • 取值:只有 true(真)和 false(假),用于逻辑判断(如条件语句、开关状态 )。

    (4). null(空类型)

  • 含义:主动表示 “空对象”(虽然 typeof null 返回 object ,属于历史设计问题 ),用于刻意清空对象引用

    (5). undefined(未定义类型) 

  • 含义:变量声明了但未赋值时,默认值就是 undefined ,表示 “未定义” 状态。

    (6). symbol(符号类型,ES6 新增 ) 

  • 特点:唯一值,用于创建对象的唯一属性名,避免属性名冲突
  • 场景:复杂对象(如框架、库 )中,用于隐藏内部属性,防止被外部意外修改。
let key1 = Symbol('key'); 
let key2 = Symbol('key'); 
console.log(key1 === key2); // false,即使描述相同,Symbol 值也唯一
let obj = {
  [key1]: 'value1' 
};
 2).引用类型

引用类型存储的是对象的 “引用地址”,而非值本身。操作时通过地址找到实际对象

    (1).object(对象类型)详细知识点见1.3.3

  •  定义:一组键值对({ key: value } )的集合,可存储任意类型数据(数字、字符串、函数等 )
  • 特点:引用传递:赋值给新变量时,传递的是 “地址”,修改新变量会影响原对象
  • 动态扩展:可随时添加、删除属性

     (2). array(数组类型,属于特殊对象 )详细知识点见1.3.1

  • 定义:有序的列表,用方括号([] )包裹,可存不同类型数据

 特点:

  • 下标访问:通过索引(从 0 开始 )获取元素,如 list[0] 取 10 。
  • 内置方法:push(末尾加元素 )、pop(末尾删元素 )、map(遍历处理 )等

    (3). function(函数类型,属于特殊对象 )

  • 定义:可复用的代码块,用 function 关键字或箭头函数(=> )定义,示例:
// 普通函数
function add(a, b) { 
  return a + b;
}
// 箭头函数
let multiply = (a, b) => a * b; 

特点:

  • 可赋值给变量、作为参数传递、作为返回值,示例:
function callFunc(func) { 
  func();
}
let sayHi = function() { 
  console.log('Hi');
};
callFunc(sayHi); // 函数作为参数传递

 注意事项: 在JS中,允许传递任意数量的实参,不会因 “实参数量与形参数量不匹配” 报错。若实参数量少于形参,多余形参默认赋值为 undefined;若实参数量多于形参,多余实参不会 “失效”,可通过 arguments(普通函数)或剩余参数(...rest)获取并使用。

 3). 数据类型检测(typeof 与 instanceof )

    (1). typeof 运算符

  • 作用:返回数据的 “类型字符串”,快速判断原始类型(null 除外 ),示例:
console.log(typeof 10); // 'number'
console.log(typeof '张三'); // 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined); // 'undefined'
console.log(typeof Symbol()); // 'symbol'
// 注意:null 会返回 'object'(历史设计问题)
console.log(typeof null); // 'object' 
// 引用类型:除 function 外,都返回 'object'
console.log(typeof { a: 1 }); // 'object'
console.log(typeof [1,2]); // 'object'
console.log(typeof function(){}); // 'function' 

     (2). instanceof 运算符

  •  作用:判断引用类型的 “具体类型”(基于原型链 ),示例:
let arr = [1,2]; 
console.log(arr instanceof Array); // true,判断是否为数组
let obj = { a: 1 }; 
console.log(obj instanceof Object); // true,判断是否为对象

1.2.5 运算符

1). 算术运算符

 用于执行数学运算,操作数字类型(也可处理能转数字的其他类型 )

运算符说明示例结果
+加法(数字相加 / 字符串拼接 )5 + 3 / 'Hello' + 'World'8 / 'HelloWorld'
-减法(数字相减 )10 - 46
*乘法3 * 515
/除法(返回浮点数结果 )10 / 33.333...
%取余(求余数 )10 % 31
++自增(先返回值再 +1 / 先 +1 再返回,分前缀、后缀 )let a=5; a++(后缀,返回 5 后变 6 )
let b=5; ++b(前缀,先变 6 再返回 6 )
-
--自减(类似自增,值减 1 )let c=5; c--(返回 5 后变 4 )
let d=5; --d(先变 4 再返回 4 )
-

注意:+ 遇到字符串时,会优先作为字符串拼接,而非算术加法,示例:

let result = '10' + 20; 
console.log(result); // '1020'(字符串拼接)
let numResult = 10 + 20; 
console.log(numResult); // 30(算术加法)
 2). 赋值运算符

用于给变量赋值,或结合算术运算 “快捷赋值”,核心是简化代码:

运算符说明示例(等价写法)
=基本赋值let a = 10;
+=加法赋值(a = a + b )a += 5; 等价 a = a + 5;
-=减法赋值(a = a - b )a -= 3; 等价 a = a - 3;
*=乘法赋值(a = a * b )a *= 2; 等价 a = a * 2;
/=除法赋值(a = a / b )a /= 2; 等价 a = a / 2;
%=取余赋值(a = a % b )a %= 3; 等价 a = a % 3;

3).比较运算符 

用于判断两个值的关系(大小、相等性等 ),返回布尔值(true / false ):

运算符说明示例结果
>大于5 > 3true
<小于5 < 3false
>=大于等于5 >= 5true
<=小于等于5 <= 3false
==相等(会隐式类型转换 )10 == '10'true(转成同类型比较)
===严格相等(不类型转换 )10 === '10'false(类型不同直接不等)
!=不相等(会类型转换 )10 != '10'false(转成同类型后相等,取反)
!==严格不相等(不类型转换 )10 !== '10'true(类型不同,直接不等)

关键区别:== vs ===

  • ==:自动转换类型后比较(如 10 和 '10' 转成数字后相等 ),易引发隐蔽 bug,现代开发推荐用 === 。
  • ===:要求 “值和类型都相同” 才返回 true,更严谨,示例:
let num = 10; 
console.log(num == '10'); // true(类型转换后相等)
console.log(num === '10'); // false(类型不同,严格不等)
console.log(num === 10); // true(值和类型都相同)
4).逻辑运算符 

用于逻辑判断(多条件组合 ),返回布尔值,常见场景:条件语句(if、while )、表单验证等

  • &&    逻辑与(“且”,全为真才真 )          
  • ||   逻辑或(“或”,有一个真就真 )
  • !    逻辑非(“取反” )  

短路特性(重要!开发高频优化点 ):

  •  &&:左边为 false 时,直接返回 false,右边不执行,示例:
let num = 0; 
// num 为 0(假),右边代码不执行,避免报错
num && console.log('num 大于 0'); 
  •  ||:左边为 true 时,直接返回 true,右边不执行,示例:
let name = '张三'; 
// name 有值(真),右边代码不执行
name || console.log('name 未赋值'); 
 5).三元运算符(条件运算符 )
  • 语法:条件表达式 ? 值1 : 值2
  • 说明:条件为 true 时返回 值1,否则返回 值2,是 if-else 的简化写法,示例:
let age = 18; 
let result = age >= 18 ? '成年' : '未成年'; 
console.log(result); // 成年
 6).运算符优先级

不同运算符混合使用时,执行顺序有优先级,类似数学运算(先乘除后加减 ),关键规则:

  • 括号 () 优先级最高,可强制改变执行顺序
  • 常见优先级:() > 算术运算符(*、/ 高于 +、- ) > 比较运算符 > 逻辑运算符 > 赋值运算符
 7).类型转换的核心规则(总结表)
原始值转数字(Number()转布尔(Boolean()转字符串(String()
10(数字)10true'10'
'10'(字符串)10true'10'
''(空字符串)0false''
0(数字)0false'0'
NaN(非数字)NaNfalse'NaN'
null0false'null'
undefinedNaNfalse'undefined'

1.2.6 流程控制语句

1).条件判断语句

    (1). if...else if...else

if (条件表达式1) {
    // 条件1为 true 时执行的代码
} else if (条件表达式2) {
    // 条件1为 false 且条件2为 true 时执行的代码
} else {
    // 所有条件都为 false 时执行的代码
}

    (2). switch

switch (表达式) {
    case 值1:
        // 表达式结果等于值1时执行的代码
        break;
    case 值2:
        // 表达式结果等于值2时执行的代码
        break;
    // 可多个 case
    default:
        // 表达式结果与所有 case 值都不匹配时执行的代码
}
2).循环执行语句

    (1).for 循环

for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体,条件为 true 时重复执行的代码
}

    (2).while 循环

while (条件表达式) {
    // 循环体,条件为 true 时重复执行的代码
}

     (3).do...while 循环

do {
    // 循环体,至少执行一次的代码
} while (条件表达式);

 1.3 JS对象

JS对象包括Array、String、JSON、BOM、DOM等

1.3.1 Array

1).数组定义

方式一:new Array() 构造函数
通过 new Array() 创建数组,可传元素列表或指定长度(长度指定时,元素初始为 undefined )。

// 传入元素列表
var arr1 = new Array(1, 2, 3, 4); 
// 传入长度(创建长度为 3,元素均为 undefined 的数组 )
var arr2 = new Array(3); 

方式二:数组字面量 [](推荐)
用 [] 直接定义数组,简洁常用。

// 包含多种类型元素的数组
var arr = [1, 'hello', true, {name: '张三'}]; 
2).数组访问与修改 

访问元素
通过 ** 索引(下标)** 访问数组元素,索引从 0 开始。

var arr = [1, 2, 3];
// 输出 1
console.log(arr[0]); 

修改元素
通过索引赋值,可修改已有元素,或给超出当前长度的索引赋值(会扩展数组长度,中间未赋值位置为 undefined )。 

var arr = [1, 2, 3];
// 修改索引 1 的元素为 20
arr[1] = 20; 
// 给索引 10 赋值,数组长度变为 11,索引 3-9 为 undefined
arr[10] = 50; 
3).数组属性与方法 

    (1).核心属性

  •  length  获取或设置数组长度。设置长度小于原长度时,会截断数组;大于原长度时,新增位置为 undefined 。

    (2).常用方法

  •  遍历方法:forEach() 遍历数组每个有值的元素,执行传入函数(不改变原数组,无返回值 )。
var arr = [1, 2, 3];
// 遍历输出 1、2、3
arr.forEach(function (item) { 
  console.log(item);
});
// ES6 箭头函数简化
arr.forEach(item => console.log(item)); 
  • 新增元素:push()  在数组末尾添加一个或多个元素,返回新数组长度,会改变原数组。
var arr = [1, 2];
// 添加元素 3、4,数组变为 [1, 2, 3, 4],返回 4
var newLength = arr.push(3, 4); 
console.log(newLength); // 输出 4
  • 删除 / 插入 / 替换:splice()  功能丰富,可删除、插入、替换数组元素,会改变原数组。语法:splice(起始索引, 删除数量, 插入元素1, 插入元素2...) 
// 删除元素
var arr = [1, 2, 3, 4];
// 从索引 2 开始,删除 2 个元素,数组变为 [1, 2]
arr.splice(2, 2); 

// 插入元素
var arr = [1, 2];
// 从索引 1 开始,删除 0 个元素,插入 3、4,数组变为 [1, 3, 4, 2]
arr.splice(1, 0, 3, 4); 


// 替换元素
var arr = [1, 2, 3];
// 从索引 1 开始,删除 1 个元素(2),插入 20,数组变为 [1, 20, 3]
arr.splice(1, 1, 20); 
  • pop():删除数组最后一个元素,返回被删除元素,改变原数组。
var arr = [1, 2];
// 删除 2,数组变为 [1],返回 2
var removed = arr.pop(); 
  •  unshift():在数组开头添加元素,返回新长度,改变原数组。
var arr = [2, 3];
// 添加 1,数组变为 [1, 2, 3],返回 3
var newLength = arr.unshift(1); 
  •  slice():截取数组部分元素,返回新数组(不改变原数组 ),语法:slice(起始索引, 结束索引)(结束索引不包含 )。
var arr = [1, 2, 3, 4];
// 截取索引 1 到 3(不包含 3 ),返回 [2, 3]
var newArr = arr.slice(1, 3); 

1.3.2 String

1).字符串创建方式

方式一:new String() 构造函数

// 创建字符串对象
var strObj = new String("Hello String"); 
console.log(strObj); // 输出 String {"Hello String"}

方式二:字符串字面量(推荐)

// 双引号
var str1 = "Hello String"; 
// 单引号
var str2 = 'Hello String'; 
// 模板字符串(支持变量插值)
var name = "John";
var str3 = `Hello ${name}`; 
 2).字符串核心属性

length获取字符串的长度(包含空格、特殊字符,不区分中英文 )。

var str = "Hello String";
// 输出 11(H e l l o   S t r i n g 共 11 个字符 )
console.log(str.length); 
3).常用字符串方法 
  • charAt(index)  返回字符串指定索引位置的字符(索引从 0 开始,超出索引返回空字符串 )。 
var str = "Hello String";
// 索引 4 对应字符 'o'
console.log(str.charAt(4)); 
// 索引 100 超出范围,返回空字符串
console.log(str.charAt(100)); 
  • indexOf(searchValue, startIndex)  从前往后检索子串位置,返回首次匹配的索引;无匹配则返回 -1 。startIndex 为可选参数,指定开始检索位置。
var str = "Hello String";
// 检索 "lo",首次出现在索引 3
console.log(str.indexOf("lo")); 
// 从索引 5 开始检索,无匹配返回 -1
console.log(str.indexOf("lo", 5)); 
  •  trim()  去除字符串两端的空格(不影响中间空格 ),返回新字符串(原字符串不变 )。
var str = "  Hello String  ";
// 去除两端空格,返回 "Hello String"
var newStr = str.trim(); 
console.log(newStr); 
  • substring(start, end)  提取字符串中从 start 索引到 end 索引(含头不含尾 )的子串,返回新字符串。end 省略则提取到末尾。 
var str = "Hello String";
// 提取索引 0-4(含 0,不含 5 ),返回 "Hello"
console.log(str.substring(0, 5)); 
// 提取索引 6 到末尾,返回 "String"
console.log(str.substring(6)); 
  •  slice(start, end)  类似 substring,但支持负数索引(负数表示从末尾开始计数 )。
var str = "Hello String";
// 提取索引 -6 到 -1(含 -6,不含 -1 ),返回 "String"
console.log(str.slice(-6, -1)); 
  • replace(searchValue, replaceValue)  替换首次匹配的子串,返回新字符串(原字符串不变 )。 
var str = "Hello String";
// 将 "Hello" 替换为 "Hi",返回 "Hi String"
console.log(str.replace("Hello", "Hi")); 
  •  split(separator, limit)  按分隔符拆分字符串为数组,limit 限制拆分数量。
var str = "Hello,World,JS";
// 按逗号拆分,返回 ["Hello", "World", "JS"]
console.log(str.split(",")); 
// 限制拆分 2 个,返回 ["Hello", "World"]
console.log(str.split(",", 2)); 
4)字符串特点 
  • 不可变性:字符串一旦创建,内容无法直接修改,所有方法返回的是新字符串(原字符串保持不变 )。
var str = "Hello";
// 原字符串不变,返回 "HelloWorld"
str.concat("World"); 
console.log(str); // 仍为 "Hello"
  •  灵活拼接:支持用 +、+= 或模板字符串拼接,模板字符串更简洁且支持换行、变量插值。
var name = "John";
// 传统拼接
var str1 = "Hello, " + name + "!"; 
// 模板字符串拼接(推荐)
var str2 = `Hello, ${name}!`; 

1.3.3 JSON

1). JS自定义对象
  • 定义方式(对象字面量) 用 {} 包裹属性和方法,简洁直观,是最常用方式。
// 语法
var 对象名 = {
  属性名1: 属性值1,
  属性名2: 属性值2,
  // 方法(函数)
  方法名: function(参数) {
    // 逻辑代码
  }
  // ES6+ 简化写法
  方法名() {
    // 逻辑代码
  }
};

// 示例
var user = {
  name: "Tom",
  age: 20,
  // 传统方法定义
  eat: function() {
    alert("用膳~");
  },
  // ES6+ 简化方法定义
  sleep() {
    alert("就寝~");
  }
};
  • 属性: 存储数据(如字符串、数字、布尔等任意类型),通过 对象名.属性名 访问。
console.log(user.name); // 访问属性,输出 "Tom"
user.age = 21; // 修改属性值
  • 方法:对象内的函数,封装逻辑,通过 对象名.方法名() 调用。 
user.eat(); // 调用方法,弹出 "用膳~"
user.sleep(); // 调用方法,弹出 "就寝~"
 2) JSON的概念

JSON(JavaScript Object Notation),即 JavaScript 对象标记法,是基于 JS 对象语法的文本格式,因语法简洁、结构清晰,常用于网络数据传输(如接口请求 / 响应)。

3)JSON语法规则 

   基本结构

  • 以 {}(对象)或 [](数组)开头,键值对组织数据。
  • 键(属性名)必须用双引号包裹,值支持类型:
  • 数字(整数 / 浮点数)、字符串(双引号)、布尔(true/false)、数组、对象、null。
{
  "name": "Tom",
  "age": 20,
  "hobbies": ["篮球", "音乐"],
  "isStudent": true,
  "address": {
    "city": "北京",
    "street": "XX路"
  }
}
4)JSON与 JS 对象的区别 
对比项JSONJS 对象
键的引号必须双引号("key"可省略(key 或 "key"
值的类型限制严格(如字符串用双引号)更灵活(字符串可用单引号)
本质文本(字符串)内存中的数据结构
 5)JSON 与 JS 对象的转换

    (1). JSON 字符串 → JS 对象(解析)

用 JSON.parse() 方法,将 JSON 格式的字符串转为 JS 对象,方便代码操作。

语法:

let jsObj = JSON.parse(jsonStr);

示例:

let jsonStr = '{"name":"Tom","age":20}';
// 解析为 JS 对象 { name: "Tom", age: 20 }
let user = JSON.parse(jsonStr); 
console.log(user.name); // 访问属性

     (2).JS 对象 → JSON 字符串(序列化)

用 JSON.stringify() 方法,将 JS 对象转为 JSON 格式的字符串,用于网络传输。

语法:

let jsonStr = JSON.stringify(jsObj);

 示例:

let user = { name: "Tom", age: 20 };
// 转为 JSON 字符串 '{"name":"Tom","age":20}'
let jsonStr = JSON.stringify(user); 
console.log(jsonStr); // 用于接口请求传输

1.3.4 BOM

1). BOM的概念

        BOM(Browser Object Model)即浏览器对象模型,是 JS 操作浏览器功能的接口,将浏览器组件(窗口、地址栏等)封装为对象,实现交互控制。通过操作 Window、Navigator、Screen、History、Location 等对象,控制浏览器行为(如弹窗、跳转、获取设备信息 )。

2). Window(浏览器窗口对象) 
  • 作用:控制浏览器窗口(弹窗、定时器、获取其他 BOM 对象 )。
  • 获取:直接用 window(可省略前缀 ),如 alert() 等价于 window.alert()
  • 常用属性
    • window.history:访问历史记录对象(History )。
    • window.location:访问地址栏对象(Location )。
    • window.navigator:访问浏览器信息对象(Navigator )。
  • 常用方法
    • alert():弹出警告框。
    • confirm():弹出确认框(返回 true/false )。
    • setInterval()周期性执行函数(定时器,如轮询 )。
    • setTimeout()延迟执行一次函数(延时器 )。
// 警告框
alert("Hello BOM"); 
// 确认框
let isConfirm = confirm("确认删除?"); 
// 2秒执行一次(周期定时器)
setInterval(() => console.log("执行中..."), 2000); 
// 3秒后执行一次(延时器)
setTimeout(() => alert("延时执行"), 3000); 
 3). Location(地址栏对象)
  • 作用:操作浏览器地址栏(获取 / 设置 URL、跳转页面 )。
  • 获取window.location 或直接 location(省略 window )。
  • 核心属性
    • href:获取当前 URL 或设置新 URL(实现页面跳转 )。
// 获取当前地址
console.log(location.href); 
// 跳转到新地址
location.href = "https://www.baidu.cn"; 
 4). History(历史记录对象)
  • 作用:操作浏览器历史记录(前进、后退 )。
  • 常用方法
    • history.back():后退到上一页。
    • history.forward():前进到下一页。

(注:实际开发中因安全限制,直接操作历史记录场景较少,更多用于单页应用路由模拟 。)

5). Navigator(浏览器对象)
  • 作用:获取浏览器信息(如版本、设备、用户代理 )。
  • 常用属性
    • navigator.userAgent:浏览器标识(区分设备、浏览器类型 )。
// 判断是否为手机端浏览器
if (navigator.userAgent.match(/Mobile/)) { 
  console.log("手机端浏览器");
}
 6). Screen(屏幕对象)
  • 作用:获取屏幕硬件信息(分辨率、尺寸 )。
  • 常用属性
    • screen.width:屏幕宽度。
    • screen.height:屏幕高度。
// 输出屏幕分辨率
console.log(`屏幕分辨率:${screen.width}x${screen.height}`); 

1.3.5 DOM

1).DOM的概念

DOM(Document Object Model,文档对象模型 )是 JS 操作 HTML/XML 文档的接口,将文档解析为对象树,让 JS 能动态修改内容、样式、结构。

  • 作用:把 HTML 文档的每个部分(如标签、属性、文本 )封装为对象,通过 JS 操作这些对象,实现页面动态交互(如修改内容、响应事件 )。
  • 组成
    • Document:整个文档对象(代表页面整体 )。
    • Element:元素对象(如 <div><a> 等标签 )。
    • Attribute:属性对象(如 hrefclass 等 )。
    • Text:文本对象(标签内的文字 )。
2).DOM 树结构

HTML 文档被解析为树形结构,每个标签、文本、属性都是树的节点,例如:

<html>
  <head>
    <title>DOM</title>
  </head>
  <body>
    <h1>DOM对象标题</h1>
    <a href="https://baidu.cn">百度</a>
  </body>
</html>

对应 DOM 树:

文档(Document)
└─ html(Element)
   ├─ head(Element)
   │  └─ title(Element)
   │     └─ 文本(Text: "DOM")
   └─ body(Element)
      ├─ h1(Element)
      │  └─ 文本(Text: "DOM对象标题")
      └─ a(Element)
         ├─ 属性(Attribute: href="https://baidu.cn")
         └─ 文本(Text: "百度")
3).获取 DOM 元素(Element)

通过 document 对象提供的方法,获取页面中的元素,常用方式:

    (1). getElementById(id)  根据 ID 属性 获取元素(页面唯一,返回单个元素 )。

// 获取 id 为 "h1" 的元素
let h1 = document.getElementById('h1'); 

     (2).getElementsByTagName(tag)  根据 标签名 获取元素(返回元素数组,需遍历操作 )。

// 获取所有 <div> 元素
let divs = document.getElementsByTagName('div'); 
for (let i = 0; i < divs.length; i++) {
  console.log(divs[i]);
}

     (3).getElementsByName(name)  根据 name 属性 获取元素(返回元素数组 )。

// 获取 name 为 "hobby" 的元素
let hobbies = document.getElementsByName('hobby'); 

    (4).getElementsByClassName(class)  根据 class 属性 获取元素(返回元素数组 )。

// 获取 class 为 "cls" 的元素
let divs = document.getElementsByClassName('cls'); 
for (let i = 0; i < divs.length; i++) {
  console.log(divs[i]);
}
 4).操作 DOM 元素

获取元素后,查阅官方文档,通过属性 / 方法修改元素的内容、样式、结构。下面是一些常见的DOM操作
(1). 修改内容(innerHTML/innerText)
innerHTML:识别 HTML 标签,可修改结构。
innerText:仅处理文本,忽略 HTML 标签。

let div = document.getElementsByClassName('cls')[0];
// 修改内容
div.innerHTML = "新内容 "; 
// 仅修改文本
div.innerText = "新文本"; 

 (2). 修改样式(style)
通过 style 属性修改 CSS 样式。

let h1 = document.getElementById('h1');
// 修改颜色(驼峰命名,如 backgroundColor 对应 CSS 的 background-color)
h1.style.color = "red"; 
// 修改字体大小
h1.style.fontSize = "20px"; 

(3).响应事件(如点击事件)

给元素绑定事件(如 onclick ),触发时执行函数。

let btn = document.getElementById('btn');
// 点击按钮时弹出提示
btn.onclick = function() { 
  alert("按钮被点击了!");
};

1.4 JS事件

事件是浏览器与用户交互的触发点(如点击、输入 ),JS 通过事件绑定 / 监听响应用户操作,实现动态交互。

1.4.1 事件绑定方式

1). HTML 标签属性绑定(内联方式)

直接在 HTML 标签中写 on事件名,调用全局函数。

语法:

<标签 on事件名="函数名()">内容</标签>

 示例(点击事件 onclick ):

<input type="button" onclick="onClickFn()" value="按钮">
<script>
function onClickFn() {
  alert('点击触发!');
}
</script>

特点:

简单直观,但耦合 HTML 与 JS,不利于维护(不推荐复杂场景 )。

2).DOM 属性绑定(脚本方式)

 先获取 DOM 元素,再通过 元素.事件名 = 函数 绑定。

语法:

// 1. 获取元素
let 元素 = document.getElementById('id'); 
// 2. 绑定事件
元素.事件名 = function() { 
  // 事件逻辑
};

示例(点击事件 onclick ):

<input type="button" id="btn" value="按钮">
<script>
// 获取元素
let btn = document.getElementById('btn'); 
// 绑定点击事件
btn.onclick = function() { 
  alert('点击触发!');
};
</script>

特点:

分离 HTML 与 JS,更灵活;但同一事件只能绑定一个函数(重复绑定会覆盖 )。

 1.4.2 常见事件类型

事件名说明典型场景
onclick鼠标单击按钮点击、链接跳转
onblur元素失去焦点输入框离开时校验内容
onfocus元素获得焦点输入框聚焦时显示提示
onload页面 / 图像加载完成页面初始化后执行逻辑(如数据请求 )
onsubmit表单提交提交前校验表单数据
onkeydown键盘按键按下监听快捷键(如回车提交 )
onmouseover鼠标移入元素显示悬浮菜单、提示信息
onmouseout鼠标移出元素隐藏悬浮菜单、恢复样式

1.4.3 事件触发流程

  1.  用户操作:如点击按钮、输入内容。
  2. 事件触发:浏览器检测到操作,触发对应事件(如 onclick )。
  3. 执行逻辑:事件绑定的函数执行,实现交互(如弹窗、修改页面 )。

 当你看到这,恭喜你已经掌握了开发中几乎所有常见的JS知识点

每天进步一点点,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值