JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。
JavaScript 是一门弱类型的动态脚本语言,支持多种编程范式,包括面向对象和函数式编程,被广泛用于 Web 开发。
基本特点:
JavaScript 与 Java 是两种完全不同的语言,无论在概念上还是设计上。
两者的关系就像:周杰与周杰伦,雷锋与雷锋塔。
Java(由 Sun 发明)是更复杂的编程语言。
JavaScript 由Netscape(网景)公司的 Brendan Eich 发明。Netscape在最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。
JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。
完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型(DOM),浏览器对象模型(BOM)。
ECMAScript:描述该语言的语法和基本对象,是JavaScript的标准,目前的版本为ES6。
文档对象模型(DOM):描述处理网页内容的方法和接口。
浏览器对象模型(BOM),描述与浏览器进行交互的方法和借口。
JavaScript常用来完成以下任务:
(1)脚本语言。JavaScript是一种解释型的脚本语言,C、C++等语言先编译后执行,而JavaScript是在程序的运行过程中逐行进行解释。
(2)基于对象。JavaScript是一种基于对象的脚本语言,它不仅可以创建对象,也能使用现有的对象。
(3)简单。JavaScript语言中采用的是弱类型的变量类型,对使用的数据类型未做出严格的要求,是基于Java基本语句和控制的脚本语言,其设计简单紧凑。
(4)动态性。JavaScript是一种采用事件驱动的脚本语言,它不需要经过Web服务器就可以对用户的输入做出响应。在访问一个网页时,鼠标在网页中进行鼠标点击或上下移、窗口移动等操作JavaScript都可直接对这些事件给出相应的响应。
(5)跨平台性。JavaScript脚本语言不依赖于操作系统,仅需要浏览器的支持。因此一个JavaScript脚本在编写后可以带到任意机器上使用,前提上机器上的浏览器支持JavaScript脚本语言,JavaScript已被大多数的浏览器所支持。
在 HTML 中,JavaScript 代码必须位于 < script> 与 < /script> 标签之间。
<script>
document.getElementById("demo").innerHTML = "我的第一段 JavaScript";
script>
注:旧的 JavaScript 例子也许会使用 type 属性:< script type=“text/javascript”>。
type 属性不是必需的。JavaScript 是 HTML 中的默认脚本语言。
举例1:放置于 HTML 页面的 < head> 部分
该函数会在按钮被点击时调用:
<html>
<head>
<script>
function myFunction() {
document.getElementById("demo").innerHTML = "段落被更改。";
}
script>
head>
<body>
<h1>一张网页h1>
<p id="demo">一个段落p>
<button type="button" onclick="myFunction()">试一试button>
body>
html>
举例2:放置于 HTML 页面的 < body> 部分
该函数会在按钮被点击时调用:
<html>
<body>
<h1>A Web Pageh1>
<p id="demo">一个段落p>
<button type="button" onclick="myFunction()">试一试button>
<script>
function myFunction() {
document.getElementById("demo").innerHTML = "段落被更改。";
}
script>
body>
html>
脚本可放置与外部文件中。
JavaScript 文件的文件扩展名是 .js。
外部脚本文件:myScript.js
function myFunction() {
document.getElementById("demo").innerHTML = "段落被更改。";
}
举例:
注:如需使用外部脚本,请在 < script> 标签的 src (source) 属性中设置脚本的名称:
<script src="myScript.js">script>
该脚本的表现与它被置于 < script> 标签中是一样的。
注意:外部脚本不能包含< script> 标签。
可通过完整的 URL 或相对于当前网页的路径引用外部脚本:
举例:
本例使用完整的 URL 来链接至脚本:
<script src="https://www.w3school.com.cn/js/myScript1.js">script>
JavaScript 显示方案
JavaScript 能够以不同方式“显示”数据:
如需访问 HTML 元素,JavaScript 可使用 document.getElementById(id) 方法。
id 属性定义 HTML 元素。innerHTML 属性定义 HTML 内容:
<html>
<body>
<h1>我的第一张网页h1>
<p>我的第一个段落p>
<p id="demo">p>
<script>
document.getElementById("demo").innerHTML = 5 + 6;
script>
body>
html>
出于测试目的,使用 document.write() 比较方便,该方法会将返回值打印在空白页面上
<html>
<body>
<h1>我的第一张网页h1>
<p>我的第一个段落p>
<script>
document.write(5 + 6);
script>
body>
html>
注意:在 HTML 文档完全加载后使用 document.write() 将删除所有已有的 HTML
所以==document.write() 方法仅用于测试==
测试:
<html>
<body>
<h1>我的第一张网页h1>
<p>我的第一个段落p>
<button onclick="document.write(5 + 6)">试一试button>
body>
html>
alert() 方法用于显示带有一条指定消息和一个 OK 按钮的警告框。(window.可以省略)
<script>
window.alert(5 + 6);
script>
在浏览器中,您可使用 console.log() 方法将数据显示在浏览器控制台。
请通过 F12 来激活浏览器控制台,并在菜单中选择“控制台”。
<script>
console.log(5 + 6);
script>
在 HTML 中,JavaScript 语句是由 web 浏览器“执行”的“指令”
用var关键字 来声明变量.(js中 所有变量都可以用var来声明)
var a;
var b;
a = 10;
b = true;
var c = null;
var d = "hello js";
var a,b,c;
......
JavaScript 变量是存储数据值的容器
所有 JavaScript 变量必须以唯一的名称的标识。
这些唯一的名称称为标识符。
标识符可以是短名称(比如 x 和 y),或者更具描述性的名称(age、sum、totalVolume)。
构造变量名称(唯一标识符)的通用规则是:
JavaScript 变量能够保存多种数据类型:数值、字符串值、数组、对象等等:
var i; //未赋值时,默认值为undefined,类型为:undefined
var a = 7; // 数组 number类型
var falg = true; //布尔 boolean类型
var lastName = "Gates"; // 字符串 string类型
var ss = null; //null object类型
var cars = ["Porsche", "Volvo", "BMW"]; // 数组 object类型
var x = {firstName:"Bill", lastName:"Gates"}; // 对象 object类型
var y = function myFunc(){}; //函数 function类型
注:
1.typeof运算符 == typeof()
作用:确定 JavaScript 变量的类型,返回变量或表达式的类型。返回值为String类型。
typeof 3.14 // 返回 "number"
typeof (7) // 返回 "number"
typeof (7 + 8) // 返回 "number"
typeof "" // 返回 "string"
typeof "Bill"; // 返回 "string"
typeof(null); //返回 “object”
typeof function myFunc(){} // 返回 "function"
......
2.在 JavaScript 中,null 是 “nothing”。它被看做不存在的事物。
可以通过设置值为 null 清空对象
var person = null; // 值是 null,但是类型仍然是对象
可以通过设置值为 undefined 清空对象:
var person = undefined; // 值是 undefined,类型是 undefined
3.Undefined 与 Null 的区别
Undefined 与 null 的值相等,但类型不相等:
typeof undefined // undefined
typeof null // object
null === undefined // false
null == undefined // true
/*== 与 ===的区别
== 代表相同, ===代表严格相同
当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而===比较时, 如果类型不同,直接就是false.
*/
4.空值与 undefined 不是一回事。
空的字符串变量既有值也有类型。
关键词 | 描述 |
---|---|
break | 终止 switch 或循环。 |
continue | 跳出循环并在顶端开始。 |
debugger | 停止执行 JavaScript,并调用调试函数(如果可用)。 |
do … while | 执行语句块,并在条件为真时重复代码块。 |
for | 标记需被执行的语句块,只要条件为真。 |
function | 声明函数。 |
if … else | 标记需被执行的语句块,根据某个条件。 |
return | 退出函数。 |
switch | 标记需被执行的语句块,根据不同的情况。 |
try … catch | 对语句块实现错误处理。 |
var | 声明变量。 |
JavaScript 函数通过 function 关键词进行定义,其后是函数名和括号 ()。
语法:
var 变量名 = function (参数列表) {
函数体;//要执行的代码
};
举例:
function myFunction(p1, p2) {
return p1 * p2; // 该函数返回 p1 和 p2 的乘积
}
注意:在 JavaScript 函数中声明的变量,会成为函数的局部变量。
局部变量只能在函数内访问。
方法:函数名();
函数中的代码将在其他代码调用该函数时执行:
当 JavaScript 到达 return 语句,函数将停止执行。
如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。
函数通常会计算出返回值。这个返回值会返回给调用者:
var x = myFunction(7, 8); // 调用函数,返回值被赋值给 x
function myFunction(a, b) {
return a * b; // 函数返回 a 和 b 的乘积
}
JavaScript 对象是被命名值的容器。
值以名称:值对的方式来书写(名称和值由冒号分隔)。
(JavaScript 对象中的)名称:值对被称为属性。
var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"};
等价于
var person = {
firstName:"Bill",
lastName:"Gates",
age:50,
eyeColor:"blue"
};
这里的person被称为一个JavaScript对象
对象也可以有方法。
方法是在对象上执行的动作。
方法以函数定义被存储在属性中。
方法是作为属性来存储的函数。
var person = {
firstName: "Bill",
lastName : "Gates",
id : 678,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
访问对象属性两种形式:
例:
//方式一:
document.write(person.lastName);
//方式二:
document.write(person["lastName"]);
//以下两种形式错误
document.write(person["lastName"+"firstName"]);//结果:undefined
document.write(person["lastName"+"id"]);//结果:undefined
注:这两种方式使用相同。
访问对象方法:
document.write(person.fullName());//Bill Gates
//下面形式返回函数定义
document.write(person.fullName);//function() { return this.firstName + " " + this.lastName; }
在函数定义中,this 引用该函数的“拥有者”。
举例:
this.firstName :意思是 this 对象(这里为person对象)的 firstName 属性。
JavaScript 字符串用于存储和操作文本。
//以下两种定义无区别
var carname = "Porsche 911";
var carname = 'Porsche 911';
//
var answer = "He is called 'Bill'";
var answer = 'He is called "Bill"';
由于字符串必须由引号包围,当需要输出的字符串也包含引号时,JavaScript 会误解这段字符串
比如:
var y = "中国是瓷器的故乡,因此 china 与"China(中国)"同名。"
上述:JavaScript会报异常:Uncaught SyntaxError: Unexpected identifier
需使用 \转义字符,反斜杠转义字符把特殊字符转换为字符串字符.
var x = "中国是瓷器的故乡,因此 china 与\"China(中国)\"同名。"
代码 | 结果 | 描述 |
---|---|---|
’ | ’ | 单引号 |
" | " | 双引号 |
\ | \ | 反斜杠 |
\b | 退格键 |
---|---|
\f | 换页 |
\n | 新行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表 |
字符串可通过关键词 new 定义为对象==(十分不建议使用new方式)==
var x = "Bill";
var y = new String("Bill");
// typeof x 将返回 string
// typeof y 将返回 object
// (x == y) 为 true,因为 x 和 y 的值相等
// (x === y) 为 false,因为 x 和 y 的类型不同(字符串与对象)
new 关键字使代码复杂化,请不要把字符串创建为对象.
弊端:
1.使用 == 相等运算符时,相等字符串是相等的
当使用 === 运算符时,相等字符串是不相等的,因为 = == 运算符需要类型和值同时相等
2.对象无法比较
var x = new String("Bill");
var y = new String("Bill");
// (x == y) 为 false,因为 x 和 y 是不同的对象
// (x === y) 为 false,因为 x 和 y 是不同的对象
在 ECMAScript中,变量存在两种类型的值,原始值和引用值
ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
引用类型通常叫做类(class),也就是说,遇到引用值,所处理的就是对象。
原始值:存储在栈(stack)中的简单数据段,是原始类型的值。
引用值:存储在堆(heap)中的对象,Object 对象。
原始值,比如“Bill Gates”,无法拥有属性和方法(因为它们不是对象)。但是通过 JavaScript,方法和属性也可用于原始值,因为 在执行方法和属性时 JavaScript 将原始值视为对象
length 属性返回字符串的长度:
var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var str = "中国";
var sp = " a ";
document.write(txt.length);//26
document.write(str.length);//2
document.write(sp.length);//3 空格也算一个字符
indexOf() 方法返回字符串中指定文本首次出现的索引(位置):(索引从0开始)
lastIndexOf() 方法返回指定文本在字符串中最后一次出现的索引:
search() 方法搜索特定值的字符串,并返回匹配的位置:结果与indexof()相同。
区别在于:search() 方法无法设置第二个开始位置参数,可设置更强大的搜索值(正则表达式)。
indexof()可以设置第二个开始位置参数,不可设置正则表达式。
var str = "abcabcaabbcc";
var pos = str.indexOf("aa");
var pos1 = str.lastIndexOf("aa");
document.write(pos);//3
document.write(pos1);//8
如果未找到文本, indexOf() 和 lastIndexOf() 均返回 -1。
两种方法都接受作为检索起始位置的第二个参数。
var str = "abcabcaabbcc";
var pos = str.indexOf("aa",2);
var pos1 = str.lastIndexOf("aa",5);
document.write(pos);//6
document.write(pos1);//-1
注意:indexOf()向后进行检索(从头到尾)本例从索引为2的c开始向后检索,经过abc 查到aa
lastIndexOf() 向前进行检索(从尾到头),本例从索引为5的c开始向前检索,经过bacba,未找到aa,返回-1
var str = "Apple, Banana, Mango";
var res = str.slice(7, 13);
var res1 = str.slice(7);
var res2 = str.slice(-13, -7);
var res3 = str.slice(-13);
var res4 = str.substring(7, 13);
var res5 = str.substring(7);
var res6 = str.substr(7, 6);
var res7 = str.substr(7);
console.log(res+"\n");//Banana
console.log(res1+"\n");//Banana, Mango
console.log(res2+"\n");//Banana
console.log(res3+"\n");//Banana, Mango
console.log(res4+"\n");//Banana
console.log(res5+"\n");//Banana, Mango
console.log(res6+"\n");//Banana
console.log(res7+"\n");//Banana, Mango
replace() 方法用另一个值替换在字符串中指定的值:
replace() 方法不会改变调用它的字符串。它返回的是新字符串。
默认地,replace() 只替换首个匹配:
var str = "Apple, Banana, Mango";
var newStr = str.replace("Banana","Orange");
document.write(newStr);//Apple, Orange, Mango
var str1 = "Apple, Banana, Mango, Banana";
var newStr1 = str1.replace("Banana","Orange");
document.write(newStr1);//Apple, Orange, Mango, Banana
通过 toUpperCase() 把字符串转换为大写:
通过 toLowerCase() 把字符串转换为小写:
var str = "Hello World";
document.write(str.toUpperCase());//HELLO WORLD
document.write(str.toLowerCase());//hello world
concat() 连接两个或多个字符串:
var text1 = "Hello";
var text2 = "World";
text3 = text1.concat(" ",text2);
concat() 方法可用于代替加运算符。下面两行是等效的:
var text = "Hello" + " " + "World!";
var text = "Hello".concat(" ","World!");
注意:所有字符串方法都会返回新字符串。它们不会修改原始字符串。
正式地说:字符串是不可变的:字符串不能更改,只能替换。
trim() 方法删除字符串两端的空白符:
var str = " Hello World! ";
alert(str.trim());
charAt() 方法返回字符串中指定下标(位置)的字符串
charCodeAt() 方法返回字符串中指定索引的字符 unicode 编码
var str = "HELLO WORLD";
str.charAt(0); // 返回 H
var str1 = "HELLO WORLD";
str1.charCodeAt(0); // 返回 72
var str = "HELLO WORLD";
str[0]; // 返回 H
注意:
var str = "HELLO WORLD";
str[0] = "A"; // 不产生错误,但不会工作
str[0]; // 返回 H
split() 方法将字符串转换为数组:
txt.split(","); // 用逗号分隔
txt.split(" "); // 用空格分隔
txt.split("|"); // 用竖线分隔
var str="How are you doing today?"
document.write(str.split(" ") + "
")//How,are,you,doing,today?
document.write(str.split("") + "
")//H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
document.write(str.split(" ",3))//How,are,you
如果省略分隔符,被返回的数组将包含 index [0] 中的整个字符串。
如果分隔符是 “”,被返回的数组将是间隔单个字符的数组.
JavaScript 只有一种数值类型
JavaScript 数值始终是 64 位的浮点数
与许多其他编程语言不同,JavaScript 不会定义不同类型的数,比如整数、短的、长的、浮点的等等。
JavaScript 数值始终以双精度浮点数来存储。
var x = 3.14; // 带小数点的数值
var y = 3; // 不带小数点的数值
var x = 123e5; // 12300000
var y = 123e-5; // 0.00123
var x = 10;
var y = "20";
var z = x + y; // z 将是 1020(一个字符串)
var x = 10;
var y = 20;
var z = "30";
var result = x + y + z;//结果为3030(字符串)
JavaScript 字符串可以拥有数字内容:
var x = 100; // x 是数字
var y = "100"; // y 是字符串
document.write(x == y);//true
document.write(x === y);//false
在所有数字运算中,JavaScript 会尝试将字符串转换为数字:(加法运算不满足)
var x = "100";
var y = "10";
var z = x / y; // z 将是 10(数值型)
document.write(typeof(z))//number
var x = "100";
var y = "10";
var z = x + y; // z 不会是 110(而是 10010)
NaN 属于 JavaScript 保留词,指示某个数不是合法数
使用全局 JavaScript 函数 isNaN() 来确定某个值是否是数:
var x = 100 / "Apple"; // x 将是 NaN(Not a Number)
isNaN(x); // 返回 true,因为 x 不是数
typeof NaN; // 返回 "number"
Infinity (或 -Infinity)是 JavaScript 在计算数时超出最大可能数范围时返回的值。
var x = 2 / 0; // x 将是 Infinity
var y = -2 / 0; // y 将是 -Infinity
typeof Infinity; // 返回 "number"
toString() 以字符串返回数值。
所有数字方法可用于任意类型的数字(字面量、变量或表达式):
var x = 123;
x.toString(); // 从变量 x 返回 123
(123).toString(); // 从文本 123 返回 123
(100 + 23).toString(); // 从表达式 100 + 23 返回 123
toExponential() 返回字符串值,它包含已被四舍五入并使用指数计数法的数字。
参数定义小数点后的字符数:
var x = 9.656;
x.toExponential(2); // 返回 9.66e+0
x.toExponential(4); // 返回 9.6560e+0
x.toExponential(6); // 返回 9.656000e+0
注:该参数是可选的。如果您没有设置它,JavaScript 不会对数字进行舍入。
toFixed() 返回字符串值,它包含了指定位数小数的数字:
var x = 9.656;
x.toFixed(0); // 返回 10
x.toFixed(2); // 返回 9.66
x.toFixed(4); // 返回 9.6560
x.toFixed(6); // 返回 9.656000
toPrecision() 返回字符串值,它包含了指定长度的数字:
var x = 9.656;
x.toPrecision(); // 返回 9.656
x.toPrecision(2); // 返回 9.7
x.toPrecision(4); // 返回 9.656
x.toPrecision(6); // 返回 9.65600
正则表达式是构成*搜索模式(search pattern)*的字符序列。
当您搜索文本中的数据时,您可使用搜索模式来描述您搜索的内容。
正则表达式可以是单字符,或者更复杂的模式。
正则表达式可用于执行所有类型的文本搜索和文本替换操作。
语法:/pattern/attributes
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
[^adgk] | 查找给定集合外的任何字符。 |
(red|blue|green) | 查找任何指定的选项。 |
元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 至 Y 个 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
n$ | 匹配任何结尾为 n 的字符串。 |
^n | 匹配任何开头为 n 的字符串。 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
用户名 | /^ [a-z0-9_-]{3,16}$/ |
---|---|
密码 | /^ [a-z0-9_-]{6,18}$/ |
十六进制值 | /^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
电子邮箱 | /^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})KaTeX parse error: Undefined control sequence: \d at position 9: / /^[a-z\̲d̲]+(\.[a-z\d]+)*…/ |
URL | /^(https?:\ //)?([\da-z.-]+).([a-z.]{2,6})([/\w .-])/?$/ |
IP 地址 | /((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ /^(?: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
HTML 标签 | / <([a-z]+)([ <]+)(?:>(.)\1>|\s+/>)$/ |
删除代码\注释 | (? |
Unicode编码中的汉字范围 | /^ [\u2E80-\u9FFF]+$/ |
注:若需要更详细的学习该技术,推荐去w3school网进行进一步学习。
网址:https://www.w3school.com.cn/