js的引用类型(详细)

本文详细介绍了JavaScript的引用类型,包括Object、Array、Date、RegExp和Function。Array的常用方法如indexOf()、lastIndexOf()、concat()、slice()等,以及如何创建和操作数组。Date类型介绍了创建日期对象和获取日期的方法。RegExp类型讨论了正则表达式的模式和实例属性、方法。Function类型解释了函数对象的属性和方法,如arguments和this。最后提到了基本包装类型String的特性和方法,如charAt()、trim()和字符串操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object类型

创建 Object 实例的方式有两种:
第一种是使用new 操作符后跟 Object 构造函数,如下所示:

// 第一种
var person = new Object();
person.name = "seven";
person.age = 23;

另一种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。下面这个例子就使用了对象字面量语法定义了与前面那个例子中相同的

//第二种(注意使用**逗号**分隔不同属性)
person 对象:
var person = {
	name : "seven",
	age : 23
};

Array类型

ECMAScript 数组的每一项可以保存任何类型的数据。例如,可以用数组的第一个位置来保存字符串,用第二位置来保存数值。而且,ECMAScript 数组的大小是可以动态调整的,可以随着数据的添加自动增长以容纳新增数据。
创建数组的基本方式有两种。第一种是使用 Array 构造函数,如下面的代码所示。

var colors = new Array();

创建数组的第二种基本方式是使用数组字面量表示法。数组字面量由一对包含数组项的方括号表示,多个数组项之间以逗号隔开,如下所示:

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
var names = []; // 创建一个空数组

数组的一些方法:

1.检测方法:instanceof()和 isArray()方法;前者假定只有一个全局执行环境,后者不管它是在哪个全局执行环境中创建的。
2.转换方法: toString() 方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串; valueOf() 方法返回的是数组; join() 方法使用不同的分隔符来构建这个字符串。 join() 方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串
3.栈方法: push() 和 pop() 方法来实现类似栈的行为。push() 方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。pop() 方法则从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项
4.队列方法:由于上述的 push() 是向数组末端添加项的方法,因此要模拟队列只需一个从数组前端取得项的方法。实现这一操作的数组方法就是 shift() ,它能够移除数组中的第一个项并返回该项,同时将数组长度减 1。结合使用 shift() 和 push() 方法,可以像使用队列一样使用数组。
5.重排序方法:数组存在两个可以直接用来重排序的方法: reverse() 和 sort() ,在默认情况下,前者是用来反转数组原有的顺序,而 sort() 方法按升序排列数组项。 sort() 方法会根据测试字符串的结果改变原来的顺序。比如数值 5 虽然小于 10,但在进行字符串比较时, “10” 则位于 “5” 的前面。因此 sort() 方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的例子:

function compare(value1, value2) {
if (value1 < value2) {
	return -1;
	} else if (value1 > value2) {
		return 1;
	} else {
	return 0;
	}
}

6.操作方法:
concat() 方法可以基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。

  • 没有给 concat() 方法传递参数的情况下,它只是复制当前数组并返回副本。
  • 如果传递给 concat() 方法的是一或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中。
  • 如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾。

slice() 方法能够基于当前数组中的一或多个项创建一个新数组。 slice() 方法可以接受一两个参数,即要返回项的起始和结束位置。

  • 在只有一个参数的情况下, slice() 方法返回从该参数指定位置开始到当前数组末尾的所有项。
  • 如果有两个参数,该方法返回起始和结束位置之间的项—
    —但不包括结束位置的项.

注意, slice() 方法不会影响原始数组.

splice() 的主要用途是向数组的中部插入项,但使用这种方法的方式则有如下 3 种。
删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。例如, splice(0,2) 会删除数组中的前两项。
 插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如,
splice(2,0,“red”,“green”) 会从当前数组的位置 2 开始插入字符串 “red” 和 “green” 。
 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice (2,1,“red”,“green”) 会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串"red" 和 “green” 。

7.位置方法: indexOf() 和 lastIndexOf() 。这两个方法都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, indexOf() 方法从数组的开头(位置 0)开始向后查找; lastIndexOf() 方法则从数组的末尾开始向前查找。
8.迭代方法 共五个方法,每个方法都接收两个参数:在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响 this 的值。传入这些方法中的函数会接收三个参数:数组项的值**、该项在数组中的位置数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。以下是这 5 个迭代方法的作用:
 every() :对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回 true 。
 filter() :对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。
 forEach() :对数组中的每一项运行给定函数。这个方法没有返回值。
 map() :对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
 some() :对数组中的每一项运行给定函数,如果该函数对任一项返回 true ,则返回 true 。
以上方法都不会修改数组中的包含的值。
9.归并方法
reduce() 方法从数组的第一项开始,逐个遍历到最后。
reduceRight() 则从数组的最后一项开始,向前遍历到第一项。
这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。传给 reduce() 和 reduceRight() 的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。
使用 reduce() 方法可以执行求数组中所有值之和的操作,比如:

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum); //15

Date类型

要创建一个日期对象,使用 new 操作符和 Date 构造函数即可,如下所示。

var now = new Date();

在调用 Date 构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和时间。若根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数(即从 UTC 时间 1970 年 1 月 1 日午夜起至该日期止经过的毫秒数)。为了简化这一计算过程,ECMAScript 提供了两个方法: Date.parse()和 Date.UTC() 。
其中, Date.parse() 方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。若该字符串不能表示日期,那么它会返回 NaN 。实际上,如果直接将表示日期的字符串传递给 Date 构造函数,也会在后台调用Date.parse() 。
Date.UTC() 方法同样也返回表示日期的毫秒数,但它与 Date.parse() 在构建值时使用不同的信息。 Date.UTC() 的参数分别是年份、基于 0 的月份(一月是 0,二月是 1,以此类推)、月中的哪一天(1 到 31)、小时数(0 到 23)、分钟、秒以及毫秒数。
下表是日期/时间方法:
日期/时间组件方法

RegExp类型

ECMAScript 通过 RegExp 类型来支持正则表达式。使用下面类似 Perl 的语法,就可以用字面量形式来定义的正则表达式创建一个正则表达式。

var expression = / pattern / flags ;

其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列 3 个标志。
g :表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
i :表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
m :表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
此外,还可以使用RegExp 构造函数,它接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。如下所示:

/*
* 匹配第一个"bat"或"cat",不区分大小写
*/
var pattern1 = /[bc]at/i;
/*
* 与 pattern1 相同,只不过是使用构造函数创建的
*/
var pattern2 = new RegExp("[bc]at", "i");

c此外,由于 RegExp 构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有元字符都必须双重转义,那些已经转义过的字符也是如此,例如 \n (字符\在字符串中通常被转义为\,而在正则表达式字符串中就会变成\\)。下表给出了一些模式,左边是这些模式的字面量形式,右边是使用 RegExp 构造函数定义相同模式时使用的字符串。
 RegExp转义字符

RegExp 实例属性

 global :布尔值,表示是否设置了 g 标志。
 ignoreCase :布尔值,表示是否设置了 i 标志。
 lastIndex :整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
 multiline :布尔值,表示是否设置了 m 标志。
 source :正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

RegExp 实例方法

RegExp 对象的主要方法是 exec() ,该方法是专门为捕获组而设计的。exec() 接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组:返回的数组虽然是 Array 的实例,但包含两个额外的属性: indexinput 。其中, index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。
或者在没有匹配项的情况下返回 null 。

Function类型

每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此 函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函数声明语法定义的,如下面的例子所示。

function sum (num1, num2) {
	return num1 + num2;
}

这与下面使用函数表达式定义函数的方式几乎相差无几。

var sum = function(num1, num2){
return num1 + num2;
};

最后一种定义函数的方式是使用 Function 构造函数。 Function 构造函数可以接收任意数量的参数,但最后一个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数。例如:

var sum = new Function("num1", "num2", "return num1 + num2");

函数内部属性

在函数内部,有两个特殊的对象: argumentsthis 。其中, arguments 它是一个类数组对象,包含着传入函数中的所有参数。虽然 arguments 的主要用途是保存函数参数,但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
函数内部的另一个特殊对象是 this ,其行为与 Java 和 C#中的 this 大致类似。换句话说, this引用的是函数据以执行的环境对象——或者也可以说是 this 值(当在网页的全局作用域中调用函数时,this 对象引用的就是 window )。

函数属性和方法

ECMAScript 中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性: lengthprototype 。其中, length 属性表示函数希望接收的命名参数的个数,
每个函数都包含两个非继承而来的方法: apply()call() 。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。它们的区别仅在于接收参数的方式不同。对于 call()方法而言,传递给函数的参数必须逐个列举出来

基本包装类型

为了便于操作基本类型值,ECMAScript 还提供了 3 个特殊的引用类型: Boolean 、 Number 和String 。

引用类型与基本包装类型的主要区别就是对象的生存期。使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法

Boolean 类型:是与布尔值对应的引用类型。要创建 Boolean 对象,可以像下面这样调用 Boolean构造函数并传入 true 或 false 值。

var booleanObject = new Boolean(true);

Number 类型: 是与数字值对应的引用类型。要创建 Number 对象,可以在调用 Number 构造函数时向其中传递相应的数值。下面是一个例子。与 Boolean 类型一样, Number 类型也重写了 valueOf() 、 toLocaleString() 和 toString()方法。重写后的 valueOf() 方法返回对象表示的基本类型的数值,另外两个方法则返回字符串形式的数值。此外还有三个方法:toFixed() 方法会按照指定的小数位返回数值的字符串表示。可用于格式化数值的方法是 toExponential() :该方法返回以指数表示法(也称 e 表示法)表示的数值的字符串形式。 toPrecision() 方法可能会返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适。这个方法接收一个参数,即表示数值的所有数字的位数(不包括指数部分)。

var numberObject = new Number(10);

String 类型:是字符串的对象包装类型,可以像下面这样使用 String 构造函数来创建。

var stringObject = new String("hello world");

String 类型d的字符方法

两个用于访问字符串中特定字符的方法是: charAt()charCodeAt() 。这两个方法都接收一个参数,即基于 0 的字符位置。其中, charAt() 方法以单字符字符串的形式返回给定位置的那个字符。例如:

var stringValue = "hello world";
alert(stringValue.charAt(1)); //"e"

字符串 “hello world” 位置 1 处的字符是 “e” ,因此调用 charAt(1) 就返回了 “e” 。如果你想得到的不是字符而是字符编码,那么就要像下面这样使用 charCodeAt() 了。

var stringValue = "hello world";
alert(stringValue.charCodeAt(1)); // 输出"101"

这个例子输出的是 “101” ,也就是小写字母 “e” 的字符编码。

String 类型的字符串操作方法

第一个就是 concat() ,用于将一或多个字符串拼接起来,返回拼接得到的新字符串。但实践中使用更多的还是加号操作符(+)。
然后就是 slice()substr()substring()
这三个方法都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数。第一个参数指定子字符串的开始位置,第二个参数(在指定的情况下)表示子字符串到哪里结束。
具体来说, slice() 和substring() 的第二个参数指定的是子字符串最后一个字符后面的位置。而 substr() 的第二个参数指定的则是返回的字符个数。如果没有给这些方法传递第二个参数,则将字符串的长度作为结束位置。
与concat() 方法一样, slice() 、 substr() 和 substring() 也不会修改字符串本身的值——它们只是返回一个基本类型的字符串值,对原始字符串没有任何影响。

String 类型的 字符串位置方法

有两个可以从字符串中查找子字符串的方法: indexOf() 和 lastIndexOf() 。这两个方法都是从一个字符串中搜索给定的子字符串,然后返子字符串的位置(如果没有找到该子字符串,则返回 -1 )。
这两个方法的区别在于: indexOf() 方法从字符串的开头向后搜索子字符串,而 lastIndexOf() 方法是从字符串的末尾向前搜索子字符串。

String 类型的 trim() 方法

ECMAScript 5 为所有字符串定义了 trim() 方法。这个方法会创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。

String 类型的字符串模式匹配方法

第一个方法就是 match() ,在字符串上调用这个方法,本质上与调用 RegExp 的 exec() 方法相同。 match() 方法只接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象。
另一个用于查找模式的方法是 search() 。这个方法的唯一参数与 match() 方法的参数相同:由字符串或 RegExp 对象指定的一个正则表达式。 search() 方法返回字符串中第一个匹配项的索引;如果没有找到匹配项,则返回 -1 。
还有replace()和split()。。。好多,先放着。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值