JavaScript

本博客主要讲解JavaScript在HTML中的使用。

目录

是什么

作用域

数据类型

变量

变量的命名规则

声明变量

函数

函数的声明和定义

函数声明

函数表达式

箭头函数(ES6新增)

函数的参数

函数的返回值

函数的调用

内置函数和内置对象

闭包

概念

闭包的意义

相关疑问

一个JS文件调用其他JS文件就是闭包吗?

JavaScript中.js的导入导出

为什么需要.js文件的导入

导出方式

默认导出(Default Exports)

命名导出(Named Exports)

混合使用默认导出和命名导出

export语句说明

事件驱动

是什么

包含什么

获取事件源

事件

事件监听器

事件对象

属性

方法

注释

单行注释

多行注释

JavaScript引擎

JavaScript在HTML中的使用

内联JavaScript

内部JavaScript

外部JavaScript

相关疑问

内部JavaScript和外部JavaScript的建议使用

JavaScript操作dom元素

获取元素

通过ID获取元素

通过类名获取元素(返回元素集合)

通过标签名获取元素(返回元素集合)

通过CSS选择器获取元素(返回第一个匹配的元素)

通过CSS选择器获取元素集合

通过元素的父级或子级关系获取

通过元素的相邻兄弟关系获取

ES6说明

为什么会设计ES6

是什么

ES6新特性

导入和导出ES6之前和ES6比较

js文件导入和导出方面


是什么

JavaScript 是一种轻量级的、解释型的或即时编译型的编程语言。它是开源的,跨平台的,并且可以直接嵌入到 HTML 中。JavaScript 最初被设计为用于创建交互式网页,但现在已经扩展到许多非浏览器环境,包括服务器端编程、游戏开发以及移动应用开发等。


作用域

作用域决定了变量、函数和对象的可见性和生命周期。JavaScript 有两种主要的作用域:全局作用域局部作用域。ES6 还引入了块级作用域。

作用域的意义:函数的作用域决定了变量和函数在哪些地方是可访问的。在函数内部声明的变量和函数具有局部作用域,只能在函数内部访问。而在函数外部声明的变量和函数具有全局作用域,可以在任何地方访问。


数据类型

JavaScript是弱类型语言,在弱类型语言中,变量的数据类型可以被忽略,一个变量可以赋不同数据类型的值。JavaScript就允许变量类型的隐式转换和强制类型转换,如字符串和数值可以自动转化,而强类型语言一般不允许这么做。

变量的数据类型是在运行时根据赋给变量的值自动推断的,而不是在声明时就需要明确指定的。这种特性使得JavaScript编程更加灵活和动态。

数据类型名称作用
Number用于表示数字,包括整数和浮点数。可以执行数学运算。
String用于表示文本数据。可以是单引号或双引号内的字符序列。支持多种字符串操作。
Boolean有两个值:true 和 false。通常用于条件判断。
Null只有一个值 null,表示一个空值或“无”的值。通常用于表示对象不存在或尚未被赋值。
Undefined当变量被声明了,但没有赋值时,它的值就是 undefined。表示变量未定义。
Object用于存储多个值作为属性。是复杂数据结构的基础,包括数组、函数、日期等。
Symbol (ES6引入)表示唯一的、不可变的原始值,通常用作对象属性的键。
BigInt (ES10引入)任意精度的整数。用于表示超出 Number 类型能表示范围的整数。

变量

在JavaScript中,变量是用来存储数据的命名容器。你可以将变量视为一个标签,这个标签指向计算机内存中的特定位置,这个位置存储了某个值。变量允许你在程序运行时改变和重用数据。

变量的命名规则

  • 变量名可以包含字母、数字、美元符号($)和下划线(_)。
  • 变量名不能以数字开头。
  • 变量名是区分大小写的(myVariable 和 myvariable 是两个不同的变量)。
  • 变量名不能是JavaScript的保留字或关键字(如 varletconstfunction 等)。
  • 变量名最好具有描述性,以便其他人(或未来的你)能够理解其用途。

声明变量

在JavaScript中,你可以使用varletconst关键字来声明变量。

  • var:声明一个变量,可以重复赋值。
  • let:声明一个块级作用域的本地变量,可以重复赋值。
  • const:声明一个只读的常量,一旦赋值后,值就不能再改变(但是如果是对象或数组,可以修改其属性或元素)。
var x = 10; // 使用var声明变量  
let y = 20; // 使用let声明变量  
const z = 30; // 使用const声明常量

函数

函数(Function)是一段可以重复使用的代码块,它执行特定的任务并可能返回结果。函数是JavaScript中非常重要的概念,它允许我们将代码组织成可重用的单元,提高代码的可读性和可维护性。

函数的声明和定义

在JavaScript中,可以使用多种方式来声明和定义函数。

函数声明
function functionName(parameters) { 
    // 函数体 
    // 执行代码块 
    // 可选:返回一个值 
    return value; 
}
函数表达式
var functionName = function(parameters) { 
    // 函数体 
    // 执行代码块 
    // 可选:返回一个值 
    return value; 
};
箭头函数(ES6新增)
const functionName = (parameters) => { 
    // 函数体 
    // 执行代码块 
    // 可选:返回一个值 
    return value; 
}; 


// 如果函数体只有一行代码,可以省略花括号和return关键字 
const shortFunctionName = (param) => param * 2;
函数的参数

函数可以接收任意数量的参数,这些参数在函数体内部作为局部变量使用。参数是可选的,如果没有参数,括号内可以为空。

function greet(name) {  
    console.log("Hello, " + name + "!");  
}  
  
greet("Alice"); // 输出: Hello, Alice!
函数的返回值

函数可以返回一个值,使用return语句来实现。如果函数没有return语句或没有执行到return语句,则返回undefined

function add(a, b) {  
    return a + b;  
}  
  
const sum = add(3, 5); // sum的值为8
函数的调用

要执行函数中的代码,需要使用函数名后跟一对圆括号(可能包含参数)来调用函数。

function sayHello() {  
    console.log("Hello, world!");  
}  
  
sayHello(); // 输出: Hello, world!
内置函数和内置对象

除了用户定义的函数外,JavaScript还提供了许多内置函数和对象方法,用于执行常见的任务,如数学运算、字符串操作、数组处理等。

内置函数示例:

// 生成一个随机数  
var randomNumber = Math.random();  
console.log(randomNumber); // 输出一个0到1之间的随机小数,如:0.8572192018732456

PS:Math.random() 是一个内置函数,用于生成一个介于0(包括)和1(不包括)之间的伪随机数。

内置对象示例:

// 创建一个数组  
var fruits = ["apple", "banana"];  
  
// 使用 push 方法添加元素  
fruits.push("cherry", "date");  
  
// 输出数组和它的长度  
console.log(fruits); // 输出: ["apple", "banana", "cherry", "date"]  
console.log(fruits.length); // 输出: 4

PS:Array.prototype.push() 是一个数组对象的方法,用于向数组的末尾添加一个或多个元素,并返回新的长度。


闭包

概念

闭包是一个非常重要的概念。它指的是一个函数能够访问并操作在其外部定义的变量,即使外部函数已经执行完毕。这些外部定义的变量通常被称为“自由变量”,因为它们不是该函数的局部变量,也不是该函数的参数。闭包允许函数访问并操作函数外部的变量,这是通过JavaScript的函数作用域规则和函数可以作为值传递的特性实现的。

闭包的意义

闭包本质上就是将函数和其引用的外部变量封装在一起,形成了一个不受外部干扰的环境。这使得函数不仅可以访问外部变量,还可以修改它们,这些修改也会反映到函数外部的变量中。并且闭包还具有创建灵活、可维护和可重用(代码)的特点。

示例1:

function outerFunction() {  
    var outerVariable = "I am from outer function";  // 外部变量
      
    function innerFunction() {  // 这是一个闭包
        console.log(outerVariable);  // 闭包可以访问外部变量
    }  
      
    return innerFunction;  // 返回内部函数,而不是执行它
}  
  
var myFunction = outerFunction();  // 执行外部函数,得到内部函数引用
myFunction(); // 执行闭包函数,输出外部变量的值
// 输出 "I am from outer function"

示例2:

function createCounter() {  
    let count = 0; // 局部变量,将被闭包捕获  
    return function increment() { // 返回的函数形成闭包  
        count++;  
        console.log(count);  
    };  
}  
  
const counter1 = createCounter(); // 创建一个计数器实例  
const counter2 = createCounter(); // 创建另一个计数器实例  
  
counter1(); // 输出:1  
counter1(); // 输出:2  
counter2(); // 输出:1(这是另一个独立的计数器)  
counter1(); // 输出:3(counter1继续计数)

PS:由于每个计数器都是通过调用createCounter创建的,它们都有自己独立的count变量副本(由闭包捕获),因此它们可以独立地计数。

相关疑问

一个JS文件调用其他JS文件就是闭包吗?

调用其它JS文件并不意味着这些文件是闭包。闭包是一个特定的编程概念,与文件或模块的调用方式无关

一个js文件调用另一个js文件示例:

// script1.js
// 定义一个函数或变量  
export const myVariable = 'Hello from module A!'; 
export function sayHello() {  
    console.log('Hello from script1.js!');  
}

// script2.js
// 1、先导入file1.js中导出的函数和变量  
import { myVariable, sayHello } from './script1.js';
// 2、调用在script1.js中定义的函数或变量  
// 使用导入的变量和函数  
console.log(myVariable); // 输出 "Hello from module A!"
sayHello(); // 这将输出 "Hello from script1.js!"

JavaScript中.js的导入导出

为什么需要.js文件的导入

需要导入.js文件的主要原因有以下几点:

  1. 模块化编程:模块化编程是一种将程序划分为独立、可复用的模块(即.js文件)的软件开发方法。每个模块负责实现特定的功能,并且有自己的作用域,这样可以减少全局变量的污染,提高代码的可维护性和可读性。通过导入和导出模块,我们可以将复杂的程序拆分成更小的、更易于管理的部分。

  2. 代码复用:当我们在不同的项目中需要重复使用相同的代码时,可以将这些代码封装成模块,并通过导入来使用。这样可以避免代码冗余,提高开发效率。

  3. 依赖管理:当一个模块依赖于其他模块时,我们需要通过导入来建立这些依赖关系。这样,当我们使用某个模块时,可以确保它所需的所有依赖都已正确加载。

  4. 异步加载:在现代前端开发中,为了提高页面加载速度,我们通常会采用异步加载的方式来加载非关键的代码。通过将代码拆分成多个.js文件,并异步加载它们,我们可以实现按需加载,减少页面初始加载时间。

  5. 使用第三方库和框架:在开发过程中,我们经常会使用到各种第三方库和框架,这些库和框架通常都是以.js文件的形式提供的。通过导入这些文件,我们可以方便地利用它们提供的功能和特性。

  6. 工具链和构建系统的支持:现代前端工具链和构建系统(如Webpack、Rollup、Parcel等)都支持模块化的开发方式。它们可以根据项目的配置和需求,自动处理模块的导入和导出,将多个.js文件打包成一个或多个优化的输出文件。

总结:导入.js文件是JavaScript模块化开发的基础,它有助于我们更好地组织代码、提高开发效率、实现代码复用和依赖管理,以及利用第三方库和框架的功能。

导出方式

ES6模块系统提供了两种主要的导出方式:默认导出(default exports)和命名导出(named exports)。这两种导出方式允许你在一个模块中定义并导出功能,以便在其他模块中导入和使用这些功能。

默认导出(Default Exports)

默认导出允许你导出一个模块中的单个值(可以是任何JavaScript类型,如函数、对象、类等)。在一个模块中,你只能有一个默认导出。默认导出在导入时不需要使用大括号{}

导出示例:

// myModule.js 
export default function() { 
console.log('This is the default export!'); 
}

导入示例:

// anotherModule.js 
import myDefaultFunction from './myModule.js'; 
myDefaultFunction(); // 输出 "This is the default export!"
命名导出(Named Exports)

命名导出允许你导出多个值,并为每个值指定一个名称。这样,其他模块就可以通过这些名称来导入这些值。命名导出在导入时必须使用大括号{}来指定要导入的值。

导出示例:

// myModule.js 
export const myVariable = 'Hello from named export!'; 
export function myFunction() { 
console.log('This is a named export function!'); 
}

导入示例:

// anotherModule.js 
import { myVariable, myFunction } from './myModule.js'; 
console.log(myVariable); // 输出 "Hello from named export!" 
myFunction(); // 输出 "This is a named export function!"
混合使用默认导出和命名导出

在一个模块中,你可以同时使用默认导出和命名导出。这允许你灵活地组织你的代码,并根据需要导出不同类型的值。

导出示例:

// myModule.js 
export default function defaultFunction() { 
console.log('This is the default function!'); 
} 


export const namedVariable = 'Hello from named variable!'; 
export function namedFunction() { 
console.log('This is a named function!'); 
}

导入示例:

// anotherModule.js 
import defaultFunction, { namedVariable, namedFunction } from './myModule.js'; 


defaultFunction(); // 输出 "This is the default function!" 
console.log(namedVariable); // 输出 "Hello from named variable!" 
namedFunction(); // 输出 "This is a named function!"

注意事项

  • 一个模块只能有一个默认导出。
  • 一个模块可以有多个命名导出。
  • 默认导出可以使用任何变量名在模块内部定义,但在导入时不需要使用这个名字。
  • 命名导出在导出和导入时必须使用相同的名称。

PS:通过合理地使用默认导出和命名导出,你可以构建出清晰、模块化的JavaScript代码库,提高代码的可读性和可维护性。

export语句说明

PS:如果你想从一个.js文件导入另一个.js文件中的模块,被导入的.js文件中必须至少包含一个export语句并且使用export关键字来导出这些模块。export是ES6模块系统的一部分,它允许你将变量、函数、类或对象从一个模块中导出,然后在其他模块中使用import语句来导入它们。

PS:如果你希望一个.js文件中的内容能够被其他文件导入使用,你必须在该文件中使用export语句来导出这些内容。如果你不打算这样做,那么这些内容将仅限于该文件内部使用。


事件驱动

是什么

是一种编程模型,它允许程序在特定事件发生时执行相应的代码。在用户通过浏览器进行交互性体验时,这种机制发挥了关键作用。

注意:

PS:具体来说,

用户的交互操作:浏览者通过鼠标或键盘执行的操作称为事件,例如点击按钮、移动鼠标等。

其它事件:浏览器及网页内部的某些对象的状态发生变化时,也可能引发事件。例如,一个网页元素的加载完成、一个定时器到达设定的时间等,都可以是事件。

对这些事件做出响应的代码,我们称之为事件处理程序当事件发生时,相应的事件处理程序会被执行,这就是所谓的“事件驱动”。

包含什么

  • 事件源(Event Source):产生事件的元素或对象,如HTML元素、浏览器窗口等。

  • 事件(Event):由事件源产生的动作或状态变化,如点击、加载、滚动等。

  • 事件监听器(Event Listener):用于处理事件的函数或方法。当事件发生时,事件监听器会被调用。

  • 事件对象(Event Object):传递给事件监听器的对象,包含了与事件相关的信息,如触发事件的元素、鼠标位置等。

获取事件源

事件对象包含了与特定事件相关的所有信息,包括触发事件的元素(即事件源)。当事件处理器函数被调用时,浏览器会自动传递一个事件对象作为参数。你可以通过这个事件对象的target属性来获取到触发事件的元素。

示例:

<button id="myButton">点击我</button>  
  
 <script>  
    document.getElementById('myButton').addEventListener('click', function(event) {  
        var eventSource = event.target; // 获取事件源  
        console.log(eventSource); // 在控制台输出事件源元素  
        alert('你点击了:' + eventSource.tagName); // 弹出一个警告框显示元素类型  
    });  
</script>  

事件

在特定情况下触发的动作或发生的情况。

常见事件

  • click: 用户点击鼠标按钮时触发。
  • mousedown: 用户按下鼠标按钮时触发。
  • mouseup: 用户释放鼠标按钮时触发。
  • mouseover: 鼠标指针移入元素上时触发。
  • mouseout: 鼠标指针移出元素时触发。
  • mousemove: 鼠标指针在元素内部移动时触发。
  • keydown: 用户按下键盘上的某个键时触发。
  • keyup: 用户释放键盘上的某个键时触发。
  • keypress: 用户按下并释放键盘上的某个键时触发(通常用于捕获字符输入)。
  • load: 页面或图片完成加载时触发。
  • submit: 表单提交时触发。
  • scroll: 用户滚动页面时触发。
  • change: 元素的值改变时触发,常用于<input><textarea>, 和 <select>元素。

示例:

 <button id="myButton" onclick="handleClick()">点击我</button>

<script>
    function handleClick() {  
        var responseElement = document.getElementById('response');  
        responseElement.textContent = '按钮被点击了!';  
        // 你可以在这里添加更多的逻辑,比如发送请求、改变样式等。  
    }
</script>

事件监听器

允许你响应用户与页面交互时发生的各种事件。这些事件可以是鼠标点击、键盘按键、页面加载、鼠标移动等。

示例:

// 基本步骤为:1、选择元素2、添加事件监听器
// 选择元素  
var button = document.getElementById('myButton');  
  
// 添加事件监听器  
button.addEventListener('click', function() {  
  alert('按钮被点击了!');  
});


//移除事件监听器
button.removeEventListener('click', myFunction);

事件对象

当某个事件(如点击、键盘按键、鼠标移动等)被触发时,浏览器会创建一个事件对象(Event object)并将其作为参数传递给事件处理函数。这个事件对象包含了与事件相关的各种信息,如事件的类型、触发事件的元素、鼠标的位置等。通过事件对象,我们可以编写更加丰富和交互性的代码。

事件对象通常包含以下一些属性和方法:

属性
  • type:事件的类型,如clickmousedownkeydown等。
  • target:触发事件的元素。
  • currentTarget:当前正在处理事件的元素,通常是绑定事件监听器的元素。
  • relatedTarget:对于某些事件(如mouseout),表示与事件相关的另一个元素。
  • timeStamp:事件触发的时间戳。
  • clientXclientY:鼠标指针相对于浏览器窗口可视区的X、Y坐标。
  • pageXpageY:鼠标指针相对于整个文档(包括滚动条滚动的部分)的X、Y坐标。
  • keykeyCodecharCode:键盘按键的相关信息。
  • shiftKeyctrlKeyaltKeymetaKey:表示是否同时按下了Shift、Ctrl、Alt或Meta键。
  • detail:对于鼠标滚轮事件,表示滚动的距离和方向。
  • bubbles:一个布尔值,表示事件是否冒泡。
  • cancelable:一个布尔值,表示事件是否可以被取消。
方法
  • preventDefault():取消事件的默认行为。例如,阻止表单的默认提交行为或阻止链接的默认跳转行为。
  • stopPropagation():阻止事件冒泡,即阻止事件进一步传播到DOM树中的上层元素。
  • stopImmediatePropagation():阻止事件冒泡,并且阻止该元素上的其他事件监听器被调用。

示例:

<button id="myButton">点击我</button>  
  
<script>  
    document.getElementById('myButton').addEventListener('click', function(event) {  
        // 访问事件对象的属性  
        console.log('事件类型:', event.type); // 输出 "事件类型: click"  
        console.log('触发事件的元素:', event.target); // 输出触发事件的按钮元素  
        console.log('鼠标X坐标:', event.clientX); // 输出鼠标相对于浏览器窗口可视区的X坐标  
  
        // 访问事件对象的方法  
        event.preventDefault(); // 取消事件的默认行为(对于按钮来说,默认行为是提交表单,但这里并没有实际提交,所以不会看到效果)  
        event.stopPropagation(); // 阻止事件冒泡(在这个例子中,由于是直接绑定在按钮上,所以不会看到冒泡效果)  
    });  
</script>  

注释

注释的内容是一种开发者自己编写的信息,用于对代码的解释和说明(说明性文字)。

注释符号是一种由语言定义的,被注释符号注释的说明性文字不会被JavaScript引擎执行,JavaScript提供了两种注释符号。

单行注释

使用 // 来注释一行代码。

// 这是一个单行注释  
console.log("Hello, World!"); // 这也是一个单行注释

多行注释

使用 /* 开始,*/ 结束来注释多行代码。

/* 这是一个  
多行注释  
可以跨越多行 */

PS:在大型项目或复杂的代码片段特别有效,注释对于代码执行没有任何影响。


JavaScript引擎

是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。它的主要作用是将JavaScript代码转换为快速优化的可供浏览器解释的代码。这个过程可以分为三个阶段:解析阶段、编译阶段和执行阶段。

总结:JavaScript引擎是JavaScript代码能够在浏览器中运行的关键组件,它负责将代码解析、编译和执行,从而实现了网页的交互性和动态性。


JavaScript在HTML中的使用

内联JavaScript

直接在HTML元素的事件属性中写JavaScript代码。这是最简单的方式,但通常不推荐,因为它违反了内容与行为的分离原则,使得HTML代码变得复杂且难以维护。

示例:

<button onclick="alert('Hello, World!')">点击我</button>

内部JavaScript

在HTML文档的<script>标签中编写JavaScript代码。这通常放在HTML文档的<head>或<body>标签内部。

示例:

<!DOCTYPE html>  
<html>  
<head>  
    <title>页面标题</title>  
    <script>  
        function myFunction() {  
            alert("Hello, World!");  
        }  
    </script>  
</head>  
<body>  
    <button onclick="myFunction()">点击我</button>  
</body>  
</html>

外部JavaScript

将JavaScript代码写入单独的.js文件中,然后在HTML文档中使用<script>标签的src属性引用它。这是最推荐的方式,因为它使得HTML、CSS和JavaScript分离,便于管理和维护。

示例:

//假设你有一个名为script.js的外部JavaScript文件,需要先引入才能被使用
// script.js 文件内容  
function myFunction() {  
    alert("Hello, World!");  
}

// script.js 文件内容 
function myFunction() { 
    alert("Hello, World!"); 
}

整体示例:

<!DOCTYPE html>  
<html>  
<head>  
    <title>页面标题</title>  
    <script src="script.js"></script> <!-- 引用外部JavaScript文件 -->  
</head>  
<body>  
    <button onclick="myFunction()">点击我</button>  
</body>  
</html>

注意事项

  • 当使用外部JavaScript文件时,确保文件的路径是正确的。如果文件位于不同的目录或子目录中,你需要提供正确的相对路径或绝对路径。
  • 通常建议将<script>标签放在HTML文档的底部,即</body>标签之前,这样可以确保在脚本执行时HTML元素已经加载完毕,避免因为DOM元素还未加载而导致的错误。
  • 如果JavaScript代码依赖于DOM元素,你可以使用DOMContentLoaded事件来确保DOM完全加载后再执行你的代码,或者使用jQuery的$(document).ready()函数(如果你使用jQuery)。
  • 在实际开发中,还常常使用构建工具(如Webpack)来管理和打包JavaScript代码,这样可以实现代码分割、压缩、按需加载等高级功能。

相关疑问

内部JavaScript和外部JavaScript的建议使用

建议使用外部JavaScript的几个方面如下:

  • 可维护性和可重用性:

    • 单独文件:将JavaScript代码写入单独的.js文件,可以使HTML文件更加整洁,专注于结构和内容。同时,.js文件可以被多个HTML页面复用,提高了代码的可重用性。此外,当需要修改或更新JavaScript代码时,只需在一个地方进行修改,而无需在每个HTML页面中逐一修改,这大大提高了代码的可维护性。
    • 直接在HTML中:直接在HTML中写JavaScript代码虽然方便,但会使得HTML文件变得冗长且难以维护。同时,这种方式的代码重用性较低,每次需要使用相同的JavaScript功能时,都需要在HTML中重新编写代码。
  • 加载和执行:

    • 单独文件:浏览器会单独加载.js文件,这可能会增加一些额外的HTTP请求,但现代浏览器通常会进行缓存,以减少这种影响。同时,通过异步加载或延迟加载等技术,可以进一步优化加载性能。
    • 直接在HTML中:直接在HTML中写JavaScript代码通常会在页面加载时立即执行,这可能会影响页面的加载速度。此外,如果JavaScript代码较多或较复杂,还可能导致页面渲染阻塞。
  • 代码组织和结构:

    • 单独文件:在.js文件中,可以更方便地使用模块、类和函数等结构来组织代码,使得代码更加清晰、易于理解。同时,可以使用各种代码压缩和混淆工具来减小文件大小、提高安全性。
    • 直接在HTML中:在HTML中直接写JavaScript代码通常较难进行良好的代码组织和结构划分,尤其是在代码量较大的情况下。
  • 工具和插件支持:

    • 单独文件:由于.js文件是独立的,因此可以更方便地使用各种JavaScript开发工具、插件和库,如ESLint进行代码检查、Babel进行代码转换等。
    • 直接在HTML中:直接在HTML中写JavaScript代码可能较难充分利用这些工具和插件的优势。

总结:直接在HTML中写JavaScript代码在某些简单场景下可能更方便,但在大多数情况下,将JavaScript代码写入单独的.js文件是更好的选择。这可以提高代码的可维护性、可重用性,同时也有利于代码的组织和结构的优化。

JavaScript操作dom元素

获取元素
通过ID获取元素
var element = document.getElementById('myElementId');
通过类名获取元素(返回元素集合)
var elements = document.getElementsByClassName('myClassName');
通过标签名获取元素(返回元素集合)
var elements = document.getElementsByTagName('p');
通过CSS选择器获取元素(返回第一个匹配的元素)
var element = document.querySelector('.myClassName');
通过CSS选择器获取元素集合
var elements = document.querySelectorAll('.myClassName');
通过元素的父级或子级关系获取
var parentElement = document.getElementById('parent'); 
var childElement = parentElement.children[0]; // 获取第一个子元素 
var firstChildElement = parentElement.firstChild; // 获取第一个子节点,可能是文本节点或元素节点
通过元素的相邻兄弟关系获取
var previousSibling = element.previousElementSibling; // 获取前一个兄弟元素 
var nextSibling = element.nextElementSibling; // 获取下一个兄弟元素

ES6说明

为什么会设计ES6

主要是为了应对随着Web应用复杂性不断提升而带来的挑战,并解决早期JavaScript版本中存在的一些问题。设计目标具体原因如下:

  • 提高语言的功能性:ES6引入了许多新的语法特性和API,使得JavaScript代码更加简洁、易读和易于维护。例如,块级作用域变量声明(通过let和const关键字)、箭头函数、默认参数、解构赋值、模板字符串等新特性,都极大地提高了JavaScript的表达能力。
  • 支持大型和复杂应用:ES6的设计目标是让JavaScript语言能够用来编写复杂的大型程序,成为企业级开发语言。通过引入类和模块等概念,ES6使得JavaScript在面向对象编程和模块化开发方面有了更强大的支持。
  • 解决浏览器兼容性问题:在早期的互联网时代,不同浏览器支持不同的JavaScript版本,导致了兼容性问题。ECMAScript作为JavaScript的标准化版本,通过定义一组通用的API,使得开发人员能够在任何支持ECMAScript的浏览器中运行代码。ES6的推出进一步推动了JavaScript的标准化进程,减少了兼容性问题。
  • 适应前端技术发展趋势:随着前端技术的不断发展,JavaScript需要不断适应新的需求和趋势。例如,随着Ajax和Web 2.0的兴起,JavaScript在动态更新网页内容方面的能力得到了极大的增强。ES6的推出正是为了满足这些新的需求,并为未来的前端技术发展提供更强的支持。

是什么

ES6(ECMAScript 6)是JavaScript语言的下一代标准。它已经在2015年6月正式发布了,因此也被叫作ES2015。ES6引入了许多新的语法特性和API,旨在使JavaScript代码更加简洁、易读和易于维护。

ES6新特性

  • 块级作用域和常量声明:通过let和const关键字,可以在块级作用域中声明变量和常量,避免了变量提升的问题。
  • 箭头函数:这是一种更简洁的函数定义语法,使用=>替代传统的function关键字,并自动绑定this上下文。
  • 默认参数值:允许在函数定义中为参数设置默认值,简化了函数调用时的参数传递。
  • 解构赋值:从数组或对象中提取值并赋给变量的语法,使得赋值操作更加简洁和直观。
  • 模板字符串:提供了一种更加灵活、易读的字符串拼接语法。
  • 类和模块:引入了class关键字,使得JavaScript可以使用面向对象编程范式;同时加入了对模块的支持,使用import和export关键字来导入和导出模块。(相比与ES6之前的版本,在js文件的导入和导出方面有着显著的优势)

导入和导出ES6之前和ES6比较

js文件导入和导出方面

在ES6之前,JavaScript并没有原生的模块系统,因此开发者通常使用全局变量、闭包、对象字面量等方式来组织和共享代码。然而,这些方法存在许多问题,如命名冲突、依赖关系不明确、难以维护等。

ES6引入了模块化的语法,通过importexport关键字实现了模块的导入和导出。这使得开发者可以将代码划分为多个独立的模块,每个模块具有明确的职责和接口,从而提高了代码的可读性、可维护性和可重用性。

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值