文章目录
- JavaScript中的函数
- JavaScript中的作用域
- JavaScript中的预解析
- JavaScript中的对象
- JavaScript中的内置对象
- JavaScript中的简单/复杂数据类型
JavaScript中的函数
函数的声明语法:
- 命名函数声明:
function 函数名(参数列表) {函数体}
。参数列表中的形参并不需要指定数据类型。 - 匿名函数声明:
var 变量名 = function(参数列表) {函数体}
。
函数的实参和形参个数不匹配:
- 实参个数多于形参个数:多出来的实参并不会参与函数的运算。
- 实参个数小于形参个数:没有赋值的形参将会变成
undefined
。
arguments的使用:
- 当不确定需要给函数传入多少个参数时,可以使用
arguments
来获取。arguments
实际上时当前函数的一个内置伪数组对象,存储了传递给函数的所有实参。 - 伪数组是指一种具有部分数组特点的对象。它具有和数组一样的
length
属性,可以通过索引访问元素,但是没有真正数组的一些方法。
JavaScript中的作用域
全局作用域和局部作用域:全局作用域是指整个JS源代码文件都有效,局部作用域是指在某个函数内有效。对应这两个作用域的分别是全局变量和局部变量,和其他编程语言中的概念相同。
- 另外一种全局变量:在函数内部未声明就直接赋值的变量也属于全局变量。
- 没有块作用域:JS中没有块作用域,也就是在一对花括号中的作用域。
JavaScript中的预解析
- JavaScript代码是由浏览器中的JavaScript解析器来执行的,它在运行JS代码时分为预解析和代码执行两部分。
- 预解析可以分为变量预解析和函数预解析两部分。
- 在预解析部分,JS引擎会把JS代码中所有的变量和函数声明(不包括变量的初始化)提升到当前作用域的最前面;接下来,才会按照剩余代码的书写顺序从上往下依次执行。
JavaScript中的对象
创建一个对象:
- 使用字面量创建一个对象:使用一对花括号创建一个对象即可,具体语法为:
var 对象名 = {属性1: 属性值1, 属性2: 属性值2......方法名: function(参数列表) {函数体}......}
。 - 使用new关键字创建一个对象:
new Object()
。这行代码创建了一个空的对象。然后,可以通过对象名.属性名
和对象名.方法名
的方式为该对象添加属性和方法。 - 利用构造函数创建一个对象:
- 声明一个构造函数:
function 构造函数名(参数列表) {函数体}
,函数体中可以使用this.属性名 = 属性值
和this.方法名 = function 方法名(参数列表) {函数体}
的方式来初始化对象的属性和声明对象的方法。- 注意事项1:构造函数名的首字母要大写。
- 注意事项2:构造函数中不能使用
return
关键字。 - new关键字的执行过程:
new
关键字被使用时,首先会在内存中创建一个空的对象,然后this
就会指向该空对象,接下来就会执行构造函数中的代码,给这个空对象添加属性和方法,最后返回这个对象。
- 调用一个构造函数:
var 变量名 = new 构造函数名(参数列表);
。
- 声明一个构造函数:
使用对象:
- 调用对象的属性:一种语法是
对象名.属性名
,另外一种语法是对象名[属性名]
(类似于字典的使用方法)。 - 调用对象的方法:语法只有一种:
对象名.方法名(参数列表)
。
遍历对象:使用扩展的for
循环可以便利对象中的属性名,语法为:for(var 循环变量名 in 对象名)
。对象的属性名也就是字典中的键,可以使用该键来获取该属性名对应的属性值。
JavaScript中的内置对象
JS中的对象分类:JS中的对象可以分为自定义对象、内置对象和浏览器对象三大类。前两种属于JS的基础内容,即包含在ECMAScript
中,浏览器对象是JS中特有的,将会在后面进行讲解。
内置对象的概念:JS中自带的一些可供开发者使用的对象,提供了一些常用或基本的属性和方法。
Math对象的基本操作:
- Math.PI:表示圆周率。
- Math.max()/min():求一组数据中的最大值或最小值。如果没有传入参数则会分别返回
Infinity
和-Infinity
。 - Math.floor()和Math.ceil():分别表示向下取整和向上取整。
- Math.round():表示四舍五入就近取整。
- Math.abs():用于求数字的绝对值。
- Math.random():获取一个0到1之间的随机浮点数(不包括1)。基于该函数可以生成一个指定区间内的随机整数。
Date对象的基本操作:
- 创建一个Date对象:
var 对象名 = new Date()
。可以通过Console.log
输出该对象,输出的内容是当前的时间。- 指定对象的时间:可以在创建
Date
对象时传入参数字符串,例如"2024-9-19
"或"2024/10/19
"。
- 指定对象的时间:可以在创建
- 获取Date对象的各个部分:可以分别使用
getFullYear()
、getMonth()
、getDate()
、getDay()
、getHours()
、getMinutes()
和getSeconds()
方法获取当前Date对象的年份、月份(0-11)、日期、星期(0-6)、小时、分钟和秒钟。 - 获取时间戳:对于支持H5的浏览器,可以使用Date对象的
now()
方法获取时间戳,即1970年1月1日零点到现在的总毫秒数。
Array对象的基本操作:
- 创建数组:使用语句
var 数组名 = new Array()
可以创建一个空数组,如果传入一个整数作为参数,表示创建一个具有指定个空元素的空数组。 - 检测一个变量是否为数组:
- 使用instanceof运算符:使用语法为
变量名 instanceof 数据类型
,可以用于检测某个变量是否属于某种数据类型,返回值是布尔类型。 - 使用Array.isArray函数:使用语法为
Array.isArray(变量名)
,返回值也是一个布尔值。这个方法是H5新增的方法,只有IE9以上版本的浏览器才能支持。
- 使用instanceof运算符:使用语法为
- 向数组中添加元素:
- 从数组的末尾添加:
数组名.push(元素1, 元素2....)
。该方法会返回新数组的长度。 - 从数组的开头添加:
数组名.unshift(元素1, 元素2....)
。该方法也会返回新数组的长度。
- 从数组的末尾添加:
- 删除数组中的元素:
- 删除末尾元素:
数组名.pop()
。该函数返回被删除的元素。 - 删除首个元素:
数组名.shift()
。该函数也返回被删除的元素。
- 删除末尾元素:
- 翻转数组中的元素:
数组名.reverse()
。 - 数组元素排序:
数组名.sort()
。该函数中可以传入一个函数的定义,用于指定排序方式。例如,传入function(a,b) { return a - b;}
即表示升序排列。 - 获取指定元素的索引:
- 从前往后查找第一个:
数组名.indexOf(数组元素)
。如果元素不存在则返回-1
。 - 从后往前查找第一个:
数组名.lastIndexOf(数组元素)
。如果元素不存在也是返回-1
。
- 从前往后查找第一个:
- 将数组转换为字符串:
- 使用toString()方法:
数组名.toString()
。该方法可以将数组中的元素用逗号分隔,然后作为一个字符串返回。 - 使用join方法:
数组名.join(分隔符)
。该方法可以指定分隔符,而不是像toString
方法那样只能使用固定的分隔符。
- 使用toString()方法:
- 数组的连接:可以使用数组的
concat
方法来将两个或多个数组连接成为一个数组。 - 数组的截取:可以使用数组的
slice
方法对数组中的部分内容进行截取。
字符串数据类型:
- 基本包装数据类型的概念:JS中会自动将一些简单的数据类型包装成为复杂的数据类型,这样就让基本数据类型有了属性和方法,使得这些数据类型更加便于操作。JS中对
String
、Number
和Boolean
三种简单数据类型进行了包装。 - 字符串的不可变性:任何一个地址存储的字符串的值都不可变,每次对字符串变量的值进行修改,实际是在内存中开辟了一个新的空间存放新的字符串值。因此,在JS中最好不要对同一个字符串变量进行多次赋值,这样会占用大量内存空间。
- 字符串的常用操作:
- 查找指定字符的位置:可以通过字符串对象的
indexOf()
函数求一个字符在字符串中出现的首个位置,如果没有找到则返回-1
。 该函数可以传入两个参数,分别是需要查找的字符和开始查找的位置索引。另外,还可以通过lastIndexOf()
函数进行反向查找。 - 获取指定位置的字符:
- 可以通过
charAt()
方法获取字符串中指定位置的字符,传入的参数是位置索引。在HTML5中,可以使用和Python一样的字符串索引来获取字符串中指定位置的字符。 - 可以通过
charCodeAt()
方法获取字符串中指定位置字符对应的ASCII码值。
- 可以通过
- 连接多个字符串:可以通过
concat(str1, str2, str3...)
函数来连接多个字符串。 但是,一种更常用的方式是通过+
运算符来连接多个字符串。 - 获取一个字符串的子串:可以通过字符串的
substr()
方法获取一个字符串的子串。该函数的输入参数分别是子串的起始位置和子串的长度。 - 替换字符串中的部分子串:可以通过字符串的replace()方法来替换字符串中的部分子串。该函数的输入参数分别是被替换的字符和替换的字符。但是,该字符串只是对从前往后满足条件的第一个字符进行替换,在后面学习了正则表达式之后我们会有更好的方法来替换子串。
- 将字符串转换为数组:可以通过字符串的
split(分隔符)
方法获取一个数组,该数组中的每个元素是原始字符串中被分隔符分开的多个部分。
- 查找指定字符的位置:可以通过字符串对象的
JavaScript中的简单/复杂数据类型
- 变量存储内容不同:简单数据类型(基本数据类型)在存储时变量中存储的是值本身,因此也被称为值类型;复杂数据类型在存储时变量中仅仅存储地址,因此也被称为引用数据类型。
- 内存存放位置不同:简单数据类型存储在栈上,复杂数据类型存储在堆中。如果将复杂数据类型的变量作为参数传递给函数,在函数中对其进行了修改,则函数外该变量的值也会发生变化。