自我编译之 JavaScript 学习 ( 上)

目录

熟悉HTML5

JavaScript的数据类型

 字符串(string)

Math对象

数字(Number)

布尔(Boolean)

空(Null)和未定义(Undefined)

数组(Array)

数组的遍历

数组的常用方法

对象(Object)

对象定义

对象属性

访问对象属性

对象方法

JavaScript数据类型转换

typeof操作符

constructor 属性

 将数字转换为字符串

布尔值转换为字符串

将字符串转为数组

一元运算符 +  可以用于将变量转换为数字

将布尔值转换为数字

将日期转换位数字

将日期转换位数字

自动转换类型

自动转换为字符串

数字和布尔值也经常相互转换

JavaScript运算符

算术运算符

比较运算符

逻辑运算符

条件运算符(三目运算)

JavaScript语句

条件语句

if语句

if....else语句

if....else if....else语句

switch 语句

default关键词

循环语句

while循环

do/while 循环

for循环

for/in循环

break 语句

continue 语句

JavaScript 函数

函数定义

调用带参数的函数

带有返回值的函数

局部 JavaScript 变量

全局 JavaScript 变量

 JavaScript 变量的生存期

向未声明的 JavaScript 变量分配值

JavaScript 作用域

JS函数递归

JavaScript 事件

HTML 事件

常见的HTML事件

JavaScript 可以做什么?

JavaScript this 关键字

方法中的 this

单独使用 this

函数中使用 this(默认)

函数中使用 this(严格模式)

事件中的 this

对象方法中绑定

显式函数绑定

JavaScript 正则表达式

什么是正则表达式?​​​​​​​

使用字符串方法

search() 方法使用正则表达式​​​​​​​

search() 方法使用字符串

replace() 方法使用正则表达式

replace() 方法使用字符串

正则表达式修饰符

正则表达式模式

使用 RegExp 对象

使用 exec()

熟悉HTML5

在HTML页面中插入JavaScript代码,需要使用到<script>标签,注意是双标签,告诉JavaScript在何处开始与结束,在<script>标签内就包含了JavaScript代码
再开始代码之前熟悉一下一个html文件

<!DOCTYPE html> 声明为 HTML5 文档
<html> 元素是 HTML 页面的根元素
<head> 元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8。
<title> 元素描述了文档的标题
<body> 元素包含了可见的页面内容
<h1> 元素定义一个大标题
<p> 元素定义一个段落
注:在浏览器的页面上使用键盘上的 F12 按键开启调试模式,就可以看到组成标签
这是需要熟悉的

首先认识一下数据显示的JS
window.alert() 弹出警告框
document.write() 将内容写到HTML文档中
innerHTML将内容写到HTML元素中
console.log() 将内容写到浏览器的控制台中 

实例:

<script>
    window.alert(5)//页面会弹出一个框,框里面的内容就是5
</script>

操作HTML元素:

<!DOCTYPE html>
<html>
<body>

<h1>我的第一个 Web 页面</h1>

<p id="demo">我的第一个段落</p>

<script>
    document.getElementById("demo").innerHTML = "段落已修改。";

    document.write(Data())//将内容写入到HTML文档

    var a = 5;

    console.log(a)//将内容写入到控制台中

</script>

</body>
</html>

以上JavaScript语句(在<script>标签中),可以在web浏览器中执行
document.getElementById("demo")时使用id属性来查找HTML元素的JavaScript代码
innerHTML = "段落已修改。"  是用于修改元素HTML内容(innerHTML)的JavaScript代码

既然熟悉了一点,那么就正式开始JavaScript的学习

首先介绍一下JavaScript的数据类型

JavaScript的数据类型

JavaScript的数据类型分为基本数据类型(也叫值类型)和引用数据类型
基本类型分为字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol
引用类型分为对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)

Symbol是ES6引入的一种新的原始数据类型,标识独一无二的值

检查一个变量的数据类型可以使用操作符typeof,后面会介绍到

 字符串(string)

String用于表示一个字符序列,即字符串。字符串可以是引号中的任意文本,字符串需要使用 单引号 或 双引号 括起来

var str = 'hello';
//var是声明变量的关键字,当然有了ES6我几乎就不用了,这里还是可以用用
//这里用var声明了一个变量str,并且给这个str变量进行了赋值'hello'
console.log(str);//hello
console.log(typeof str);//string 打印出str的类型为字符串

Math对象

Math.round(3.6)     //四舍五入
Math.random()       //返回0-1之间的随机数
Math.max(num1, num2)  //返回较大的数
Math.min(num1, num2)   //返回较小的数
Math.abs(num)     //绝对值
Math.ceil(19.3)     //向上取整
Math.floor(11.8)    //向下取整
Math.pow(x,y)       //x的y次方
Math.sqrt(num)     //开平方

详情请移步   JavaScript之Math数学运算相关函数

数字(Number)

JavaScript 只有一种数字类型。数字可以带小数点,也可以不带

var num = 18;
console.log(num);//18
console.log(typeof num);//number

布尔(Boolean)

布尔(逻辑)只能有两个值:true 或 false。(当然true也可以表示为真,值为1,false表示为假,值为0) ,比布尔值常用在条件测试中,多用就熟悉了

var a = false; 
console.log(a); //false
console.log(typeof a); //boolean: 表示布尔类型

空(Null)和未定义(Undefined)

Undefined 这个值表示变量不含有值
可以通过将变量的值设置为 null 来清空变量

数组(Array)

数组是由中括号分隔,数组的项目可以是任意类型的值,数字字符串布尔值,对象等

var arr = new Array();
arr[0] = 'x';
arr[1] = 'y';
//或者使用(condensed array) 比如
var arr1 = new Array("x","y")
//或者使用(literal array)
var arr2 = ["x","y"]
//数组下标是基于0的,所以第一个项目是[0],第二个是[1],以此类推

数组的遍历

//for循环
var arr = [11,22,33,44,55];
for (var i=0; i<arr.length; i++){ //i=0,1,2,3,4
	console.log( arr[i] );
}
//for-in循环, 可以遍历数组和对象
for (var i in arr){
	console.log(i); //i是下标, i=0,1,2,3,4
	console.log( arr[i] ); //数组的每一个元素
}

数组的常用方法

push(): 在数组末尾插入元素
pop(): 从数组末尾删除一个元素
shift(): 在数组的前面移除一个元素
unshift(): 在数组的前面添加一个或多个元素
reverse(): 将数组倒序
sort(): 让数组从小到大排序, 升序  排序规则是字符串的比较规则, ASCII码的比较
concat(): 追加数据, 不会改变原数组, 内部会创建一个新数组并返回
slice(): 截取数组的某区域的数据, 不会改变原数组
splice() : 截取数组的某区域的数据, 会改变原数组
join(): 连接数组中的所有元素, 返回一个连接后的字符串

详细请移步  数组操作

对象(Object)

对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔

对象定义

var person = {firstname:'John',lastname:'Doe',id:555}
//上面的例子中的对象obj有三个属性:firstname,lastname,id
//空格和跨行都可以
var person = {
  firstname:'John',
  lastname:'Doe',
  id:555
}

对象属性


可以说 "JavaScript 对象是变量的容器"。
但是,我们通常认为 "JavaScript 对象是键值对的容器"。
键值对通常写法为 name : value (键与值以冒号分割)。
键值对在 JavaScript 对象通常称为 对象属性

访问对象属性

通过两种方式访问对象

//对象属性有两种寻找地址的方式
//1
var lastname = person.lastname
//2
var firstname = person['firstname']

对象方法

对象的方法定义了一个函数,并作为对象的属性存储。
对象方法通过添加 () 调用 (作为一个函数)。
该实例访问了 person 对象的 fullName() 方法

name = person.fullName();

如果你要访问 person 对象的 fullName 属性,它将作为一个定义函数的字符串返回

name = person.fullName

JavaScript 对象是属性和方法的容器
你可以使用以下语法创建对象方法

methodName : function() {
    // 代码 
}

JavaScript数据类型转换

在JavaScript中包括
6种不同的数据类型 string number boolean object function symbol
3中对象类型Object Date Array
2中不包含任何值的数据类型 null undefined

typeof操作符

console.log(typeof "John")                  // 返回 string
console.log(typeof 3.14 )                   // 返回 number
console.log(typeof NaN )                    // 返回 number
console.log(typeof false)                   // 返回 boolean
console.log(typeof [1,2,3,4] )              // 返回 object 
console.log(typeof {name:'John', age:34})   // 返回 object
console.log(typeof new Date())              // 返回 object
console.log(typeof function () {} )         // 返回 function              
console.log(typeof myCar)                   // 返回 undefined (如果 myCar 没有声明)       
console.log(typeof null)                    // 返回 object           
//请注意
//NaN的数据类型是number
//数组的数据类型是object
//日期的数据类型为object
//null的数据类型是object
//未定义的数据类型是undefined
//如果对象是 JavaScript Array 或 JavaScript Date ,我们就无法通过 typeof 来判断他们的类型,因为都是 返回 object

constructor 属性

constructor 属性返回所有 JavaScript 变量的构造函数

"John".constructor                // 返回函数 String()  { [native code] }
(3.14).constructor                // 返回函数 Number()  { [native code] }
false.constructor                 // 返回函数 Boolean() { [native code] }
[1,2,3,4].constructor             // 返回函数 Array()   { [native code] }
{name:'John', age:34}.constructor // 返回函数 Object()  { [native code] }
new Date().constructor            // 返回函数 Date()    { [native code] }
function () {}.constructor        // 返回函数 Function(){ [native code] }
//可以使用 constructor 属性来查看对象是否为数组 (包含字符串 "Array")
function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}
//可以使用 constructor 属性来查看对象是否为日期 (包含字符串 "Date")
function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
}

 将数字转换为字符串

//全局方法String()可以将数字转换为字符串(该方法可用于任何类型的数字,字母,变量,表达式)
var x = 48957
String(x)         // 将变量 x 转换为字符串并返回
String(123)       // 将数字 123 转换为字符串并返回
String(100 + 23)  // 将数字表达式转换为字符串并返回
//Number 方法 toString() 也是有同样的效果
Number(x).toString()
Number(123).toString()
Number(100 + 23).toString()

布尔值转换为字符串

Date()返回字符串
Date() //'Mon May 23 2022 09:50:06 GMT+0800 (中国标准时间)'
//全局方法 String() 可以将日期对象转换为字符串
String(new Date()) //'Mon May 23 2022 09:51:00 GMT+0800 (中国标准时间)'
Date方法---先了解一下
方法	描述
getDate()	从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay()	从 Date 对象返回一周中的某一天 (0 ~ 6)。
getFullYear()	从 Date 对象以四位数字返回年份。
getHours()	返回 Date 对象的小时 (0 ~ 23)。
getMilliseconds()	返回 Date 对象的毫秒(0 ~ 999)。
getMinutes()	返回 Date 对象的分钟 (0 ~ 59)。
getMonth()	从 Date 对象返回月份 (0 ~ 11)。
getSeconds()	返回 Date 对象的秒数 (0 ~ 59)。
getTime()	返回 1970 年 1 月 1 日至今的毫秒数。

console.log((new Date()).getDate())

将字符串转为数组

全局方法Number()可以将字符串转为数字
字符串包含数字(如'3.14')转换为数字(如3.14)
空字符串会转换为0
其他的字符串会转换为NaN(不是数字)

Number("3.14")    // 返回 3.14
Number(" ")       // 返回 0
Number("")        // 返回 0
Number("99 88")   // 返回 NaN
Number()方法
方法	描述
parseFloat()	解析一个字符串,并返回一个浮点数。
parseInt()	解析一个字符串,并返回一个整数。

一元运算符 +  可以用于将变量转换为数字

var y = "5";      // y 是一个字符串
var x = + y;      // x 是一个数字
//如果变量不能转换,它仍然会是一个数字,但值为 NaN (不是一个数字):
var y = "John";   // y 是一个字符串
var x = + y;      // x 是一个数字 (NaN)

将布尔值转换为数字

全局方法 Number() 可将布尔值转换为数字

Number(false)     // 返回 0
Number(true)      // 返回 1

将日期转换位数字

Number(false)     // 返回 0
Number(true)      // 返回 1

将日期转换位数字

日期方法getTime()也有相同的效果

console.log((new Date()).getTime()) //1656399708320

自动转换类型

当 JavaScript 尝试操作一个 "错误" 的数据类型时,会自动转换为 "正确" 的数据类型
 

5 + null    // 返回 5         null 转换为 0
"5" + null  // 返回"5null"   null 转换为 "null"
"5" + 1     // 返回 "51"      1 转换为 "1" 
"5" - 1     // 返回 4         "5" 转换为 5

自动转换为字符串

当你尝试输出一个对象或一个变量时 JavaScript 会自动调用变量的 toString() 方法

document.getElementById("demo").innerHTML = myVar;

myVar = {name:"Fjohn"}  // toString 转换为 "[object Object]"
myVar = [1,2,3,4]       // toString 转换为 "1,2,3,4"
myVar = new Date()      // toString 转换为 "Fri Jul 18 2014 09:08:55 GMT+0200"

数字和布尔值也经常相互转换

数字和布尔值也经常相互转换

原始值	         转换为数字	    转换为字符串	    转换为布尔值
false	             0	        "false"	           false
true	             1	        "true"	           true
0	                 0	        "0"	               false
1	                 1	        "1"	               true
"0"	                 0	        "0"	               true
"000"	             0	        "000"	           true
"1"	                 1	        "1"	               true
NaN	                 NaN	    "NaN"	           false
Infinity	         Infinity	"Infinity"	       true
-Infinity            -Infinity	"-Infinity"	       true
""	                 0	        ""	               false
"20"	             20	        "20"	           true
"Runoob"	         NaN	    "Runoob"	       true
[ ]	                 0	        ""	               true
[20]	             20	        "20"	           true
[10,20]	             NaN	    "10,20"	           true
["Runoob"]           NaN	    "Runoob"	       true
["Runoob","Google"]  NaN        "Runoob,Google"    true	
function(){}         NaN        "function(){}"	   true
{ }	                 NaN	    "[object Object]"  true	
null	             0	        "null"	           false
undefined	         NaN	    "undefined"	       false

JavaScript运算符

运算符 = 用于赋值  运算符 = 用于给 JavaScript 变量赋值
运算符 + 用于加值  算术运算符 + 用于把值加起来

y = 5;
x = 2;
z = x + y
//代码执行后z的值为7

算术运算符

+  加法       x = 5 + 2   结果为7
-  减法       x = 5 - 2   结果为3
*  乘法       x = 5 * 2   结果为10
/  除法       x = 5 / 2   结果为2.5
%  取模(余数)  x = 5 % 2   结果为1
++ 自增       x = ++5     结果为6
             x = 5++      结果为5
-- 自减       x = --5     结果为4
             x = 5--     结果为5

还有就是一些等同的
 

x = y + x 等同于 x += y
x = y - x 等同于 x -= y
x = y * x 等同于 x *= y
x = y / x 等同于 x /= y
x = y % x 等同于 x %= y

+ 运算符用于把文本值或字符串变量加起来(连接起来)
如需把两个或多个字符串变量连接起来,请使用 + 运算符

比较运算符

==(等于)    x==8 返回值false	
===绝对等于(值和类型均相等)  x==="5"  false
!=	         不等于	x!=8	true
!==不绝对等于(值和类型有一个不相等,或两个都不相等)x!=="5" true
x!==5	false	
>	 大于	x>8	false	
<	 小于	x<8	true	
>=	 大于或等于	x>=8	false	
<=	 小于或等于

比较运算符用来比较两个值是否相等,如果相等会返回true,否则返回false。

使用 == 来做相等运算
当使用==来比较两个值时,如果值的类型不同,则会自动进行类型转换,将其转换为相同的类型,然后在比较
使用 != 来做不相等运算
不相等用来判断两个值是否不相等,如果不相等返回true,否则返回false,不相等也会对变量进行自动的类型转换,如果转换后相等它也会返回false
使用 === 来做全等运算
用来判断两个值是否全等,它和相等类似,不同的是它不会做自动的类型转换,如果两个值的类型不同,直接返回false
使用 !== 来做不全等运算
用来判断两个值是否不全等,它和不等类似,不同的是它不会做自动的类型转换,如果两个值的类型不同,直接返回true

逻辑运算符

&&	and	(x < 10 && y > 1) 为 true
||	or	   (x==5 || y==5) 为 false
!	not	!(x==y) 为 true

&& 与:&&可以对符号两侧的值进行与运算并返回结果,运算规则如下:
两个值中只要有一个值为false,就返回false,只有两个值都为true时,才会返回true
JS中的“与”属于短路的与,如果第一个值为false,则不会检查第二个值
非布尔值时:如果两个都为true,则返回第二个值,如果两个值中有false,则返回靠前的false的值
|| 或:||可以对符号两侧的值进行或运算并返回结果,运算规则如下:
两个值中只要有一个true,就返回true,只有两个值都为false,才会返回false
JS中的“或”属于短路的或,如果第一个值为true,则不会检查第二个值
非布尔值时:如果两个都为false ,则返回第二个值,如果两个值中有true,则返回靠前的true的值
! 非:!可以用来对一个值进行非运算,所谓非运算就是对一个布尔值进行取反操作,true变false,false变true,运算规则如下:
如果对一个值进行两次取反,它不会变化
非布尔值时:先会将其转换为布尔值,然后再取反,所以我们可以利用该特点,来将一个其它的数据类型转换为布尔值,可以为一个任意数据类型取两次反,来将其转换为布尔值,原理和Boolean()函数一样

条件运算符(三目运算)

JavaScript 还包含了基于某些条件对变量进行赋值的条件运算符

语法:

var iablename = (condition) ? value1 : value2;

举例:

result = (age<18) ? "年龄太小" : "年龄合适";

执行流程:如果condition为true,则执行语句1,并返回执行结果,如果为false,则执行语句2,并返回执行结果

JavaScript语句

条件语句

条件语句用于基于不同的的条件来执行不同的动作
通常在写代码是,需要为不同的决定来执行不同的动作,在 JavaScript 中,我们可使用以下条件语句
if语句  只有当指定条件为true时候,使用该语句来执行代码
if....else语句  当条件为true是执行代码,当条件为false时执行其他代码
if....else if....else  选择多个代码之一来执行
switch 选择多个代码之一来执行

if语句

if(condition){
    当条件为true时执行的代码
}
if(var i < 100){
    console.log(i)//当变量i小于100时打印出变量i的值
}

请注意,在这个语法中,没有 ..else..。您已经告诉浏览器只有在指定条件为 true 时才执行代码

if....else语句

请使用 if....else 语句在条件为 true 时执行代码,在条件为 false 时执行其他代码

if(condition){
    当条件为true时执行的代码
}else{
    当条件为false时执行的代码
}

if(var i < 100){
    console.log(i)//当变量i小于100时打印出变量i的值
}else{
    console.log('变量i的值不满足条件')当变量i的值大于等于100时打印出'变量i的值不满足条件'
}

if....else if....else语句

使用 if....else if...else 语句来选择多个代码块之一来执行

if (condition1)
{
    当条件 1 为 true 时执行的代码
}
else if (condition2)
{
    当条件 2 为 true 时执行的代码
}
else
{
  当条件 1 和 条件 2 都不为 true 时执行的代码
}

if(var i < 100){
    console.log(i)//当变量i小于100时打印出变量i的值
}else if(i >= 100 && i < 200){
    console.log('变量i的值不满足条件')当变量i的值大于等于100并且小于200时打印出'变量i的值不满足条件'
}else{
    console.log('其他条件')//当不满足条件1和条件2时,打印出'其他条件'
}

switch 语句

switch 语句用于基于不同的条件来执行不同的动作
请使用 switch 语句来选择要执行的多个代码块之一

switch(n)
{
    case 1:
        执行代码块 1
        break;
    case 2:
        执行代码块 2
        break;
    default:
        与 case 1 和 case 2 不同时执行的代码
}
//工作原理:首先设置表达式 n(通常是一个变量)。随后表达式的值会与结构中的每个 case 的
//值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。请使用 break 来阻止代码自
//动地向下一个 case 运行

实例:显示今天的星期名称。请注意 Sunday=0, Monday=1, Tuesday=2, 等等

var d = new Date().getDay(); 
switch (d){ 
  case 0:x="今天是星期日"; 
  break; 
  case 1:x="今天是星期一"; 
  break; 
  case 2:x="今天是星期二"; 
  break; 
  case 3:x="今天是星期三"; 
  break; 
  case 4:x="今天是星期四"; 
  break; 
  case 5:x="今天是星期五"; 
  break; 
  case 6:x="今天是星期六"; 
  break; 
}

default关键词

请使用 default 关键词来规定匹配不存在时做的事情

实例:如果今天不是星期六或星期日,则会输出默认的消息

var d=new Date().getDay();
switch (d)
{
    case 6:x="今天是星期六";
    break;
    case 0:x="今天是星期日";
    break;
    default:
    x="期待周末";
}
document.getElementById("demo").innerHTML=x;

循环语句

不同类型的循环
JavaScript 支持不同类型的循环:
for - 循环代码块一定的次数
for/in - 循环遍历对象的属性
while - 当指定的条件为 true 时循环指定的代码块
do/while - 同样当指定的条件为 true 时循环指定的代码块

while循环

while (条件)
{
    需要执行的代码
}
//只要变量i的值小于5,循环将继续执行下去
while (i<5)
{
    x=x + "The number is " + i + "<br>";
    i++;
}

do/while 循环

do/while 循环是 while 循环的变体。该循环会在检查条件是否为真之前执行一次代码块,然后如果条件为真的话,就会重复这个循环

do
{
    需要执行的代码
}
while (条件);
//该循环至少会执行一次,及时条件为false她也会执行一次,因为代码块会在条件被测试前执行
do
{
    x=x + "The number is " + i + "<br>";
    i++;
}
while (i<5);

for循环

循环可以将代码块执行指定的次数
如果希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的。
我们可以这样输出数组的值

//一般写法
document.write(cars[0] + "<br>"); 
document.write(cars[1] + "<br>"); 
document.write(cars[2] + "<br>"); 
document.write(cars[3] + "<br>"); 
document.write(cars[4] + "<br>"); 
document.write(cars[5] + "<br>");
//使用for循环
for (var i=0;i<cars.length;i++){ 
    document.write(cars[i] + "<br>");
}

for 循环是您在希望创建循环时常会用到的工具
for循环语法

for (语句 1; 语句 2; 语句 3){
    被执行的代码块
}

语句 1 (代码块)开始前执行
语句 2 定义运行循环(代码块)的条件
语句 3 在循环(代码块)已被执行之后执行

实例

for (var i = 0; i < 5; i++){
      x = x + "该数字为 " + i + "<br>";
}
//从上面的例子中,您可以看到:
//Statement 1 在循环开始之前设置变量 (var i=0)。
//Statement 2 定义循环运行的条件(i 必须小于 5)。
//Statement 3 在每次代码块已被执行后增加一个值 (i++)。

for/in循环

JavaScript for/in 语句循环遍历对象的属性

var person={fname:"Bill",lname:"Gates",age:56}; 
 
for (x in person)  // x 为属性名
{
    txt=txt + person[x];
}

break 语句

break 语句它用于跳出 switch() 语句
break 语句可用于跳出循环
break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话)

for (i=0;i<10;i++)
{
    if (i==3)
    {
        break;
    }
    x=x + "The number is " + i + "<br>";
}

由于这个 if 语句只有一行代码,所以可以省略花括号

for (i=0;i<10;i++)
{
    if (i==3) break;
    x=x + "The number is " + i + "<br>";
}

continue 语句

continue 语句中断当前的循环中的迭代,然后继续循环下一个迭代。 以下例子在值为 3 时,直接跳过

for实例

for (i=0;i<=10;i++)
{
    if (i==3) continue;
    x=x + "The number is " + i + "<br>";
}

while实例

while (i < 10){
  if (i == 3){
    i++;    //加入i++不会进入死循环
    continue;
  }
  x= x + "该数字为 " + i + "<br>";
  i++;
}

JavaScript 函数

函数定义

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块
JavaScript 函数语法
函数就是包裹在花括号中的代码块,前面使用了关键词 function

语法

function functionname()
{
    // 执行代码
}

当调用该函数时,会执行函数内的代码
可以在某事件发生时直接调用函数(比如当用户点击按钮时),并且可由 JavaScript 在任何位置进行调用

JavaScript 对大小写敏感。关键词 function 必须是小写的,并且必须以与函数名称相同的大小写来调用函数

调用带参数的函数

在调用函数时,可以向其传递值,这些值被称为参数
这些参数可以在函数中使用
可以发送任意多的参数,由逗号 (,) 分隔

myFunction(argument1,argument2)

当声明函数时,请把参数作为变量来声明

function myFunction(var1,var2)
{
  代码
}

变量和参数必须以一致的顺序出现。第一个变量就是第一个被传递的参数的给定的值,以此类推

<p>点击这个按钮,来调用带参数的函数。</p>
<button onclick="myFunction('Harry Potter','Wizard')">点击这里</button>
<script>
function myFunction(name,job){
    alert("Welcome " + name + ", the " + job);
}
</script>

上面的函数在按钮被点击时会提示 "Welcome Harry Potter, the Wizard"
函数很灵活,可以使用不同的参数来调用该函数,这样就会给出不同的消息

<button onclick="myFunction('Harry Potter','Wizard')">点击这里</button>
<button onclick="myFunction('Bob','Builder')">点击这里</button>

根据点击的不同的按钮,上面的例子会提示 "Welcome Harry Potter, the Wizard" 或 "Welcome Bob, the Builder"

带有返回值的函数

有时,我们会希望函数将值返回调用它的地方
通过使用 return 语句就可以实现
在使用 return 语句时,函数会停止执行,并返回指定的值
语法

function myFunction()
{
    var x=5;
    return x;
}

上面的函数会返回值 5

注意:整个 JavaScript 并不会停止执行,仅仅是函数。JavaScript 将继续执行代码,从调用函数的地方,函数调用将被返回值取代

var myVar=myFunction();

myVar 变量的值是 5,也就是函数 "myFunction()" 所返回的值
即使不把它保存为变量,您也可以使用返回值

document.getElementById("demo").innerHTML=myFunction();

"demo" 元素的 innerHTML 将成为 5,也就是函数 "myFunction()" 所返回的值
可以使返回值基于传递到函数中的参数

实例

计算两个数字的乘积,并返回结果

function myFunction(a,b)
{
    return a*b;
}
 
document.getElementById("demo").innerHTML=myFunction(4,3);

在仅仅希望退出函数时 ,也可使用 return 语句。返回值是可选的

function myFunction(a,b)
{
    if (a>b)
    {
        return;
    }
    x=a+b
}

如果 a 大于 b,则上面的代码将退出函数,并不会计算 a 和 b 的总和

局部 JavaScript 变量

在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它。(该变量的作用域是局部的)
可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量。
只要函数运行完毕,本地变量就会被删除

全局 JavaScript 变量

在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它

 JavaScript 变量的生存期

JavaScript 变量的生命期从它们被声明的时间开始
局部变量会在函数运行以后被删除
全局变量会在页面关闭后被删除

向未声明的 JavaScript 变量分配值

如果把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性
这条语句
 

carname="Volvo";

将声明 window 的一个属性 carname
非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除

var var1 = 1; // 不可配置全局属性
var2 = 2; // 没有使用 var 声明,可配置全局属性

console.log(this.var1); // 1
console.log(window.var1); // 1
console.log(window.var2); // 2

delete var1; // false 无法删除
console.log(var1); //1

delete var2; 
console.log(delete var2); // true
console.log(var2); // 已经删除 报错变量未定义

JavaScript 作用域

作用域是可访问变量的集合

在 JavaScript 中, 对象和函数同样也是变量

在 JavaScript 中, 作用域为可访问变量,对象,函数的集合

JavaScript 函数作用域: 作用域在函数内修改

JavaScript 局部作用域

变量在函数内声明,变量为局部变量,具有局部作用域

局部变量:只能在函数内部访问

实例

// 此处不能调用 carName 变量
function myFunction() {
    var carName = "Volvo";
    // 函数内可调用 carName 变量
}

如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量

以下实例中 carName 在函数内,但是为全局变量

// 此处可调用 carName 变量
 
function myFunction() {
    carName = "Volvo";
    // 此处可调用 carName 变量
}

JavaScript 变量生命周期

JavaScript 变量生命周期在它声明时初始化

局部变量在函数执行完毕后销毁

全局变量在页面关闭后销毁

函数参数

函数参数只在函数内起作用,是局部变量

HTML 中的全局变量

在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象

JS函数递归

递归函数:是指函数直接或间接调用自身函数本身,则该函数为递归函数

function fun(){
    console.log("函数 fun 是递归函数。");
    fun();
}

fun 函数就是一个递归函数。
但是把这个函数拿到浏览器上运行的时候,内存会溢出,因为递归函数成为一个死循环。递归函数没有停止处理或运算的出口

使用递归函数必须要符合两个条件:

1、 自己调用自己
2、必须有一个终止处理或计算的出口,让函数结束调用函数自身

实例
求1到100的和

function sum(n){
    if(n==1) return 1;
    return sum(n-1) + n;
}
var result = sum(100);
console.log(result); // 5050

JavaScript 事件

HTML 事件是发生在 HTML 元素上的事情

当在 HTML 页面中使用 JavaScript 时, JavaScript 可以触发这些事件

HTML 事件

HTML 事件可以是浏览器行为,也可以是用户行为

以下是 HTML 事件的实例:

  • HTML 页面完成加载
  • HTML input 字段改变时
  • HTML 按钮被点击

通常,当事件发生时,你可以做些事情

在事件触发时 JavaScript 可以执行一些代码

HTML 元素中可以添加事件属性,使用 JavaScript 代码来添加 HTML 元素

单引号:

<some-HTML-element some-event='JavaScript 代码'>

双引号:

<some-HTML-element some-event="JavaScript 代码">

实例:

<button onclick="getElementById('demo').innerHTML=Date()">现在的时间是?</button>

以上实例中,JavaScript 代码将修改 id="demo" 元素的内容

在下一个实例中,代码将修改自身元素的内容 (使用 this.innerHTML):

<button onclick="this.innerHTML=Date()">现在的时间是?</button>
JavaScript代码通常是几行代码。比较常见的是通过事件属性来调用

常见的HTML事件

事件描述
onchangeHTML 元素改变
onclick用户点击 HTML 元素
onmouseover鼠标指针移动到指定的元素上时发生
onmouseout用户从一个 HTML 元素上移开鼠标时发生
onkeydown用户按下键盘按键
onload浏览器已完成页面的加载

更多常见的事件列表,可以去参考 HTML DOM事件

JavaScript 可以做什么?

事件可以用于处理表单验证,用户输入,用户行为及浏览器动作:

  • 页面加载时触发事件
  • 页面关闭时触发事件
  • 用户点击按钮执行动作
  • 验证用户输入内容的合法性
  • 等等 ...

可以使用多种方法来执行 JavaScript 事件代码:

  • HTML 事件属性可以直接执行 JavaScript 代码
  • HTML 事件属性可以调用 JavaScript 函数
  • 你可以为 HTML 元素指定自己的事件处理程序
  • 你可以阻止事件的发生
  • 等等 ...

JavaScript this 关键字

面向对象语言中 this 表示当前对象的一个引用

但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变

  • 在方法中,this 表示该方法所属的对象
  • 如果单独使用,this 表示全局对象
  • 在函数中,this 表示全局对象
  • 在函数中,在严格模式下,this 是未定义的(undefined)
  • 在事件中,this 表示接收事件的元素
  • 类似 call() 和 apply() 方法可以将 this 引用到任何对象

实例:

var person = {
  firstName: "John",
  lastName : "Doe",
  id       : 5566,
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
};

方法中的 this

在对象方法中, this 指向调用它所在方法的对象

在上面一个实例中,this 表示 person 对象

fullName 方法所属的对象就是 person

fullName : function() {
  return this.firstName + " " + this.lastName;
}

单独使用 this

单独使用 this,则它指向全局(Global)对象

在浏览器中,window 就是该全局对象为 [object Window]

var x = this

严格模式下,如果单独使用,this 也是指向全局(Global)对象

"use strict";
var x = this;

函数中使用 this(默认)

在函数中,函数的所属者默认绑定到 this 上

在浏览器中,window 就是该全局对象为 [object Window]:

function myFunction() {
  return this;
}

函数中使用 this(严格模式)

严格模式下函数是没有绑定到 this 上,这时候 this 是 undefined

"use strict";
function myFunction() {
  return this;
}

事件中的 this

在 HTML 事件句柄中,this 指向了接收事件的 HTML 元素

<button onclick="this.style.display='none'">
点我后我就消失了
</button>

对象方法中绑定

下面实例中,this 是 person 对象,person 对象是函数的所有者

var person = {
  firstName  : "John",
  lastName   : "Doe",
  id         : 5566,
  myFunction : function() {
    return this;
  }
};
var person = {
  firstName: "John",
  lastName : "Doe",
  id       : 5566,
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
};

说明: this.firstName 表示 this (person) 对象的 firstName 属性

显式函数绑定

在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象

在下面实例中,当我们使用 person2 作为参数来调用 person1.fullName 方法时, this 将指向 person2, 即便它是 person1 的方法

var person1 = {
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
}
var person2 = {
  firstName:"John",
  lastName: "Doe",
}
person1.fullName.call(person2);  // 返回 "John Doe"

JavaScript 正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式

搜索模式可用于文本搜索和文本替换

什么是正则表达式?​​​​​​​

正则表达式是由一个字符序列形成的搜索模式

当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容

正则表达式可以是一个简单的字符,或一个更复杂的模式

正则表达式可用于所有文本搜索和文本替换的操作

语法

/正则表达式主体/修饰符(可选)

其中修饰符是可选的

实例:

var patt = /runoob/i

实例解析:

/runoob/i  是一个正则表达式。

runoob  是一个正则表达式主体 (用于检索)。

i  是一个修饰符 (搜索不区分大小写)。

使用字符串方法

在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

replace() 方法用于在字符串中用一些字符串替换另一些字符串,或替换一个与正则表达式匹配的子串。

search() 方法使用正则表达式

使用正则表达式搜索 "Runoob" 字符串,且不区分大小写

var str = "Visit Runoob!"; 
var n = str.search(/Runoob/i);

输出结果为6

search() 方法使用字符串

search 方法可使用字符串作为参数。字符串参数会转换为正则表达式

检索字符串中 "Runoob" 的子串

var str = "Visit Runoob!"; 
var n = str.search("Runoob");

replace() 方法使用正则表达式

使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob

var str ='Visit Microsoft!'
var txt = str.replace(/microsoft/i,"Runoob");

输出结果为  Visit Runoob!

replace() 方法使用字符串

replace() 方法将接收字符串作为参数

var str ='Visit Microsoft!'
var txt = str.replace("Microsoft","Runoob")

注意

正则表达式参数可用在以上方法中 (替代字符串参数)。
正则表达式使得搜索功能更加强大(如实例中不区分大小写)

正则表达式修饰符

修饰符 可以在全局搜索中不区分大小写:

修饰符描述
i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m执行多行匹配。

正则表达式模式

方括号用于查找某个范围内的字符:

表达式描述
[abc]查找方括号之间的任何字符。
[0-9]查找任何从 0 至 9 的数字。
(x|y)查找任何以 | 分隔的选项。

元字符是拥有特殊含义的字符:

元字符描述
\d查找数字。
\s查找空白字符。
\b匹配单词边界。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。

量词:

量词描述
n+匹配任何包含至少一个 n 的字符串。
n*匹配任何包含零个或多个 n 的字符串。
n?匹配任何包含零个或一个 n 的字符串。

使用 RegExp 对象

在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象

test() 方法是一个正则表达式方法

test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false

以下实例用于搜索字符串中的字符 "e"

var patt = /e/;
patt.test("The best things in life are free!");

意思就是  变量patt 在test后面的字符串"The best things in life are free!"中去匹配e,所以实力输出为 true

也可以不用设置正则表达式的变量,以上两行代码可以合并为一行:

/e/.test("The best things in life are free!")

使用 exec()

exec() 方法是一个正则表达式方法

exec() 方法用于检索字符串中的正则表达式的匹配

该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null

以下实例用于搜索字符串中的字母 "e"

/e/.exec("The best things in life are free!");

也是去匹配是否含有e 返回为true

虽然感觉写的过于简单,感觉挺适合初学者的

暂时第一篇就告一段落了,期待下篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值