上几篇博客我们介绍的是HTML和css,从这里开始我们介绍javascript
JavaScript(简称JS)是一种高级的、面向对象的编程语言,主要用于前端开发。它是一种动态类型、弱类型的语言,可以在网页上实现交互效果、动态更新网页内容、处理用户输入等。JavaScript是最常用的编程语言之一,几乎每个网站都使用JavaScript来增强用户体验和功能。
1.JavaScript的特点包括:
- 与HTML和CSS结合:JavaScript可以直接与HTML和CSS进行交互,使网页具有更强的交互性和动态性。
- 客户端脚本语言:JavaScript主要运行在客户端,即用户的浏览器中,可以直接在用户的计算机上执行,减轻了服务器的负担。
- 强大的功能:JavaScript具有丰富的内置功能和对象,可以处理日期、字符串、数组等数据类型,以及操作DOM元素、发送HTTP请求等。
- 支持面向对象编程:JavaScript支持面向对象的编程范式,可以创建和使用对象、继承和多态等。
- 平台无关性:JavaScript可以在多个操作系统和浏览器上运行,不受平台限制。
2.JavaScript在前端开发中的应用非常广泛,可以实现以下功能:
动态内容:JavaScript可以根据用户的操作或事件,动态改变网页的内容和样式。
- 表单验证:JavaScript可以对用户输入的表单进行验证,如验证用户名、密码等格式是否合法。
- 数据交互:JavaScript可以通过AJAX技术与后端服务器进行数据交互,实现无需刷新页面的动态加载和更新。
- 动画效果:JavaScript可以实现各种动画效果,如滑动、淡入淡出、旋转等,增加网页的视觉吸引力。
- 响应式布局:JavaScript可以根据不同的屏幕尺寸和设备类型,实现页面的自适应和响应式布局。
总之,JavaScript是一门重要的前端开发语言,具有丰富的功能和广泛的应用范围,掌握好JavaScript可以为网页增加更多的交互性和动态性。
3-JS之Hello
js的三种书写方式
<!DOCTYPE html>
<html lang="en">
<head>
<!-- 定义文档类型、编码和视口 -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 设置网页标题 -->
<title>Document</title>
<!-- 在head标签内直接嵌入JavaScript代码段 -->
<script>
// 使用alert函数在页面弹出一个警告框显示消息
// alert("hello world");
// document.write方法用于向文档中写入HTML内容,但在这里使用会导致原有DOM结构被替换
// document.write("hello world");
// console.log是JavaScript的内置方法,用于在浏览器开发者工具控制台输出信息,不会改变页面内容
console.log("hello world");
</script>
</head>
<body>
<!-- 创建一个div元素,并显示文本内容 -->
<div>hello 11111</div>
</body>
</html>
在这段HTML代码中,我为每一部分添加了注释来解释其作用。<script>
标签内的JavaScript代码片段包含了三种不同的输出方式:alert()
用于向用户显示警告对话框;document.write()
可以向文档流中写入内容,但通常不推荐在动态DOM操作时使用,因为它会覆盖现有文档流;而console.log()
则是在开发者控制台打印调试信息,对实际页面渲染无影响。
4-JS的书写位置
01-行内
在HTML中,JavaScript的行内书写方式是指直接将JavaScript代码写在HTML标签的事件属性中。例如,在一个按钮元素上添加点击事件处理函数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS行内事件处理示例</title>
</head>
<body>
<button onclick="alert('Hello World!')">点击我</button>
<!-- 在这里,JavaScript代码 "alert('Hello World!')" 被写在了HTML按钮元素的onclick属性内 -->
<!-- 当用户点击此按钮时,会触发JavaScript的alert对话框显示消息 -->
</body>
</html>
在这个例子中,onclick
是一个HTML事件属性,当它所关联的元素(这里是 button
)被点击时,会执行对应的 JavaScript 代码。此处我们使用的是 alert()
函数来弹出一个警告框显示“Hello World!”的消息。这就是JavaScript行内书写的简单应用实例。虽然这种形式方便快速实现简单的交互效果,但不利于代码复用和维护,因此在现代前端开发中不推荐大量使用这种方式编写JavaScript代码。
02-内嵌
JavaScript的内嵌书写位置是指将JavaScript代码写在HTML文档 <script>
标签内部,但不是直接放在HTML元素的事件属性中。以下是一个内嵌式JavaScript代码的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS内嵌书写示例</title>
</head>
<body>
<h1 id="greeting">欢迎来到我的网站!</h1>
<script>
// JavaScript内嵌代码开始
document.getElementById('greeting').textContent = '你好,世界!';
// 定义一个函数
function displayTime() {
var now = new Date();
var time = now.getHours() + ':' + now.getMinutes();
document.getElementById('current-time').textContent = '当前时间:' + time;
}
// 当页面加载完成时调用displayTime函数
window.onload = displayTime;
</script>
<p id="current-time"></p>
<!-- JavaScript内嵌代码结束 -->
</body>
</html>
在这个例子中,我们有两个JavaScript内嵌片段:
- 直接修改了id为
greeting
的<h1>
标签的内容。- 定义了一个
displayTime
函数,并将其设置为当整个页面加载完成后执行(通过window.onload
事件);这个函数获取当前时间并将其显示在id为current-time
的<p>
标签中。
通过这种方式,JavaScript代码可以与HTML文档结构更好地分离,同时又不需要外部文件引用,方便初学者理解和调试。然而,对于大型项目,推荐使用外部脚本文件来组织和管理JavaScript代码,以提高代码可维护性和复用性。
03-外部
JavaScript的外部书写位置是指将JavaScript代码写在一个单独的文件中,然后通过HTML文档中的<script>
标签引用该文件。这种方式可以更好地组织和管理代码,并且能够实现代码复用。以下是一个使用外部JS文件的例子:
首先,在一个名为script.js
的外部文件中编写JavaScript代码:
// script.js 文件内容
document.addEventListener('DOMContentLoaded', function() {
var greeting = document.getElementById('greeting');
greeting.textContent = '你好,世界!';
// 定义一个函数
function displayTime() {
var now = new Date();
var time = now.getHours() + ':' + now.getMinutes();
document.getElementById('current-time').textContent = '当前时间:' + time;
}
// 当DOM加载完成后调用displayTime函数
displayTime();
});
接下来,在HTML文档中引用这个外部JS文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS外部书写示例</title>
</head>
<body>
<h1 id="greeting">欢迎来到我的网站!</h1>
<p id="current-time"></p>
<!-- 引入外部JS文件 -->
<script src="script.js"></script>
</body>
</html>
在这个例子中,当浏览器解析到<script src="script.js"></script>
标签时,它会暂停HTML解析流程,请求并执行指定URL(即script.js
)中的JavaScript代码。在外部文件script.js
被下载并执行后,它会找到对应的HTML元素并修改其内容或行为,从而实现了与页面交互的功能。
5-JS的注释与规范
JavaScript中的注释用于对代码进行解释和说明,以提高代码的可读性和维护性。JS中有两种类型的注释:单行注释和多行注释。
单行注释:
// 这是一个单行注释,它会直到行尾结束
var greeting = "Hello, world!"; // 这是紧跟在语句后面的单行注释
// 注释规范建议:
// 1. 使用英文描述注释内容
// 2. 对复杂或不直观的代码块进行详细解释
// 3. 注释应简洁明了,避免冗余信息
多行注释:
/*
这是一个多行注释,
它可以跨越多行。
在这个区域内,你可以编写详细的文档字符串或者对一段代码进行解释。
注释规范建议:
- 对函数、类等结构使用多行注释来提供简短摘要和用法示例
- 多行注释内保持良好的缩进,便于阅读
- 避免在注释中留下未完成的注解或过时信息
*/
function greet(name) {
console.log("Hello, " + name + "!"); // 函数作用:向控制台输出问候语
}
JSDoc风格注释(高级注释规范):
JSDoc是一种为JavaScript编写的注释标准,能够生成API文档。以下是一个JSDoc风格注释的例子:
/**
* @function greet
* @description 输出友好的问候语到控制台
* @param {string} name - 要问候的人的名字
*/
function greet(name) {
console.log("Hello, " + name + "!");
}
通过这样的注释方式,工具如jsdoc
等可以根据注释自动生成API文档,帮助开发者更好地理解和使用代码。
6-JS的变量
在JavaScript中,变量用于存储数据。下面是一些不同类型的变量声明和使用的例子:
-
使用
var
声明变量(适用于ES5及更早版本):// 声明并初始化一个变量 var myVariable = "Hello, World!"; // 只声明变量,不初始化 var anotherVar; // 后续赋值 anotherVar = 42; console.log(myVariable); // 输出: Hello, World! console.log(anotherVar); // 输出: 42
-
使用
let
声明变量(适用于ES6及以上版本):// 声明并初始化一个块级作用域的变量 let blockScopedVar = true; if (true) { let insideIfBlock = "This variable is only a***essible within this block."; console.log(insideIfBlock); // 输出: This variable is only a***essible within this block. } console.log(blockScopedVar); // 输出: true console.log(insideIfBlock); // 报错:因为insideIfBlock在此作用域外未定义
-
使用
const
声明常量(同样适用于ES6及以上版本):
这些例子展示了如何在JavaScript中声明和使用变量,并体现了不同声明关键字带来的作用域和可变性差异。// 声明并初始化一个常量(不可重新赋值) const PI = 3.14159; // 尝试更改常量值会导致错误 PI = 3; // TypeError: Assignment to constant variable. // 注意:虽然常量的值不能改变,但如果是引用类型的值(如对象或数组),其内部属性是可以修改的。 const obj = { message: "I am a constant object." }; obj.message = "But I can change my properties."; console.log(obj); // 输出: {message: "But I can change my properties."}
**var声明变量**
- **优点**:
- 在JavaScript的早期版本(ES5及以前)中,`var`是声明变量的唯一关键字,因此在老项目和旧浏览器中广泛使用。
- `var`声明的变量具有函数作用域,在整个函数内部都是可访问的。- **缺点**:
- **变量提升(Hoisting)**:`var`声明的变量会被提升到所在作用域的顶部,这可能导致在变量声明之前就使用它而不会报错,从而引发意料之外的行为。
- 不支持块级作用域:`var`声明的变量可以在其所在的函数作用域内的任何地方被访问,而不是像`let`那样仅限于当前块内可见。
- 可重复声明:在同一作用域内可以多次使用`var`声明同一变量名,后面的声明会覆盖前面的值。
**let声明变量**
- **优点**:
- 块级作用域:`let`声明的变量只在其所在的代码块或语句组内有效,有助于避免变量污染其他区域。
- 没有变量提升:虽然`let`声明也会提升,但不能在声明之前使用,否则会导致“暂时性死区”错误(Temporal Dead Zone, TDZ)。
- 避免重复声明:在同一个作用域内,不允许使用`let`重复声明同名变量。- **缺点**:
- 对于习惯于`var`的老开发者来说,需要适应新的作用域规则,尤其是在处理循环、条件判断等场景时,需要注意变量的作用域不再绑定到函数而是块级。
- 相对于`var`,`let`不是所有环境都支持,但在现代浏览器和Node.js环境中已经是标配。
**const声明常量**
- **优点**:
- 定义不可变的值:`const`用于声明一个常量,一旦声明后就不能重新赋值,这对于防止意外修改重要的值非常有用。
- 同样具有块级作用域:与`let`相同,`const`声明的变量也具有块级作用域特性。
- **缺点**:
- 如果你试图重新赋值给用`const`声明的变量,JavaScript将会抛出错误,所以必须确保初始化时就提供正确的值。
- 虽然`const`所指向的对象或数组的内容是可以改变的(如果它们是可变对象),但是不能改变这个变量所指向的引用地址。这意味着用`const`声明的数组或对象仍然是可变的,只是不能重新分配给另一个不同的对象或数组。总结起来,`let`和`const`在ES6之后引入,提供了更严格的变量管理机制,并且鼓励更好的编程实践。推荐尽可能地使用`let`和`const`来代替`var`,以减少潜在的副作用和增强代码可读性。
7-变量命名的规则和规范
在JavaScript中,变量命名应遵循以下规则和规范:
1. **字符要求**:
- 变量名必须以字母、下划线(_)或美元符号($)开始。
- 其余部分可以包含字母、数字、下划线或美元符号。
- 不允许使用JavaScript保留关键字作为变量名。
2. **大小写敏感**:
- JavaScript是大小写敏感的,这意味着`myVariable`与`myvariable`被视为两个不同的变量。
3. **驼峰命名法(CamelCase)**:
- 在JavaScript中,推荐使用驼峰命名法为变量命名,即第一个单词首字母小写,后续单词首字母大写。例如:
var myVariableName;
let camelCaseExample;
const thisIsAConstant = "Value";
4. **帕斯卡命名法(PascalCase)**:
- 类名通常采用帕斯卡命名法,即每个单词首字母都大写。例如:
class PascalCaseExample {
constructor() {
// ...
}
}
5. **短横线命名法(kebab-case 或 snake_case)**:
- 虽然JavaScript标准并不强制使用这种命名方式,但在某些场景如CSS类名或者常用于模块化编程时,可能会见到短横线命名(kebab-case)或下划线命名(snake_case)。不过,在编写JavaScript变量名时不建议使用这种方式。
示例代码:
// 驼峰命名法的例子
let studentName; // 学生姓名
const totalScore; // 总分数
// 帕斯卡命名法的例子(适用于类)
class StudentRecord {
constructor(studentName, totalScore) {
this.studentName = studentName;
this.totalScore = totalScore;
}
}
// 不符合规范的变量名
var 1name; // 错误:不能以数字开头
var if; // 错误:if是JavaScript的关键字
请注意,除了遵循这些基本规则外,一个好的变量名还应当简洁明了且具有描述性,能够清晰地表明该变量所代表的数据含义。
8-数据类型
在JavaScript中,有多种数据类型。下面是一些常见数据类型的例子:
1. **基本数据类型(Primitive Types)**
- **Number**(数字):
let age = 25; // 整数
let pi = 3.14; // 浮点数
- **String**(字符串):
let name = "Alice";
let greeting = 'Hello, ' + name;
- **Boolean**(布尔值):
let isStudent = true;
let hasGraduated = false;
```
- **Null**(空值):
```javascript
let emptyValue = null;
- **Undefined**(未定义):
let uninitializedVar; // 默认为undefined
- **Symbol**(符号)(ES6新增):
let uniqueKey = Symbol("key");
2. **复合数据类型(Non-Primitive Types)**
- **Object**(对象):
let person = {
name: "Bob",
age: 30,
city: "New York"
};
- **Array**(数组):
let numbersList = [1, 2, 3, 4, 5];
let mixedArray = ["apple", true, 42, {name: "Alice"}];
- **Function**(函数):
function greet(name) {
console.log("Hello, " + name);
}
注意:虽然函数也是一种对象,但在JavaScript中通常视为一种独立的数据类型。另外,在ES6中引入了`let`和`const`关键字用于声明变量,并且在处理变量作用域时提供了更精确的控制。例如:
let mutableVariable = 10; // 可变的
mutableVariable = 20;
const immutableVariable = "Immutable Value"; // 不可变的
// immutableVariable = "Changed Value"; // 这将导致错误,因为试图重新赋值给常量
9-检测数据类型
在JavaScript中,有多种方法可以检测数据类型。下面是一些示例:
1. **使用 `typeof` 操作符**:
let value = "Hello";
// 检测字符串类型
if (typeof value === 'string') {
console.log('Value is a string.');
}
value = 42;
// 检测数字类型
if (typeof value === 'number') {
console.log('Value is a number.');
}
2. **使用 `instanceof` 关键字**:
let array = [1, 2, 3];
// 检测数组类型
if (array instanceof Array) {
console.log('Value is an array.');
}
let dateObj = new Date();
// 检测Date对象类型
if (dateObj instanceof Date) {
console.log('Value is a Date object.');
}
3. **使用 `Object.prototype.toString.call()` 方法**:
let obj = {name: 'John'};
// 更通用的检测对象类型(包括内置类型和自定义类型)
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
if (getType(obj) === 'Object') {
console.log('Value is an object.');
}
let func = function() {};
if (getType(func) === 'Function') {
console.log('Value is a function.');
}
4. **ES6中的 `Array.isArray()` 函数**:
let arr = [1, 2, 3];
// 特别针对数组类型的检测
if (Array.isArray(arr)) {
console.log('Value is an array.');
}
5. **对于特殊的值如 null 和 undefined 的检查**:
let value = null;
if (value === null) {
console.log('Value is null.');
}
value = undefined;
if (typeof value === 'undefined') {
console.log('Value is undefined.');
}
10-数据类型转换-转数值
在JavaScript中,有几种方式可以将非数值类型的值转换为数值类型。以下是一些例子:
1. **使用 `Number()` 函数**:
let stringNum = "42";
let convertedNum = Number(stringNum);
console.log(convertedNum); // 输出:42
2. **隐式转换(加号操作符)**:
let str = "3.14";
let num = str + 0;
console.log(num); // 输出:3.14
3. **`parseInt()` 和 `parseFloat()` 函数**:
- `parseInt` 只处理整数部分,并忽略小数点及其后的数字,如果字符串不能被解析为整数,则返回NaN。
- `parseFloat` 则会解析整个浮点数。
let intStr = "42";
let parsedInt = parseInt(intStr, 10); // 第二个参数是进制,默认是10
console.log(parsedInt); // 输出:42
let floatStr = "3.14";
let parsedFloat = parseFloat(floatStr);
console.log(parsedFloat); // 输出:3.14
4. **一元运算符 `+`**:
let mixedStr = "42 apples";
let coercedNum = +mixedStr;
console.log(coercedNum); // 输出:42 (尝试转换为数字,由于"apples"不是数字,所以只转换了"42")
注意:`Number()` 函数和一元加法运算符 `+` 在处理无法转换为数字的字符串时,如空字符串、纯文本字符串或含有非数字字符的字符串,它们都会返回 `NaN`(Not a Number)。
11-数据类型转换-转字符串
在JavaScript中,将非字符串类型的值转换为字符串类型可以使用以下几种方法:
1. **使用 `String()` 函数**:
let num = 42;
let strNum = String(num);
console.log(strNum); // 输出:"42"
2. **隐式转换(加号操作符)**:
let num = 3.14;
let strNum = num + "";
console.log(strNum); // 输出:"3.14"
3. **模板字面量(Template literals)**:
let boolValue = true;
let strBool = `${boolValue}`;
console.log(strBool); // 输出:"true"
4. **`.toString()` 方法**:
javascript
let num = 100;
let strNum = num.toString();
console.log(strNum); // 输出:"100"
5. **对于对象而言,调用 `.toString()` 可能返回 `[object Object]`,如果需要更具体的字符串表示,可能需要调用特定的属性或方法**:
let dateObj = new Date();
let dateString = dateObj.toString();
console.log(dateString); // 输出:当前日期时间的字符串形式,如 "Tue Feb 07 2023 13:30:00 GMT+0800 (China Standard Time)"
以上都是将数值、布尔值和日期等类型转换为字符串的例子。
12-数据类型转换-转布尔
在JavaScript中,将其他类型转换为布尔值通常发生在条件判断、逻辑运算符(如 `if` 语句)或者使用 `Boolean()` 函数时。以下是一些例子:
1. **使用 `Boolean()` 函数**:
let value1 = "Hello";
let value2 = 0;
let value3 = null;
let value4 = undefined;
let value5 = NaN;
let value6 = -1;
let value7 = "";
// 显式转换为布尔值
let boolValue1 = Boolean(value1); // true,因为非空字符串是真值
let boolValue2 = Boolean(value2); // false,因为0是假值
let boolValue3 = Boolean(value3); // false,因为null是假值
let boolValue4 = Boolean(value4); // false,因为undefined是假值
let boolValue5 = Boolean(value5); // false,因为NaN是假值
let boolValue6 = Boolean(value6); // true,因为-1是一个非零数值,所以是真值
let boolValue7 = Boolean(value7); // false,因为空字符串是假值
2. **隐式转换(例如在 if 语句中)**:
let someVariable = 42;
if (someVariable) {
console.log('The variable is truthy.'); // 输出:The variable is truthy.
}
someVariable = 0;
if (someVariable) {
console.log('The variable is truthy.');
} else {
console.log('The variable is falsy.'); // 输出:The variable is falsy.
}
在JavaScript中,任何非零的数字、非空字符串、对象(包括数组和函数)、以及非`null`、`undefined`或`NaN`的值,在转换为布尔值时都会被视为`true`(真值)。而`0`、`""`(空字符串)、`null`、`undefined`和`NaN`则会被视为`false`(假值)。