JavaScript 是 web 开发人员必须学习的 3 门语言中的一门:
- HTML 定义了网页的内容
- CSS 描述了网页的布局
- JavaScript 控制了网页的行为
1.1 console.log():用于将信息输出到浏览器控制台,例如console.log("Hello, World!");
,可以输出字符串、变量、表达式等。
console.error("An error occurred!");
。console.warn("This might cause an issue!");
。;
结尾,例如var x = 5;
是一个赋值语句,if (x > 3) { console.log("x is greater than 3"); }
是一个条件语句。5 + 3
是一个算术表达式,其值为8
;x > 3
是一个比较表达式,其值为true
或false
。{}
括起来的一组语句,常用于条件语句、循环语句等中,例如if (condition) { statements; }
,花括号内的statements
就是一个代码块。var num = 10;
,在函数内声明的var
变量在整个函数内都可访问,即使在声明之前使用也不会报错(变量提升),但值为undefined
。let count = 5;
,只在声明所在的块(花括号内)及嵌套块中可访问,在声明之前使用会报错。const PI = 3.14;
,必须在声明时初始化,且后续不能重新赋值,同样具有块级作用域。if (condition) { statements1; } else { statements2; }
,根据condition
的真假执行不同的代码块。还可以有if...else if...else
的形式,例如if (x > 10) { console.log("x is greater than 10"); } else if (x > 5) { console.log("x is greater than 5 but less than or equal to 10"); } else { console.log("x is less than or equal to 5"); }
。switch (expression) {
case value1:
statements1;
break;
case value2:
statements2;
break;
default:
defaultStatements;
}
当expression
的值与某个case
后的value
相等时,执行对应的statements
,直到遇到break
跳出switch
语句,若都不匹配则执行default
后的代码。
//
开头,注释该行后面的内容,例如// This is a single-line comment
,常用于对单行代码进行简单说明。/*
开头,以*/
结尾,可注释多行内容,例如:/*
This is a
multi-line comment
It can span across multiple lines
*/
常用于对一段代码或一个函数等进行详细注释。
_
和美元符号$
。myVar
和myvar
是不同的变量。var
变量具有函数作用域,可在该函数内部及嵌套函数中访问(变量提升)。let
和const
声明的变量具有块级作用域,只在声明所在的块(花括号内)及嵌套块中可访问,在块外不可访问。10
(整数)、3.14
(浮点数)。JavaScript 中的数值可以进行各种算术运算。''
或双引号""
括起来的字符序列,如'Hello'
、"JavaScript"
。可以进行字符串连接、截取、查找等操作。true
和false
两个值,常用于条件判断和逻辑运算。var x;
,此时x
的值为undefined
。var y = null;
,与undefined
有所区别。var person = { name: 'John', age: 30 };
,可以通过.
或[]
访问对象的属性,如person.name
或person['name']
,对象还可以包含方法(函数)。var colors = ['red', 'green', 'blue'];
,可以通过索引访问数组元素,如colors[0]
获取第一个元素'red'
,数组有很多内置方法用于操作数组,如push()
、pop()
、slice()
等。var person = { name: 'John', age: 30 };
,直接使用花括号和键值对创建对象,简洁直观,常用于创建简单对象。var obj = new Object(); obj.name = 'Tom';
,先创建一个空对象,然后通过点语法添加属性和方法。JavaScript 还提供了一些内置的构造函数,如Array
、Date
等,用于创建特定类型的对象。.
或[]
访问,如person.name
或person['name']
,可以动态添加、修改和删除属性,例如person.city = 'New York';
添加一个新属性,delete person.age;
删除age
属性。var person = { name: 'John', sayHello: function() { console.log('Hello!'); } }; person.sayHello();
,通过对象名和方法名调用方法,方法内部可以访问对象的属性,使用this
关键字指代当前对象。
function functionName(parameters) { statements; return value; }
,例如function add(a, b) { return a + b; }
,函数声明会被提升到当前作用域的顶部,所以可以在声明之前调用函数(但不推荐这样做,会影响代码可读性)。var functionName = function(parameters) { statements; return value; }
,如var multiply = function(x, y) { return x * y; }
,函数表达式不会被提升,只有在执行到赋值语句时,函数才被定义,所以必须在赋值之后才能调用。function add(a, b)
中的a
和b
,用于接收函数调用时传递的实参。add(3, 5)
中的3
和5
,实参会赋值给对应的形参。function greet(name = 'Guest') { console.log('Hello,'+ name); }
,如果调用函数时没有传递该参数,则使用默认值。var
声明的变量)。函数作用域内的变量和函数与外部的同名变量和函数互不干扰,形成了一个相对独立的作用域空间。let
和const
声明的变量具有块级作用域,只在声明所在的块(花括号内)及嵌套块中可访问。块级作用域使得变量的作用范围更加明确,有助于避免一些由于变量作用域不清晰导致的问题,例如循环中的变量污染等。click
(点击)、mouseover
(鼠标移入)、mouseout
(鼠标移出)等,常用于响应用户对页面元素的鼠标操作,例如document.getElementById('myButton').addEventListener('click', function() { console.log('Button clicked!'); });
,当点击id
为myButton
的按钮时,控制台输出'Button clicked!'
。keydown
(按键按下)、keyup
(按键抬起)等,可用于处理用户的键盘输入,例如document.addEventListener('keydown', function(event) { console.log('Key pressed:', event.key); });
,当用户按下键盘上的键时,控制台输出按下的键。load
,当页面及其资源(如图片、脚本等)完全加载完成后触发,例如window.addEventListener('load', function() { console.log('Page loaded!'); });
,在页面加载完成后控制台输出'Page loaded!'
。
,当点击按钮时,会调用名为myFunction
的 JavaScript 函数。这种方式将 HTML 和 JavaScript 紧密耦合,不利于代码的维护和管理,一般不推荐在大型项目中使用。addEventListener
方法为元素绑定事件处理函数,如document.getElementById('myButton').addEventListener('click', myFunction);
,这种方式将 HTML 和 JavaScript 分离,更便于代码的组织和维护,是推荐的事件处理方式。addEventListener
可以为同一个事件绑定多个处理函数,它们会按照绑定的顺序依次执行。+
运算符,如var str1 = 'Hello'; var str2 = 'World'; var result = str1 + str2;
,result
的值为'HelloWorld'
。也可以使用+=
运算符进行字符串的追加,例如str1 += str2;
,此时str1
的值变为'HelloWorld'
。length
属性获取字符串的长度,如var length = 'JavaScript'.length;
,length
的值为10
。substring(start, end)
:提取从start
索引(包含)到end
索引(不包含)之间的子字符串,例如var str = 'Hello World'; var subStr = str.substring(0, 5);
,subStr
的值为'Hello'
。substr(start, length)
:从start
索引开始,提取length
个字符的子字符串,如var subStr2 = str.substr(6, 5);
,subStr2
的值为'World'
。slice(start, end)
:与substring
类似,但slice
支持负数索引,表示从字符串末尾开始计数,例如var subStr3 = str.slice(6, -1);
,subStr3
的值为'World'
(不包含最后一个字符'd'
)。var name = 'John'; var greeting =
Hello, ${name}!; console.log(greeting);
,输出'Hello, John!'
。模板字面量使得字符串的拼接更加方便和直观,尤其是在需要插入变量或表达式时,可以避免繁琐的字符串连接操作,提高代码的可读性。+
、减-
、乘*
、除/
、取余%
,例如var x = 5 + 3;
,x
的值为8
;var y = 10 % 3;
,y
的值为1
。++
、递减--
,分为前置和后置两种形式,前置++
(--
)会先将变量的值加(减)1,然后再使用该变量的值,例如var a = 5; var b = ++a;
,此时a
和b
的值都为6
;后置++
(--
)会先使用变量的值,然后再将变量的值加(减)1,例如var c = 5; var d = c++;
,此时c
的值为6
,d
的值为5
。==
、全等===
、不等于!=
、不全等!==
、大于>
、小于<
、大于等于>=
、小于等于<=
。==
在比较时会进行类型转换,例如'5' == 5
结果为true
;===
不会进行类型转换,'5' === 5
结果为false
。比较运算常用于条件判断,如if (x > 3) { console.log("x is greater than 3"); }
。&&
、或||
、非!
,例如if (x > 0 && y < 10) { console.log('Both conditions are true'); }
,只有当x > 0
和y < 10
都为true
时,才会执行花括号内的代码;if (x > 0 || y < 10) { console.log('At least one condition is true'); }
,只要x > 0
或y < 10
其中一个为true
,就会执行花括号内的代码;if (!x) { console.log('x is false'); }
,当x
为false
(或转换为false
的值,如0
、null
、undefined
、空字符串等)时,执行花括号内的代码。比较运算符在逻辑语句中使用,以测定变量或值是否相等。x=5,下面的表格解释了比较运算符:
运算符 | 描述 | 比较 | 返回值 | 实例 |
---|---|---|---|---|
== | 等于 | x==8 | false | 实例 » |
x==5 | true | 实例 » | ||
=== | 绝对等于(值和类型均相等) | x==="5" | false | 实例 » |
x===5 | true | 实例 » | ||
!= | 不等于 | x!=8 | true | 实例 » |
!== | 不绝对等于(值和类型有一个不相等,或两个都不相等) | x!=="5" | true | 实例 » |
x!==5 | false | 实例 » | ||
> | 大于 | x>8 | false | 实例 » |
< | 小于 | x<8 | true | 实例 » |
>= | 大于或等于 | x>=8 | false | 实例 » |
<= | 小于或等于 | x<=8 | true | 实例 » |
逻辑运算符用于测定变量或值之间的逻辑。给定 x=6 以及 y=3,下表解释了逻辑运算符:
运算符 | 描述 | 例子 |
---|---|---|
&& | and | (x < 10 && y > 1) 为 true |
|| | or | (x==5 || y==5) 为 false |
! | not | !(x==y) 为 true |
JavaScript 还包含了基于某些条件对变量进行赋值的条件运算符。
语法
variablename=(condition)?value1:value2
例子
如果变量 age 中的值小于 18,则向变量 voteable 赋值 "年龄太小",否则赋值 "年龄已达到"。
voteable=(age<18)?"年龄太小":"年龄已达到";
for (initialization; condition; increment/decrement) {
// 循环体语句
}
initialization
:初始化表达式,用于初始化循环变量,只在循环开始时执行一次。例如var i = 0;
。condition
:条件表达式,每次循环开始前都会检查该条件,如果为true
,则执行循环体,否则循环结束。例如i < 5;
。increment/decrement
:递增或递减表达式,用于在每次循环体执行后更新循环变量的值。例如i++;
。收起
javascript
for (var i = 0; i < 5; i++) {
console.log(i);
}
上述代码会输出0
、1
、2
、3
、4
。
15.2 for...in 循环:用于遍历对象的可枚举属性(包括继承的可枚举属性),但不建议用于遍历数组(因为会遍历数组的索引,且顺序不一定是数组元素的顺序)。
收起
javascript
for (var prop in obj) {
console.log(obj[prop]);
}
收起
javascript
var person = { name: 'John', age: 30 };
for (var key in person) {
console.log(key + ': ' + person[key]);
}
收起
plaintext
name: John
age: 30
while (condition) {
// 循环体语句
}
只要condition
为true
,就会一直执行循环体。
var i = 0;
while (i < 5) {
console.log(i);
i++;
}
输出0
、1
、2
、3
、4
。
16.2 do...while 循环:
do {
// 循环体语句
} while (condition);
先执行一次循环体,然后再检查condition
,如果为true
,则继续执行循环体,直到condition
为false
。
var j = 0;
do {
console.log(j);
j++;
} while (j < 5);
输出0
、1
、2
、3
、4
。
for
、while
、do...while
),不再执行循环体中剩余的语句,直接执行循环后面的代码。
for (var k = 0; k < 5; k++) {
if (k == 3) {
break;
}
console.log(k);
}
输出0
、1
、2
,当k
等于3
时,执行break
,循环结束。
17.2 continue 语句:用于跳过当前循环的剩余语句,直接进入下一次循环的条件判断。
for (var l = 0; l < 5; l++) {
if (l == 2) {
continue;
}
console.log(l);
}
0
、1
、3
、4
,当l
等于2
时,执行continue
,跳过本次循环体中console.log(l);
语句,直接进行下一次循环。typeof 5; // 返回'number'
typeof 'Hello'; // 返回'string'
typeof true; // 返回'boolean'
typeof undefined; // 返回'undefined'
typeof null; // 返回'object'(这是JavaScript的一个历史遗留问题,实际上null是一个特殊值,不是对象)
typeof {}; // 返回'object'
typeof []; // 返回'object'(数组也是对象的一种特殊形式)
typeof function() {}; // 返回'function'
19.1 显式类型转换:
Number('123')
:将字符串转换为数值,如果字符串不能转换为有效的数值,则返回NaN
(Not a Number)。例如Number('123')
返回123
,Number('abc')
返回NaN
。parseInt('123')
:将字符串转换为整数,从字符串开头开始解析,直到遇到非数字字符为止。例如parseInt('123abc')
返回123
,parseInt('abc123')
返回NaN
。还可以指定进制,如parseInt('10', 2)
将二进制字符串'10'
转换为十进制整数2
。parseFloat('3.14')
:将字符串转换为浮点数,与parseInt
类似,但可以解析小数点。例如parseFloat('3.14abc')
返回3.14
,parseFloat('abc3.14')
返回NaN
。String(123)
:将其他类型的值转换为字符串,例如String(123)
返回'123'
。123.toString()
:将数值转换为字符串,注意null
和undefined
没有toString
方法,如果直接调用会报错。例如(123).toString()
返回'123'
。Boolean(0)
:将其他类型的值转换为布尔值,以下值转换为false
:0
、null
、undefined
、空字符串''
、NaN
,其他值都转换为true
。例如Boolean(0)
返回false
,Boolean('abc')
返回true
。19.2 隐式类型转换:在某些运算或操作中自动发生,例如:
'5' + 3
:由于+
运算符一侧是字符串,另一侧是数值,JavaScript 会将数值3
隐式转换为字符串'3'
,然后进行字符串连接,结果为'53'
。'5' * 3
:*
运算符要求两侧都是数值,JavaScript 会将字符串'5'
隐式转换为数值5
,然后进行乘法运算,结果为15
。20.1 创建正则表达式:
/pattern/flags
,例如/abc/gi
,pattern
是正则表达式的模式,flags
是可选的标志,g
表示全局匹配(查找所有匹配,而不是在找到第一个匹配后停止),i
表示不区分大小写。RegExp
构造函数:new RegExp('pattern', 'flags')
,例如new RegExp('abc', 'gi')
,与字面量方式效果相同。20.2 正则表达式方法:
test()
:用于检测字符串是否匹配正则表达式,返回true
或false
。
var regex = /abc/;
regex.test('abcdef'); // 返回true
regex.test('defabc'); // 返回false
match()
:返回匹配的结果,如果正则表达式带有g
标志,则返回所有匹配的结果组成的数组,否则返回第一个匹配的结果及相关信息(如匹配的起始位置等)。
var str = 'abcdefabc';
str.match(/abc/g); // 返回['abc', 'abc']
str.match(/abc/); // 返回['abc', index: 0, input: 'abcdefabc', groups: undefined]
21.1 错误类型:
Error
:基本错误类型,其他错误类型都继承自它。SyntaxError
:语法错误,例如代码中存在拼写错误、缺少括号等语法问题时会抛出该错误。ReferenceError
:引用错误,当使用未声明的变量或访问不存在的对象属性时会抛出该错误。TypeError
:类型错误,例如对不支持的操作数进行操作,如'abc' + 5
(字符串和数值相加),或者调用不存在的方法等情况会抛出该错误。21.2 错误处理:
try...catch
语句来捕获和处理错误,例如:try {
// 可能出错的代码
var x = y; // y未声明,会抛出ReferenceError
} catch (error) {
console.log(error.message); // 输出错误信息
}
try
块中放置可能会抛出错误的代码,catch
块用于捕获错误并进行处理,可以通过error
对象获取错误的相关信息,如message
属性获取错误消息。22.1 浏览器开发者工具:
F12
键打开。开发者工具包含多个面板,如控制台(Console)、元素(Elements)、源代码(Sources)等。console.log
等输出)、错误信息等,还可以直接在控制台中输入 JavaScript 代码进行测试。22.2 使用debugger
语句:在代码中设置断点,当代码执行到debugger
时,会暂停执行,进入调试模式(前提是浏览器开发者工具已打开且处于调试状态)。例如:
function myFunction() {
var x = 5;
debugger;
var y = 10;
}
myFunction();
myFunction
函数时,代码执行到debugger
语句会暂停,此时可以在开发者工具中进行调试操作。var
声明的变量会发生变量提升,即变量声明会被提升到函数顶部,但赋值不会提升。例如:console.log(x); // 输出undefined
var x = 10;
在上述代码中,虽然var x = 10;
在console.log(x);
之后,但由于变量提升,JavaScript 会将var x;
提升到函数顶部,所以在console.log(x);
时,x
已经声明,但还未赋值,所以输出undefined
。
let
和const
声明的变量不存在变量提升,在声明之前使用会报错。例如:
console.log(y); // 报错:ReferenceError: y is not defined
let y = 20;
'use strict';
,则该函数内的代码将处于严格模式。例如:function strictFunction() {
'use strict';
// 函数内的代码处于严格模式
}
也可以在整个脚本开头添加(对于模块脚本,默认处于严格模式),则整个脚本内的代码都处于严格模式。
24.2 严格模式的限制和变化:
delete
操作符删除某些对象的属性,但在严格模式下,除了删除对象的可配置属性外,其他情况使用delete
都会报错。010
),在严格模式下,必须使用0o10
表示八进制数。var globalVar = 10;
,在另一个脚本中可能会不小心覆盖这个变量的值,或者使用了相同的变量名但含义不同,导致难以排查的问题。if ('5' == 5)
这种比较,虽然在 JavaScript 中可以正常工作,但不如if (Number('5') === 5)
这样的代码清晰易懂,明确地展示了类型转换的过程。26.1 表单元素获取:
document.getElementById()
方法根据id
获取表单元素,例如var inputElement = document.getElementById('myInput');
,获取id
为myInput
的输入框元素。document.querySelector()
方法使用 CSS 选择器获取表单元素,如var buttonElement = document.querySelector('button.submitButton');
,获取类名为submitButton
的按钮元素。document.querySelectorAll()
方法获取多个符合条件的表单元素,返回一个 NodeList 集合,例如var inputElements = document.querySelectorAll('input[type="text"]');
,获取所有type
为text
的输入框元素。26.2 表单元素的属性和方法:
value
:获取或设置表单元素的值,例如inputElement.value
获取输入框的值,inputElement.value = 'New Value';
设置输入框的值。checked
:对于复选框(checkbox
)和单选按钮(radio
),用于获取或设置是否选中,例如checkboxElement.checked = true;
选中复选框。disabled
:用于获取或设置表单元素是否禁用,例如buttonElement.disabled = true;
禁用按钮。focus()
:使表单元素获得焦点,例如inputElement.focus();
使输入框获得焦点,方便用户输入。blur()
:使表单元素失去焦点,例如inputElement.blur();
。function validateForm() {
var nameInput = document.getElementById('name');
if (nameInput.value === '') {
alert('请输入姓名');
return false;
}
// 其他验证逻辑,如邮箱格式、密码强度等
return true;
}
将onsubmit
事件绑定到表单的onsubmit
属性上,如,当
validateForm
函数返回false
时,表单不会提交,从而实现客户端的表单验证,减少无效数据提交到服务器。
required
:表示该表单元素为必填项,例如,如果用户未填写该输入框,表单提交时会自动提示必填。
pattern
:用于设置正则表达式模式,验证输入内容是否符合指定的格式,例如,用于验证邮箱格式。
min
、max
:用于设置数值输入框的最小值和最大值,例如,限制输入的数值范围。
可以通过checkValidity()
方法检查表单元素是否有效,通过validity
属性获取表单元素的有效性状态信息,例如
var inputElement = document.getElementById('myInput');
inputElement.checkValidity(); // 返回true或false,表示元素是否有效
inputElement.validity; // 返回一个对象