zl程序教程

您现在的位置是:首页 >  前端

当前栏目

JavaScript的原生引用类型

JavaScript 类型 原生 引用
2023-09-11 14:20:43 时间

引用类型是一种数据结构,用于将数据和功能组织在一起,也常称做类。ECMAScript从技术上说是一门面向对象的语言。但它不具备传统的面向对象语言所支持的类和接口等基本结构。

 

Object类型

大多数引用类型的值都是Object类型的实例,创建object实例的方式有两种。第一种是使用new操作符,比如:

var myobj = new Object();

 

还有一种方式是使用对象字面量表示法。比如:

var myobj = {

 name : "obj",

 weight : 20

};

 

假设留空其花括号,则能够定义仅仅包括默认属性和方法的对象,比如:

var myobj = {};

 

一般来说,訪问对象属性时使用的都是点表示法,也能够使用方括号一肤浅法来訪问对象的属性。比如:

var myobj = {

 name = "obj"

}

alert(myobj["name"]);

 

Array类型

ECMAScript数组的每一项能够保存不论什么类型的数据,并且,数组的大小是能够动态调整的,即随着数据的加入自己主动增长以容纳新增数据。创建数组有两种形式。第一种是使用Array构造函数,比如:

var myarray = new Array();

 

也能够给Array构造函数传递数组要保存的项目数量。比如:

var myarray = new Array(20);

 

也能够向Array构造函数传递数组中应该包括的项,比如:

var myarray = new Array("a","b", "c");

 

使用Array构造函数时也能够省略new操作符。另外一种创建数组的方式是使用数组字面量表示法,比如:

var myarray = ["a","b", "c"];

 

在读取数组的值时,要使用方括号并提供对应值的基于0的数字索引,比如:

alert(myarray[0]);

 

数组的项数保存在其length属性中,比如:

alert(myarray.length);

 

这个属性不是仅仅读的,能够通过设置这个属性,从数组的末尾移除项或向数组中加入新项。

 

Array方法

全部对象都具有toLocaleString()、toString()和valueOf()方法。当中,调用数组的toString()和valueOf()方法会返回同样的值,即由数组中每一个值的字符串形式拼接而成的一个以逗号分隔的字符串。实际上,它会调用数组每一项的toString()方法,而toLocaleString()方法则是调用数组每一项的toLocaleString()方法

ECMAScript数组也提供了一种让数组行为类似于其它数据结构的方法:push()和pop()。push()方法能够接收随意数量的參数,把它们逐个加入到数组末尾,并返回改动后数组的长度。而pop()方法则从数组末尾移除最后一项,然后返回移除的项,比如:

myarray.push("d");

myarray.pop();

 

此外,ECMAScript数组还提供了类似队列行为的方法:shift()和unshift()。shift()可以移除数组中的第一个项并返回该项,而unshift()相反,它能在数组前端加入随意个项并返回数组的长度,比如:

myarray.shift();

myarray.unshift("A","B");

 

数组中已经存在两个能够直接用来重排序的方法:reverse()和sort()。reverse()方法会反转数组项的顺序,而sort()方法按升序排列数组项,比如:

myarray.reverse();

myarray.sort();

 

最后。ECMAScript为操作已经包括在数组中的项提供了非常多方法。当中,concat()方法也可基于当前数组中的全部项创建一个新数组,在没有传递參数的情况下。它仅仅是复制当前数组并返回副本。假设传递给concat()方法的是一或多个数组,则该方法会将这些数组中的每一项都加入到结果数组中,假设传递的值不是数组,这些值就会被简单地加入到结果数组的末尾。

slice()方法可以基于当前数组中的一或多个项创建一个新数组,它可以接受一或两个參数,即要返回项的起始和结束位置,仅仅有一个參数的情况下,slice()方法返回从该參数指定位置開始到当前数组末尾的全部项。

splice()方法的主要用途是向数组的中部插入项,它有非常多种使用方法,假设提供两个參数(要删除的第一项的位置和要删除的项数),则会删除数组中的项,假设提供三个參数(起始位置,要删除项数。要插入的项),则能够实如今数组中插入元素。

 

Date类型

Date类型使用自UTC1970年1月1日午夜開始经过的毫秒数来保存日期。在使用这样的存储格式的条件下,Date类型保存的日期可以精确到1970年1月1日之前或之后的285616年。

创建一个日期对象,使用new操作符和Date构造函数就可以,比如:

var now = new Date();

 

在不传递參数的情况下。新创建的对象自己主动获得当前日期和时间,假设想依据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数。

为了简化这一过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC()。

Date.parse()方法接收一个表示日期的字符串參数,尝试依据这个字符串返回对应日期的毫秒数,假设传入Date.parse()方法的字符串不能表示日期,那么它会返回NaN,比如:

var mydate = new Date(Date.parse("May01, 2000"));

 

Date.UTC()方法相同也返回表示日期的毫秒数。但它与Date.parse()在构建值时使用不同的信息。Date.UTC()的參数各自是年份、基于0的月份(一月是0)、月中的哪一天(1到31)、小时数(0到23)、分钟、秒以及毫秒数,仅仅有前两个參数是必须的。假设省略其它參数,则一律设为0。比如:

var mydate = new Date(Date.UTC(2000, 1, 1,8, 10, 10));

 

Date方法

Date类型也重写了toLocaleString()、toString()和valueOf()方法,但这些方法返回的值与其它类型中的方法不同。toLocaleString()方法会依照与浏览器设置的地区相适应的格式返回日期和时间。而toString()方法则通常返回带有时区信息的日期和时间。valueOf()方法根本不返回字符串。而是返回日期的毫秒表示。

 

RegExp类型

ECMAScript通过RegExp类型来支持正則表達式,语法例如以下:

var expression = /pattern/ flags;

 

当中模式(pattern)部分是正則表達式,每一个正則表達式都可带有一或多个标志(flag)。正則表達式的匹配模式支持下面3个标志:

g: 表示全局模式,即模式将被用于全部字符串,而非在发现第一个匹配项时停止。

i: 表示不区分大写和小写模式。

m: 表示多行模式。即在到达一行文本末尾时还会继续查找下一行。

 

RegExp方法

RegExp对象的主要方法是exec(),它接受一个參数,即要应用模式的应符串,然后返回包括第一个匹配项信息的数组,没有匹配项的情况下返回null。

返回的数组是Array()的实例。但包括两个额外属性index和input,index表示匹配项在字符串中的位置,input表示应用正則表達式的字符串,比如:

var input = "this is a test";

var pattern = /test/gi;

var matches = pattern.exec(text);

alert(matches.index);

alert(matches.input);

alert(matches[0]);

 

对于exec()方法,即使设置了模式g,每次也仅仅返回一个匹配项,但每次调用都会在字符串中继续查找新匹配项。

还有一个方法是test(),它接受一个字符串參数。在模式与參数匹配的情况下返回true。否则返回false。比如:

var input = "this is a test";

var pattern = /test/gi;

alert(pattern.test());

RegExp继承的toLocaleString()和toString()方法都会返回正則表達式的字面量。

 

RegExp属性

RegExp构造函数包括一些属性。这些属性能够通过两种方式訪问它们,一个长属性名。一个短属性名(Opera不支持短属性名)。

RegExp构造函数属性

长属性名         短属性名       说明

Input         $_  近期一次要匹配的字符串(Opera不支持)。

lastMath $& 近期一次的匹配项(Opera不支持)。

lastParen $+  近期一次匹配的捕获组(Opera不支持)。

lastContext      $`   input字符串中lastMatch之前的文本。

multiline  $*  是否全部表达式都使用多行模式(IE和Opera不支持)。

rightContext    $'    input字符串中lastMatch之后的文本。

 

Function类型

函数实际上是对象,每一个函数都是Function对象的实例。并且都与其它引用类型一样具有属性和方法。

函数名实际上也是一个指向函数的指针,不会与某个函数绑定。函数通常使用函数声明语法定义,比如:

function myfunc(myvar) {

 return myvar;

}

 

也能够使用例如以下方式:

var myfunc = function(myvar) {returnmyvar;};

 

另外一种方式是使用Function构造函数。它能够接收随意数量的參数,但最后一个參数始终都被看成是函数体,比如:

var myfunc = newFunction("myvar", "return myvar;");

 

可是不推荐使用这样的方式。由于这样的语法会导致解析两次代码,从而影响性能,但这样的语法有助于理解函数是对象的概念。

假设声明两个同名函数。结果就是后面的函数覆盖了前面的函数,由于函数名相当于指针。

解析器在运行环境中载入数据时。会领先读取函数声明,并使其在运行不论什么代码前可用,但函数表达式则必须等到解析器运行到它所在的代码行,才会被真正解析运行,比如:

alert(myfunc1(1)); //正确

function myfunc1(myvar) {

 return myvar;

}

alert(myfunc2(1)); //错误

var myfunc2 = function(myvar) {

 return myvar;

}

 

由于ECMAScript中函数名本身就是变量,所以函数也能够作为值来使用,比方能够将一个函数作为还有一个函数的结果返回。比如:

function myfunc() {

 return function() {

   return 1;

  }

}

 

Function方法

每一个函数都包括两个非继承而来的方法:apply()和call()。

这两个方法的用途都是在特定的作用域中调用函数。

apply()方法接受两个參数,一个是在当中执行函数的作用域,还有一个是參数数组,第二个參数能够是Array的实例,也能够是arguments对象,比如:

function myfunc1() {

}

function myfunc2() {

 return myfunc1.apply(this, arguments);

}

 

call()方法与apply()方法的作用同样,仅仅是在于接收參数的方式不同,对于call()方法而言。第一个參数是作用域,其余參数都是直接传递给函数的,比如:

function myfunc1() {

}

function myfunc2(myvar) {

 return myfunc1.call(this, myvar);

}

 

Function属性

ECMAScript中的函数是对象,全部也有属性和方法,每一个函数都包括两个属性:length和prototype。当中length属性表示函数希望接收的命名參数的个数。

对于ECMAScript中的引用类型而言,prototype是保存它们全部实例方法的真正所在,比如toString()和valueOf()等方法实际都保存在prototype名下,仅仅不是通过各自对象的实例訪问,在创建自己定义引用类型及实现继承时,prototype属性极为重要。

在函数内部,有两个特殊的对象:arguments和this.arguments包括传入函数中的全部參数。这个对象另一个callee属性,该属性是一个指针,指向拥有这个agruments对象的函数。this与Java和C#中的this大致类似,引用的是函数据以运行操作的对象。或者说this是函数在运行时所处的作用域。

 

本文为Anyforweb技术分享博客。须要了解站点建设及很多其它web应用相关信息。请訪问anyforweb.com。