JavaScript
2024-05-05 09:49:22 0 举报
AI智能生成
JavaScript是一种高级的编程语言,主要用于创建动态网页。它运行在浏览器中,可以处理HTML和CSS,以及与浏览器和操作系统交互。JavaScript被广泛用于web应用、游戏、移动应用和桌面应用。它的核心内容包括变量、数据类型、操作符、函数、条件和循环等。JavaScript的文件类型通常为.js,可以使用文本编辑器或专业IDE进行编写。这是一种跨平台的语言,可以在不同的操作系统和浏览器上运行。
作者其他创作
大纲/内容
基础语法
js简介
简介
运行在客户端的<b>编程</b>语言(html和css是标记语言),实现人机交互
网页特效<br>表单验证<br>数据交互<br>服务端编程(node.js)<br>
组成
ECMAScript(JS语言基础)
Web APIs
DOM
页面文档对象模型:<br>对页面元素进行移动,大小,添加删除等操作<br>
BOM
浏览器对象模型:<br>页面弹窗,检测窗口宽度,存储数据到浏览器等<br>
书写位置<br>
内部<script></script><br>
</body>上方<br>写在底部是因为加载顺序是从上往下<br>
外部<script></script><br>
1.js文件,内部还是在底部加载<br><font color="#e74f4c"><b><script src='1.js'></script></b></font><br>
内联直接写在标签内<br>
使用vue或者react框架的时候常用
注释
//<br>ctrl + /<br>
/* */<br>shift + alt + a<br>
结束符<br>
<b><font color="#e74f4c">;</font></b><br>
可以不写,具体看团队约定<br>
输入输出
输出
<b><font color="#e74f4c">document.write('文档输出的内容')</font></b><br>
<b><font color="#e74f4c">document.write('<h1>也可以输出标签</h1>')</font></b><br>
alert('xxxxx')<br>
<b><font color="#e74f4c">console.log('控制台打印输出')</font></b><br>
console.dir(对象)
它可以在 Web 浏览器的控制台中显示一个对象的所有属性和方法。<br>与 console.log() 相比,console.dir() 提供的是对象属性的分层和可交互的列表,这样可以更容易地浏览对象的不同属性。<br>它特别有用于调试复杂对象的结构。
输入
<b><font color="#e74f4c">prompt('输入的内容')</font></b><br>
输入的都是string<br>
代码执行顺序
alert()和prompt()会跳过页面渲染被优先执行
字面量
literal,计算机中描述的 事或物
数字字面量,100<br>字符串字面量<br>数组字面量<br>等<br>
<b><font color="#e74f4c">反引号</font></b><br>
<b><font color="#e74f4c">``</font></b><br>
用于定义模板字面量(Template Literals)
字符串插值
允许在字符串中直接<b><font color="#e74f4c">嵌入变量和表达式</font></b>,通过${expression}语法实现,使得构建动态字符串更为简便和直观。
let name = "John";<br>let message = `Hello, ${name}!`;<br>console.log(message); // 输出: Hello, John!<br>
多行字符串
直接创建<b><font color="#e74f4c">跨越多行</font></b>的字符串,无需使用字符串连接操作符或转义字符\n,极大地简化了多行文本或HTML模板的编写。
let address = `123 Main St.<br>Anytown, USA`;<br>console.log(address);<br>/* 输出:<br>123 Main St.<br>Anytown, USA<br>*/<br>
标签模板
提供了一种机制,允许函数通过特定语法(tag函数名紧跟模板字符串)解析模板字面量,用于自定义字符串处理,增加了模板处理的灵活性。
function highlight(strings, ...values) {<br> return strings.reduce((prev, current, i) => `${prev}${current}<strong>${values[i] || ''}</strong>`, '');<br>}<br><br>let name = "Sarah";<br>let order = "extra cheese pizza";<br>let result = highlight`Hello ${name}, you've ordered an ${order}.`;<br>console.log(result); // 输出: Hello <strong>Sarah</strong>, you've ordered an <strong>extra cheese pizza</strong>.<br>
变量
声明<br>
<font color="#e74f4c"><b>let</b></font> 变量名
为什么不用var
<b>块级作用域</b>:<br>let提供块级作用域(例如在循环或条件语句中),而var提供的是函数作用域或全局作用域。<br>这有助于减少变量作用域的混淆和意外覆盖的风险。
<b>避免变量提升</b>:<br>let声明的变量不会发生变量提升,这意味着它们只能在<b>声明后被访问</b>,有助于避免因变量提升导致的错误。<br>相反,var声明的变量会被提升到作用域顶部,即使在声明之前也可以被访问。
<b>防止<font color="#e74f4c">重复声明</font></b>:<br>在同一作用域内,let不允许重复声明同一个变量,减少了因重复声明导致的错误。<br>var允许重复声明同一个变量,可能会引起意料之外的覆盖。
<b>循环中的行为</b>:<br>let在循环中为每次迭代创建一个新的变量实例,使得每个循环迭代都拥有独立的变量实例,<br>而var在循环中声明的变量在每次迭代中共享同一个作用域,可能导致非预期的行为。
不用关键字声明(别这么用)
在JavaScript中,如果在赋值时没有使用var、let或const关键字声明一个变量,<br>那么这个变量会被隐式地创建为全局变量(假设它不在任何函数内部),即使是在一个块作用域或函数作用域内部。<br><b><font color="#e74f4c">但在严格模式下,就会报错<br>"use strict";<br>num = 10; // 这会抛出ReferenceError: num is not defined</font></b><br>
<font color="#e74f4c">数组array</font>
let 变量名 = [ ]<br>
<font color="#e74f4c"><b>let arr = ['刘德华', '张学友', '黎明', '郭富城', '郭德纲']<br>document.write(arr[4])</b></font>
<font color="#e74f4c"><b>arr.length</b></font>
数组长度<br>
赋值
一般声明的时候赋值(初始化)<br>
<b><font color="#e74f4c">let age = 18</font></b>
<b><font color="#e74f4c">let age = prompt('请输入一个值')<br>document.write(age)</font></b>
<font color="#e74f4c"><b>解构赋值<br></b></font>Destructuring Assignment<font color="#e74f4c"><b><br></b></font>
从数组或对象中提取值,并将这些值赋给变量
数组解构
const arr = [1, 2, 3];<br><br>// 传统的赋值方式<br>const a = arr[0];<br>const b = arr[1];<br>const c = arr[2];<br><br>// 使用解构赋值<br>const [x, y, z] = arr; // x = 1, y = 2, z = 3<br>
<font color="#e74f4c">跳过某些值</font><br>const [first, , third] = arr; // first = 1, third = 3<br>
let arr = [1,2,3,4,5];<br>const [first, ...rest] = arr;<br>console.log(first); // 1<br>console.log(rest); // [2,3,4,5]
对象解构
const <b>person </b>= {<br> name: "<b>Alice</b>",<br> age: <b>25</b>,<br> location: "Paris"<br>};<br><br>// 传统的赋值方式<br>const name = person.name;<br>const age = person.age;<br><br>// 使用解构赋值<br>const { name, age } = person; // name = "Alice", age = 25<br>
解构时重命名<br>const { name: personName, age: personAge } = person; // personName = "Alice", personAge = 25<br>
函数参数解构
function greet({ name, age }) {<br> console.log(`Hello, my name is ${name} and I am ${age} years old.`);<br>}<br><br>greet(<b>person</b>); // 输出: Hello, my name is <b>Alice </b>and I am <b>25 </b>years old.<br>
默认值
const { name, age, gender = 'Not specified' } = person;<br>console.log(gender); // 输出: Not specified<br>
为数组或对象中的变量设置默认值,以防数据结构中没有相应的元素或属性<br>gender 没有在 person 对象中定义,所以使用了默认值 'Not specified'。<br>
more例子
解构不成功为undefined
能拿到的值还是有的,没有的值则是undefined
更新
变量名 = 新值
<b><font color="#e74f4c">let name = '这是初始值'<br>document.write(name)<br>name = '这是新的变量值'<br>document.write('<h1>', name, '</h1>')</font></b>
多个<br>
let age = 18, name = lucas<br>
<font color="#e74f4c">不推荐这么写,分开写增加可读性</font><br>
例,交换变量<br>
let num1 = 10<br>let num2 = 20<br>let num_temp<br>num_temp = num1<br>num1 = num2<br>num2 = num_temp<br><br>document.write(num1, '</br>', num2, '</br>', num_temp)
变量命名的规则和规范
规则
不能用关键字
只能用 _, 数字(不能开头), $, 英文<br>
严格区分大小写
规范
语义化起名
js一般用小驼峰<br>
userName<br>
常量
const 名 = 值<br>
常量不可改值
声明的时候必须赋值
数据类型
number
只要是数字都算<br>js是弱数据类型语言,只有赋值了,才知道是什么数据类型<br>
<font color="#e74f4c">NaN</font>
计算错误
粘性的,对NaN的任何操作都返回NaN
string
推荐使用单引号
string + string,拼接
<b><font color="#e74f4c">模板字符串</font></b>
<font color="#e74f4c"><b>外面必须是反引号``</b></font><br>
<b><font color="#e74f4c">`</font></b>我今年<font color="#e74f4c"><b>${age}</b></font>岁了<b><font color="#e74f4c">`</font></b><br>
boolean
true or false<br>
undefined
变量只声明,没定义<br>
undefined + 1为NaN
null
赋值了,类型是object,但内容是空
null + 1 = 1
检测数据类型
typeof
typeof x<br>or<br>typeof(x)<br>
一般数据类型
Number: 整数和浮点数
typeof 123; // "number"<br>typeof 98.6; // "number"<br>typeof <b>Infinity</b>; // "number"<br>typeof <b><font color="#e74f4c">NaN</font></b>; // "number"(特殊的数字值,表示“不是一个数字”)<br>
String
typeof "hello"; // "string"<br>typeof 'world'; // "string"<br>
Boolean
typeof true; // "boolean"<br>typeof false; // "boolean"<br>
Undefined
typeof undefined; // "undefined"<br>let x;<br>typeof x; // "undefined"<br>
Function
typeof function() {}; // "function"<br>typeof Math.sin; // "function"<br>
Symbol(ES6)
创建唯一的标识符
typeof Symbol(); // "symbol"<br>
BigInt
ES2020 引入的一个新的数字类型,用于表示大于 2^53 - 1 的整数
typeof BigInt(12345678901234567890n); // "bigint"<br>
object
普通对象
typeof {name: "Alice", age: 25}; // "object"<br>
array
typeof [1, 2, 3]; // "object"<br>
Date
typeof new Date(); // "object"<br>
正则
typeof /abc/; // "object"<br>
<b><font color="#e74f4c">null</font></b>
typeof null; // "object"<br>
Math 和 JSON 对象<br>
这些内置对象也被视为普通的JavaScript对象。
typeof Math; // "object"<br>typeof JSON; // "object"<br>
错误
如 Error, TypeError, SyntaxError 等。
typeof new Error("Error message"); // "object"<br>
包装对象<br>
当原始数据类型(如字符串、数字、布尔值)被用作对象时,<br>它们将被转换为临时的包装对象。
typeof new String("Hello"); // "object"<br>typeof new Number(100); // "object"<br>typeof new Boolean(true); // "object"<br>
instanceof
Array.isArray(参数)<br>
object
set(es6)
允许存储<b><font color="#e74f4c">唯一值</font></b>的集合,无论这个值是基本类型还是对象引用。<br>Set 内的值总是唯一的,没有重复的值。<br><b><font color="#e74f4c">可以用来去重</font></b>
map(es6)
<b><font color="#e74f4c">键值对的集合</font></b>,<br>但是它和普通的对象有所不同,因为Map的<b><font color="#e74f4c">键</font></b>可以是<b><font color="#e74f4c">任何类型</font></b>,<br>包括函数、对象或任意基本类型。<br><b><font color="#e74f4c">相比object,key可以接收任何数据类型</font></b>
数据类型的转换
隐式转换
<b><font color="#e74f4c">+</font></b>号两边只要有一个是<b>string</b>,就都是<b>string</b>
也可以+'123',把它转换成number<br>次数+是正号的意思<br>
<b><font color="#e74f4c">除+外</font></b>的其他运算符,都把数据转换成<b>number</b>型
‘’和null都转换成0
显式转换
数字型
Number(x)<br>
5px - NaN
parseInt(x)
整数
12px-<font color="#e74f4c">12</font>
12.34px-<font color="#e74f4c">12</font>
<strike>abc12.34px-<font color="#e74f4c">NaN</font></strike>
parseFloat(x)
浮点数
12.34px-<font color="#e74f4c">12.34</font>
<strike>abc12.34px-<font color="#e74f4c">NaN</font></strike>
布尔型
Boolean()
运算符<br>
算术运算符
+<br>-<br>*<br>/<br>%,取余<br>
<b><font color="#e74f4c">浮点数不要直接计算</font></b>
console.log(0.1+0.2)<br>>>0.30000000000000004<br>浮点数会先转换成二进制,
解决方法
(0.1*10+0.2*10)/10
<b><font color="#e74f4c">num.toFIxed(1)</font></b><br>
num精确到小数点后一位
赋值运算符
容器 = 值
+=<br>-=<br>*=<br>/=<br>%=<br>
num += 1
num = num + 1
一元运算符
++<br>--<br>
num++
先<b>返回num的当前值</b>,然后再+1
let num=10;<br>console.log(num++ + 10); <font color="#e74f4c">//20</font><br>因为参与运算的时候用的是当前值<br>console.log(num); <font color="#e74f4c">//11<br></font>结束后+1
开发中多用后置,并单独一行
num++;
num--;
单独使用都一样
++num
先num+1,然后再<b>返回num的新值</b>(即+完1的值)
比较运算符
><br><<br>>=<br><=<br>==(比较少用)<br>!=<br><b><font color="#e74f4c">===</font><br></b>!==,值or数据类型<br>
尽量不要比较小数,涉及精度<br>
关于==
[] == ![]
逻辑运算符
&&,与<br>||,或<br>!,非<br>
<font color="#e74f4c"><b>值为false的</b></font>
<font color="#e74f4c"><b>false</b> - 布尔值false。<br><b>0</b> - 数字0(包括正0和负0)。<br><b>-0</b> - 负零。<br><b>"" </b>- 空字符串(包括双引号和单引号中的空字符串)。<br><b>null </b>- 表示“没有值”的特殊关键字。<br><b>undefined </b>- 表示未定义的特殊值。<br><b>NaN</b> - 表示“不是一个数字”的特殊值。</font>
优先级
<font color="#e74f4c"><b>复杂的运算表达式用()来区分</b></font>
<font color="#e74f4c">...</font>
扩展操作符
在数组中使用
可以用来<b>合并数组</b>,<br>或在数组字面量中任意位置<b>插入</b>另一个数组的所有元素。<br>
const arr1 = [1, 2, 3];<br>const arr2 = [4, 5, 6];<br>const combinedArr = [<b>...arr1</b>, <b>...arr2</b>]; // [1, 2, 3, 4, 5, 6]<br><br>const newArr = [0, <b>...arr1</b>, 7]; // [0, 1, 2, 3, 7]<br>
在对象中使用
可以用于对象字面量,用于<b>合并对象</b>或将一个对象的<b>属性复制</b>到另一个新对象中。<br>在ES2018及以后版本中,对象展开运算符成为标准功能。<br>
const obj1 = { foo: 'bar', x: 42 };<br>const obj2 = { foo: 'baz', y: 13 };<br>const mergedObj = { <b>...obj1</b>, <b>...obj2</b> }; // { foo: 'baz', x: 42, y: 13 }<br>// 注意: obj2 的 foo 属性<b>覆盖</b>了 obj1 的 foo 属性<br>
函数调用
当<b>调用函数</b>时,可以用于<b>传递数组<font color="#e74f4c">元素</font></b>作为独立的参数。<br>
function sum(x, y, z) {<br> return x + y + z;<br>}<br>const numbers = [<font color="#e74f4c">1, 2, 3</font>];<br>console.log(sum(<b>...numbers</b>)); // 等同于 sum(<font color="#e74f4c">1, 2, 3</font>)<br>
使用场景和好处<br>- **简化数组操作**:如合并数组,或在数组构建时插入额外的元素。<br>- **克隆数组和对象**:可以快速克隆现有的数组或对象,同时保证原始数据的安全。<br>- **函数参数的扩展**:将数组转换为参数序列,简化函数调用过程。<br>- **替代函数的 `apply` 方法**:在将数组作为函数参数时,可以使用展开运算符代替 `Function.prototype.apply` 方法。
条件语句
if
if (condition) {<br> // 代码块: 当条件为真时执行<br>}<br>
if (condition) {<br> // 当条件为真时执行这段代码<br>} else {<br> // 当条件为假时执行这段代码<br>}<br>
if (condition1) {<br> // 条件1为真时执行<br>} else if (condition2) {<br> // 条件1为假且条件2为真时执行<br>} else {<br> // 条件1和条件2都为假时执行<br>}<br>
JavaScript 社区中常见的风格是不换行,} else放一起<br>
condition 表达式中可以使用<b>比较运算符</b>(如 ==, !=, ===, !==, <, >, <=, >=)<br>和<b>逻辑运算符</b>(如 &&, ||, !)来构建复杂的条件。
三元
condition ? expression1 : expression2<br>
这个运算符包括三个部分:<br><br>条件(condition):一个返回布尔值(true或false)的表达式。这个条件会被首先评估。<br>表达式1(expression1):如果条件为true,将执行并返回这个表达式的结果。<br>表达式2(expression2):如果条件为false,将执行并返回这个表达式的结果。
一般用于条件赋值
let sum = 3 < 5 ? 3 : 5
switch
5个以上分支效率比if快<br>分支值确定也用switch<br>
switch (expression) {<br> case value1:<br> // 当expression的结果===value1时执行的代码<br> break<br> case value2:<br> // 当expression的结果===value2时执行的代码<br> break<br> ...<br> default:<br> // 当没有任何case匹配时执行的代码<br>}<br>
<ul><li>expression: 这是switch语句中要评估的表达式。</li><li>case value: 这些是与expression的结果进行比较的值。如果匹配,执行相应的case下的代码。</li><li>break: 关键字用于退出switch语句。如果不使用break,程序将继续执行下一个case,而不管其条件是否匹配。</li><li>default: 这是当没有一个case匹配expression的结果时执行的代码块。它是可选的。</li></ul>
<span style="font-size:inherit;">注意事项</span><br><ul><li><span style="font-size:inherit;">在每个case后面使用break来防止执行流落入下一个case。</span></li><li>如果多个case应该执行相同的代码,可以将它们顺序排列,直到最后一个执行break。</li><li>default子句不是必需的,但它可以用来处理未匹配到任何case的情况。</li><li>switch语句中的比较是严格的(使用===),意味着值和类型都必须匹配。</li></ul>
断点调试<br>
循环
while
while (condition) {<br> // 当条件为真时执行的代码块<br>}<br>
<ul><li>condition: 这是每次循环开始前评估的表达式。如果条件的值为真(true),则执行代码块。每执行一次循环体,条件都会被重新评估。</li><li>循环体内的代码:如果条件为真,则执行这些代码。</li></ul>
三要素:变量起始值+终止条件+变量变化量
do while
do {<br> // 代码块至少执行一次<br>} while (condition)<br>
很少用到
break和continue
break退出整个循环
let i = 0<br>while (i < 10) {<br> if (i === 5) {<br> <b>break </b>// 当i等于5时,退出循环<br> }<br> console.log(i)<br> <b>i++</b><br>}<br><br>// 输出将是:<br>// 0<br>// 1<br>// 2<br>// 3<br>// 4<br>
continue跳过本次循环
let i = 0<br><br>while (i < 10) {<br> <b> <font color="#e74f4c">i++</font><br></b> if (i === 5) {<br> <b>continue</b> // 当i等于5时,跳过当前迭代的剩余部分<br> }<br> console.log(i)<br>}<br><br>// 输出将是:<br>// 1<br>// 2<br>// 3<br><b>// 4<br>// 6</b><br>// 7<br>// 8<br>// 9<br>// 10<br>
如果有continue,确保在判断之前,<font color="#e74f4c">已经执行过变量增加</font><br>不然continue会跳过本次循环,那么continue下面的代码就不会执行,会死循环<br>
for
for(起始值;终止条件;变化量){<br><br>}<br>
for (let i = 1; i <= 3; i++) {<br> document.write(`${i}<br>`)<br> }
起始值只会执行一次<br>
<font color="#e74f4c"><b>遍历数组</b></font><br>
<b><font color="#e74f4c">let</font></b> arr = ['lucas', 'bill', 'matte', 'pepper']<br> for (<b><font color="#e74f4c">let</font></b> arr_index = <b><font color="#e74f4c">0</font></b>; arr_index <font color="#e74f4c"><b><</b></font> <b><font color="#e74f4c">arr.length</font></b>; arr_index++) {<br> document.write(`${arr_index}: ${arr[arr_index]}<br>`)<br> }
for(;;)<br>
死循环
嵌套
<font color="#e74f4c"><b>乘法表</b></font><br>
for (row = 1; row <= 9; row++) {<br> for (col = 1; <font color="#e74f4c">col <= row</font>; col++) {<br> document.write(`|${<font color="#e74f4c">col} x ${row</font>} = ${row * col}|`)<br> }<br> document.write(`<br>`)<br> }
数组<br>
声明
let arr = [1, 2, 3, 4]<br>let arr1 = new Array(1, 2, 3, 4)
操作<br>
取值<br>
arr[2] // 3<br>
长度
arr<font color="#e74f4c"><b>.length</b></font>
求和
声明sum<br>遍历数组,每个元素加入sum<br>
let arr = [1, 2, 3, 4]<br>let sum = 0<br>for (index = 0; index < +arr.length; index++) {<br> sum += arr[index]<br> }<br>document.write(sum)
最大最小
设置一个max,初始值是无穷小<br>设置一个min,初始值是无穷大<br>然后遍历数组和max,min比较<br>
查
数组[下标]<br>
增
arr.push(新值)
<b><font color="#e74f4c">末尾</font></b>添加<b>1或多个</b>元素
有返回值,返回新数组长度
arr.unshift(新值)
<b><font color="#e74f4c">头部</font></b>添加<b>1或多个</b>元素
有返回值,返回新数组的长度
删
arr.pop()
删除<b><font color="#e74f4c">最后一个</font></b>元素,返回该元素
arr.shift()
删除<b><font color="#e74f4c">第一个</font></b>元素,返回该元素
<b><font color="#e74f4c">arr.splice</font>(start,deleteCount)</b>
(起始位置,删除几个元素)
改
数组[下标] = 新值<br>
<b><font color="#e74f4c">遍历</font></b>
<b><font color="#e74f4c">arr.forEach()</font></b>
arr.indexOf()<br>
从头开始找,找到返回index<br>找不到返回-1
let arr = [2, 5, 9, 2];<br>console.log(arr.indexOf(2)); // 输出:0<br>console.log(arr.indexOf(7)); // 输出:-1,表示未找到<br>
arr.lastIndexOf()
从尾开始找,找到返回index<br>找不到返回-1
let arr = [2, 5, 9, 2];<br>console.log(arr.lastIndexOf(2)); // 输出:3<br>console.log(arr.lastIndexOf(7)); // 输出:-1,表示未找到<br>
arr.filter()<br>
筛选
let numbers = [1, 2, 3, 4];<br>let evens = numbers.filter(num => num % 2 === 0); // [2, 4]<br>
arr.reduce()
案例<br>
筛选数组中符合条件的元素
遍历数组<br>每个元素判断<br>符合条件放入新数组<br>
冒泡排序<br>
排序<br>
arr.sort()<br>
默认升序<br>
或者也可以这么写<br>arr.sort(function(a,b){<br>return <font color="#e74f4c"><b>a-b</b></font><br>})<br>
降序
arr.sort(function(a,b){<br>return <b><font color="#e74f4c">b-a</font></b><br>})
函数<br>
使用
声明<br>
<font color="#e74f4c"><b>function 函数名(){<br>}</b></font>
调用
<font color="#e74f4c"><b>函数名()</b></font>
参数
<font color="#e74f4c"><b>function 函数名(参数1,参数2){<br>}</b></font><br>
声明的时候是形参<br>调用的时候是实参<br>
<font color="#e74f4c">形参<b>多于</b>实参</font>,后面的都是undefined<br>
<font color="#e74f4c">实参<b>多余</b>形参</font>,后面的忽略
function 函数名(<font color="#e74f4c">参数1 = 0,参数2 = 0</font>){<br>}
默认参数
例子<br>
数组求和<br>
返回值
需要返回值的几种情况
计算结果:函数用于执行计算或数据处理,需要返回结果。<br>
条件判断:函数根据输入返回true或false来指示条件是否满足。<br>
获取数据:函数用于从数据源检索数据,需要返回这些数据。<br>
API调用结果:进行API调用或异步操作时,函数返回操作的状态码或数据对象。<br>
重用和模块化:通过返回值,函数的输出可以被其他部分重用,促进代码模块化。<br>
链式调用:某些编程范式中,函数返回其实例或对象以支持链式调用。<br>
错误处理:函数返回错误代码或值来通知调用者发生了错误。
return
return只返回一个值<br>return num1,num2只会返回最后一个值<br>
没return的默认undefined
求和函数
可以用<font color="#e74f4c">数组[ ]</font>或者<font color="#e74f4c">对象{ }</font>来返回多个值<br>
作用域
全局
局部
局部变量和全局变量冲突时,<font color="#e74f4c">就近原则</font>
打印的是20
但是这时候在外面console.log(num),就还是20
let的块级作用于
匿名函数
function(){<br>}
<br>
<font color="#e74f4c"><b>立即执行函数</b></font><br>
可以避免全局变量之间的污染
立即执行函数后面要加<font color="#e74f4c"><b>;</b></font>
子主题
<font color="#e74f4c">逻辑中断</font>
只存在于 <b><font color="#e74f4c">&& </font></b>和<b><font color="#e74f4c"> || </font></b>中,当满足一定条件会让<font color="#e74f4c">右边代码不执行</font>
<b><font color="#e74f4c">false &&</font></b> 后面就不执行了<br><b><font color="#e74f4c">true ||</font></b> 后面就不执行了<br>
true && true,返回<font color="#e74f4c">最后一个</font>true<br>false || false,返回第一个false<br>
箭头函数
不过一行的函数可读性和可维护性差,不要这么写
因为箭头函数中的this,是指向包裹它的作用域的,<br>所以现在一般写函数都写=>函数<br>
环境对象
指的是函数内部特殊的<b><font color="#e74f4c">变量</font></b> <font color="#e74f4c"><b>this </b></font>,它代表着当前函数运行时所处的环境
<font color="#e74f4c"><b>普通函数里,this指向window</b></font>
<font color="#e74f4c">一般:谁调用函数,this指向谁</font>
<br>
<b>左边:普通function里,谁调用this指向谁</b><br>this的这个function是传递给setTimeout的,<br>而在浏览器下,setTimeout是由window管的,<br>也就是说this指向类window,所以结果是NaN。
<b>右边:箭头函数里,谁包裹它this指向谁</b><br>this的箭头函数包含在setTimeout里,<br>而setTimeout又包含在普通函数nextDay里,<br>而nextDay是calendar在调用,<br>所以this可以指向calendar。结果为7
1,hello world,因为是object在调用<br>
2,Hello world,因为object调用的greet<br> Hello undefined,因为farewell是箭头函数,this被包裹其中,而farewell是全局作用域的,所以this指向的是window
对象自身不引入一个新的作用域,无论是块级作用域还是函数作用域。<br>对象内部的函数(包括箭头函数)在查找变量或 this 上下文时,不会将对象视为一个单独的作用域。
3,Hello undefined,因为最终是foo在调用,foo里没有who<br>Hello mason,这个是object在调用
4,Hello undefined,object调用cb,cb调用foo,所以是cb在调用this,cb里没有who
对象
声明<br>
let 对象名 = {}<br>let 对象名 = new Object()<br>
属性的增删改<br>
查
对象名.属性
<font color="#e74f4c"><b>对象名['属性名']</b></font><br>
适合于属性名是字符串的
改
对象名.属性 = 新值
增
对象名.新属性 = 新值
删
delete 对象名.属性
动态属性
方法
调用
对象.方法()
<b><font color="#e74f4c">遍历对象</font></b>
for in
for in获取的下标是string,一般用于遍历对象
Object.keys(obj)<br>
obj里的所有key,放入一个array<br>
Object.values(obj)<br>
obj里所有值,,放入一个array<br>
Object.entries(obj)<br>
obj里所有[key, value],返回一个array,每个元素是[key, value]形式的小array<br>
内置对象
document.write()<br>console.log()<br>
<b><font color="#e74f4c">Math</font></b>
https://www.runoob.com/jsref/jsref-obj-math.html
Math.random(),随机生成<font color="#e74f4c"><b>[0, 1)</b></font>之间的数<br>
<font color="#e74f4c">//生成N-M之间的随机<u>整数</u></font><br>Math.<b><font color="#e74f4c">floor</font></b>(Math.random() * <font color="#e74f4c"><b>(M - N + 1)</b></font>) + N<br>
拷贝
浅拷贝
只拷贝地址
数组
对象
深拷贝
<b><font color="#e74f4c">存储方式</font></b>
简单数据类型
复杂数据类型
promises
处理异步操作的一种机制,<br>可以避免callback hell(多层嵌套的回调函数)
三种状态
pending:初始状态,既不是成功,也不是失败。
fulfilled:意味着操作成功完成。
rejected:意味着操作失败。
用法
创建
使用
web API
(思想转变)变量声明
<font color="#e74f4c"><b>const</b></font>优先,后面发现要修改,再改成let
常量一般用大写,const MAX_NUMBER = 100;<br>
<b>复杂数据类型</b>,指向的是地址,只要地址不修改,都可以用const
<b><font color="#e74f4c">数组</font></b>和<b><font color="#e74f4c">对象</font></b>使用<b><font color="#e74f4c">const</font></b>声明
作用和分类
作用: 就是使用 JS 去操作 html 和浏览器<br>分类:DOM (文档对象模型)、BOM(浏览器对象模型)
DOM获取&属性操作
概念
Document Object Model<br>DOM是浏览器提供的一套专门用来 <b><font color="#e74f4c">操作网页内容</font></b> 的功能<br>可以开发网页内容特效和实现用户交<br>互<br>
DOM树
描述HTML文档的结构
文档树直观的体现了标签与标签之间的关系
<font color="#e74f4c"><b>DOM对象</b></font>
浏览器根据html标签生成的 <b><font color="#e74f4c">JS对象(有属性和方法)</font></b>
所有的标签属性都可以在这个对象上面找到
修改这个对象的属性会自动映射到标签身上
DOM的核心思想
把网页内容当做<font color="#e74f4c"><b>对象</b></font>来处理
document 对象
是 DOM 里提供的一个<b><font color="#e74f4c">对象</font></b><br>所以它提供的属性和方法都是<font color="#e74f4c">用来访问和操作网页内容的<br></font>例:document.write()<br>
<font color="#e74f4c"><b>网页所有内容都在document里面</b></font>
获取DOM对象<br>
<font color="#e74f4c">查找元素DOM元素就是利用 JS 选择页面中标签元素</font>
<b><font color="#e74f4c">通过css选择器</font></b>
选择匹配的<font color="#e74f4c">第一个</font>元素
<font color="#000000">const 常量名 =</font><font color="#e74f4c"> document.querySelector(<b>'</b>css选择器<b>'</b>)</font><br>
document.querySelector('div')
document.querySelector('.box')
document.querySelector('#nav')<br>
document.querySelector('ul li:first-child')
获取后可以直接修改(类似对象的属性)
返回值<br>
CSS选择器匹配的第一个元素,一个 HTMLElement对象。<br>如果没有匹配到,则返回null。
选择匹配的<font color="#e74f4c">多个</font>元素
const 名 = <font color="#e74f4c">document.querySelectorAll(<b>'</b>ul li<b>'</b>)</font><br>
获取后要遍历才能修改
<font color="#e74f4c"><b>返回值</b></font>
CSS选择器匹配的NodeList 对象集合,数组形式展示<font color="#e74f4c"><b>(伪数组)</b></font>
有长度,有索引号的数组<br>但是没有 pop() push() 等数组方法<br>
用for遍历
<b><font color="#e74f4c">document.body</font></b>
页面只有一个body,所以可以直接获取body标签,
其他方法<br>
看得懂就行,现在不用这个
操作元素内容
对象.<font color="#e74f4c"><b>innerText </b></font>属性
将文本内容<b>添加/更新</b>到任意标签位置<br>显示<b><font color="#e74f4c">纯文本</font></b>,不解析标签
<div class="box"><br> 我是文字的内容<br> </div>
对象.<b><font color="#e74f4c">innerHTML</font></b> 属性(用这个)
将文本内容<b>添加/更新</b>到任意标签位置<br>会<b><font color="#e74f4c">解析标签</font></b>,多标签建议使用模板字符
操作元素属性<br>
<font color="#e74f4c">常用</font>属性
<b><font color="#e74f4c">对象.属性 = 值</font></b>(有就是改,没有就是增)
例
刷新页面,图片随机更换<br>1. 获取图片元素<br>2. 随机得到图片序号<br>3. 图片.src = 图片随机路径<br>
<font color="#e74f4c">样式</font>属性
通过 style 属性操作CSS<br>(这么写太长了,适合修改少的)<br>
<font color="#e74f4c">对象.<b>style</b>.样式属性 = ‘值’</font>
例<br>
刷新页面,随机更换<b><font color="#e74f4c">背景</font></b>图片<br>①: 随机函数<br>②: css页面背景图片 background-image<br>③: 标签选择body, 因为body是唯一的标签,可以直接写 document.body.style<br>
操作类名(<b><font color="#e74f4c">className</font></b>) 操作CSS<br>(但这种容易覆盖之前的类)<br>
<font color="#e74f4c"><b>元素.className = ‘要修成的类名’</b></font>
<b>通过 <font color="#e74f4c">classList </font>操作类控制CSS<br>(优先用这种)<br></b>
<b><font color="#e74f4c">元素.classList.方法(‘类名’)</font></b>
//添加一个类<br>元素.classList.add('类名')
//删除一个类<br>元素.classList.remove('类名')
//切换一个类<br>元素.classList.toggle('类名')
例子
轮播图随机版<br>需求:当我们刷新页面,页面中的轮播图会显示不同图片以及样式<br>模块:<br>①:图片会随机变换<br>②:底部盒子背景颜色和文字内容会变换<br>③:小圆点随机一个高亮显示<br>
<font color="#e74f4c">表单</font>属性
获取:DOM对象.属性名<br>设置:<b><font color="#e74f4c">DOM对象.属性名 = 新值</font></b><br>
表单内容
表单.value = ‘新值’
表单type
表单.type = ‘新type’
表单属性中<b>添加</b>就有效果,<b>移除</b>就没有效果,一律使用<b>布尔值</b>表示 <br>如果为<b><font color="#e74f4c">true</font> </b>代表添加了该属性 如果是<b><font color="#e74f4c">false</font> </b>代表移除了该属性
<font color="#e74f4c">自定义</font>属性(H5新增)
在html5中推出来了专门的<font color="#e74f4c"><b>data-</b></font>自定义属性<br>在标签上一律以<b><font color="#e74f4c">data-</font></b>开头<br>在DOM对象上一律以<b><font color="#e74f4c">dataset</font></b>对象方式获取
<font color="#e74f4c"><b>定时器-间歇函数</b></font>
开启
<b><font color="#e74f4c">setInterval</font></b>(函数, 间隔时间)
作用:每隔一段时间调用这个函数<br>间隔时间单位是<font color="#e74f4c"><b>毫秒(1000毫秒=1秒)</b></font>
定时器返回的是一个<b><font color="#e74f4c">id数字</font></b>
关闭
<b><font color="#e74f4c">clearInterval</font></b>()
code
用<b><font color="#e74f4c">let</font></b>,因为定时器会重复开关,会变
例子
阅读注册协议
需求:按钮60秒之后才可以使用<br>分析:<br>①:开始先把按钮禁用(disabled 属性)<br>②:一定要获取元素<br>③:函数内处理逻辑<br> 秒数开始减减<br> 按钮里面的文字跟着一起变化<br> 如果秒数等于0 停止定时器 里面文字变为 同意 最后 按钮可以点击
DOM事件基础
事件监听
什么是事件:<br>事件是在编程时系统内发生的<font color="#e74f4c">动作</font>或者发生的事情<br>比如用户在网页上<font color="#e74f4c">单击</font>一个按钮
<font color="#e74f4c"><b>元素对象.addEventListener(‘事件类型’,要执行的函数)</b></font>
<b>事件源:</b> 那个dom元素被事件触发了,要获取dom元素 <br><b>事件类型:</b> 用什么方式触发,比如鼠标单击 click、鼠标经过 mouseover 等<br><b>事件调用的函数:</b> 要做什么事
例子
需求: 点击了按钮,弹出一个对话框<br>1. 事件源 按钮 <br>2.事件类型 点击鼠标 click 字符串<br>3. 事件处理程序 弹出对话框
几种版本<br>
事件源.on事件 = function() { }
on方式会被覆盖,addEventListener方式可绑定多次,拥有事件更多特性,推荐使用
事件类型
鼠标事件
<font color="#e74f4c"><b>click</b></font>
<font color="#e74f4c"><b>mouseenter</b></font>鼠标经过
<font color="#e74f4c"><b>mouseleave</b></font>鼠标离开<br>
焦点事件
<b><font color="#e74f4c">focus</font></b>获得焦点
<b><font color="#e74f4c">blur</font></b>失去焦点
键盘事件
<b><font color="#e74f4c">Keydown</font></b>键盘按下
<b><font color="#e74f4c">Keyup</font></b>键盘抬起
文本事件
<b><font color="#e74f4c">input</font></b>用户输入
后去用户输入的内容<br>
<br>获取用户输入字数<br>
事件对象
事件对象是什么<br>也是个对象,这个对象里有<font color="#e74f4c">事件触发时的相关信息</font><br>例如:鼠标点击事件中,事件对象就存了<font color="#e74f4c">鼠标点在哪个位置等信息</font>
参数为event、ev、e<br>
常用事件对象属性
<font color="#e74f4c">type</font>
获取当前的事件类型
clientX/clientY
获取光标相对于<font color="#e74f4c">浏览器可见窗口</font>左上角的位置
offsetX/offsetY
获取光标相对于<font color="#e74f4c">当前DOM元素</font>左上角的位置
<font color="#e74f4c">key</font>
用户按下的<font color="#e74f4c"><b>键盘键的值</b></font><br>现在不提倡使用keyCode
环境对象
指的是函数内部特殊的<b><font color="#e74f4c">变量</font></b> <font color="#e74f4c"><b>this </b></font>,它代表着当前函数运行时所处的环境
<font color="#e74f4c"><b>普通函数里,this指向window</b></font>
<font color="#e74f4c">一般:谁调用函数,this指向谁</font>
<br>
<b>左边:普通function里,谁调用this指向谁</b><br>this的这个function是传递给setTimeout的,<br>而在浏览器下,setTimeout是由window管的,<br>也就是说this指向类window,所以结果是NaN。
<b>右边:箭头函数里,谁包裹它this指向谁</b><br>this的箭头函数包含在setTimeout里,<br>而setTimeout又包含在普通函数nextDay里,<br>而nextDay是calendar在调用,<br>所以this可以指向calendar。结果为7
回调函数
如果将<b>函数 A </b><font color="#e74f4c">做为参数</font>传递给<b>函数 B </b>时,我们称<font color="#e74f4c"><b>函数 A 为回调函数</b></font><br>简单理解: 当一个函数当做参数来传递给另外一个函数的时候,这个函数就是回调函数
fn这个函数一秒回头调用一次
里面的函数,每点一次,调用一次
DOM事件进阶
事件流
事件流与两个阶段说明(捕获,冒泡)
<b>事件流</b>指的是事件完<b>整执行过程</b>中的<font color="#e74f4c">流动路径</font>
简单来说:<b><font color="#e74f4c">捕获阶段</font></b>是 从父到子 <font color="#e74f4c"><b> 冒泡阶段</b></font>是从子到父<br><b><font color="#e74f4c">实际工作都是使用事件冒泡为主</font></b><br>
事件捕获
从DOM的根元素开始去执行对应的事件 (从外到里)
<font color="#e74f4c">事件冒泡</font>
当一个元素的<b><font color="#e74f4c">事件被触发</font></b>时,同样的事件将会在该元素的所有祖先元素中依次被触发。
简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的 <b><font color="#e74f4c">同名事件</font></b>
事件冒泡是默认存在的<br>L2事件监听第三个参数是 false,或者默认都是冒泡
mouseover 和 mouseout 会有冒泡效果<br><b><font color="#e74f4c">mouseenter 和 mouseleave 没有冒泡效果 (推荐</font></b>)<br>
阻止冒泡
问题:因为默认就有冒泡模式的存在,所以容易导致事件影响到父级元素<br>需求:若想把事件就限制在当前元素内,就需要阻止事件冒泡
<font color="#e74f4c"><b>事件对象.stopPropagation()</b></font><br>
此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效
阻止默认行为
比如,阻止链接跳转,阻止表单提交(关键信息没有填好)
<b><font color="#e74f4c">e.prevenDefault()</font></b><br>
解绑事件
L0的
on事件方式,直接使用<font color="#e74f4c">null</font>覆盖偶就可以实现事件的解绑
L2的
<b><font color="#e74f4c">匿名函数无法解绑</font></b>,因为removeEventListener这个方法无法获取函数名
<b><font color="#e74f4c">两种注册事件的区别</font></b><br>l 传统on注册(L0)<br>Ø 同一个对象,后面注册的事件会覆盖前面注册(同一个事件)<br>Ø 直接使用null覆盖偶就可以实现事件的解绑<br>Ø 都是冒泡阶段执行的<br>l 事件监听注册(L2)<br>Ø 语法: addEventListener(事件类型, 事件处理函数, 是否使用捕获) Ø 后面注册的事件不会覆盖前面注册的事件(同一个事件)<br>Ø 可以通过第三个参数去确定是在冒泡或者捕获阶段执行<br>Ø 必须使用removeEventListener(事件类型, 事件处理函数, 获取捕获或者冒泡阶段) Ø 匿名函数无法被解绑
事件委托
它利用了<b><font color="#e74f4c">事件冒泡</font></b>原理,<br>在<b>父元素</b>上设置<b><font color="#e74f4c">单个事件监听器</font></b>来管理<b>多个子元素</b>的事件,<br>以提高性能并避免重复代码。<br>
<b><font color="#e74f4c">原理</font></b>
给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事<br>件<br>
实现
其他事件
页面加载事件
Ø 有些时候需要等页面资源全部处理完了做一些事情<br>Ø 老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到
<font color="#e74f4c"><b>load</b></font>
给<b><font color="#e74f4c">window</font></b>添加load事件
<b><font color="#e74f4c">window.addEventListener('load', function () {<br>}</font></b>
等<b><font color="#e74f4c">图片</font></b>加载
<b><font color="#e74f4c">img</font></b>.addEventListener('load', function () {<br>//等待图片加载完毕,再去执行里面的代码<br>})<br>
<b><font color="#e74f4c">DOMContentLoaded</font></b>
当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载
给<b><font color="#e74f4c">document</font></b>添加DOMContentLoaded事件<br>
元素滚动事件
很多网页需要检测用户把页面滚动到某个区域后做一些处理, 比如固定导航栏,比如返回顶部
<b><font color="#e74f4c">scroll</font></b>
<b><font color="#e74f4c">window</font></b>.addEventListener('<b><font color="#e74f4c">scroll</font></b>', function () {<br> console.log('我滚了')<br>})<br>
给 window 或 document 添加 scroll 事件<br>监听某个元素的内部滚动直接给某个元素加即可<br>
获取页面HTML元素(包括head和body)<br>
<b><font color="#e74f4c">document.documentElement</font></b>
<b><font color="#e74f4c">scrollLeft</font></b>和<b><font color="#e74f4c">scrollTop</font> </b>(属性)
尽量在scroll事件里面获取被卷去的距离<br>(比如滚动条是再div里,就在div里添加一个scroll监听)<br>
开发中,我们经常检测页面滚动的距离,<br>比如页面滚动100像素,就可以显示一个元素,或者固定一个元素
<b><font color="#e74f4c">可读写</font></b><br>
<b><font color="#e74f4c">scrollTo()</font></b>
<b><font color="#e74f4c">元素.scrollTo(x, y)</font></b>
页面尺寸事件
<b><font color="#e74f4c">resize</font></b>
会在窗口尺寸改变的时候触发事件
<font color="#e74f4c"><b>clientWidth和clientHeight</b></font>
获取元素的可见部分宽高(不包含边框,margin,滚动条等)
一个跟随窗口尺寸调整内容的案例
元素尺寸和位置
就是通过js的方式,得到元素在页面中的位置<br>这样我们可以做,页面滚动到这个位置,就可以做某些操作,省去计算了
<font color="#e74f4c"><b>offsetLeft和offsetTop</b></font>(只读)
获取元素的自身宽高<br><font color="#e74f4c"><b>包含</b></font>元素自身设置的宽高、padding、border<br><b>注意: </b>获取的是可视宽高, 如果盒子是隐藏的,获取的结果是0<br>
检测盒子的位置 <font color="#e74f4c"><b>最近一级带有定位</b></font>的祖先元素的距离<br>如果<b>都没有</b>则以 <font color="#e74f4c">文档左上角</font> 为准<br>
DOM节点&移动端滑动
日期对象<br>
实例化
const date = <b><font color="#e74f4c">new </font></b><font color="#e74f4c">Date()</font>
时间对象方法
获取日期和时间<br>date.getFullYear():获取年份(4位数)。<br>date.getMonth():获取月份,从0开始计数,所以1月是0,12月是11。<br>date.getDate():获取月份中的第几天(1-31)。<br>date.getDay():获取星期几,从0(周日)到6(周六)。<br>date.getHours():获取小时(0-23)。<br>date.getMinutes():获取分钟(0-59)。<br>date.getSeconds():获取秒数(0-59)。<br>date.getMilliseconds():获取毫秒数(0-999)。<br>date.getTime():获取自1970年1月1日以来的毫秒数。
设置日期和时间<br>date.setFullYear(year, [month], [date]):设置年份。<br>date.setMonth(month, [date]):设置月份(0-11)。<br>date.setDate(day):设置月份中的第几天(1-31)。<br>date.setHours(hours, [min], [sec], [ms]):设置小时(0-23)。<br>date.setMinutes(min, [sec], [ms]):设置分钟(0-59)。<br>date.setSeconds(sec, [ms]):设置秒数(0-59)。<br>date.setMilliseconds(ms):设置毫秒数(0-999)。<br>date.setTime(milliseconds):以毫秒为单位设置日期,自1970年1月1日起。
格式化和转换<br>date.toString():将日期转换为字符串,包含完整的日期和时间信息。<br>date.toDateString():仅将日期部分转换为易读的字符串。<br>date.toTimeString():仅将时间部分转换为易读的字符串。<br>date.toISOString():将日期转换为ISO 8601格式的字符串。<br>date.toUTCString():将日期转换为UTC格式的字符串。<br>date.toLocaleDateString():根据本地习惯,将日期部分转换为字符串。<br>date.toLocaleTimeString():根据本地习惯,将时间部分转换为字符串。
例
格式化显示
定时器版本
显示星期几
时间戳
是指1970年01月01日00时00分00秒起至现在的<font color="#e74f4c">毫秒数</font>,它是一种特殊的<font color="#e74f4c"><b>计量时间</b></font>的方式
<font color="#000000">一般用于</font><font color="#e74f4c">计算倒计时</font>
<b><font color="#e74f4c">getTime()</font></b>
需要先实例化<br>
获得指定时间戳
<b><font color="#e74f4c">+new Date()</font></b>
new Date()获取字符型,+变成数字型<br>
获得指定时间戳
<font color="#e74f4c"><b>Date.now()</b></font>
只能返回当前时间戳
节点操作
DOM节点<br>
DOM树里每一个内容都称之为节点
类型:<br>元素节点<br>属性节点<br>文本节点<br>等<br>
查找节点
父节点查找
<b><font color="#e74f4c">子元素.parentNode</font></b>
返回最近一级的父节点(DOM对象)<br>找不到返回null<br>
子节点查找
父节点.childNodes(没啥用)
获得所有子节点、包括文本节点(空格、换行)、注释节点等
<b><font color="#e74f4c">父节点.children</font></b>
仅获得所有元素节点(标签)<br>返回的还是一个伪数组
兄弟节点
下一个
<font color="#e74f4c"><b>nextElementSibling</b></font>
上一个
<b><font color="#e74f4c">previousElementSibling</font></b>
增加节点
概念
很多情况下,我们需要在页面中增加元素<br>比如,点击发布按钮,可以新增一条信息
创建一个新的节点<br>把创建的新的节点放入到指定的元素内部
创建节点
<font color="#e74f4c">document.<b>createElement</b>('标签名')</font>
追加节点
插入到父元素的<b><font color="#e74f4c">最后一个</font></b>子元素
<b><font color="#e74f4c">父元素.appendChild(要插入的元素) </font><font color="#000000">没引号,因为这里是变量</font></b>
插入到父元素中某个子元素的<font color="#e74f4c"><b>前面</b></font>
<b><font color="#e74f4c">父元素.insertBefore(要插入的元素,在哪个元素前面)</font></b>
克隆节点
<b><font color="#e74f4c">元素.cloneNode(布尔值)</font></b>
true,则代表克隆时会包含<font color="#e74f4c"><b>后代节点</b></font>一起克隆,所有内容
false(默认),则代表克隆时不包含后代节点,只有标签
先克隆,再追加
删除节点
在 JavaScript 原生DOM操作中,要删除元素必须通过父元素删除
<b><font color="#e74f4c">父元素.removeChild(要删除的元素)</font></b>
M端事件
触屏事件 <b><font color="#e74f4c">touch</font></b>
正则
0 条评论
下一页