JavaScript的原生引用类型
引用类型是一种数据结构,用于将数据和功能组织在一起,也常称做类。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是函数在运行时所处的作用域。
JavaScript的原生引用类型的更多相关文章
- JavaScript知识总结--引用类型(Object-Array-Function-Global-Math)
对象(引用类型的值)是引用类型的一个实例,新对象是使用new操作符后跟一个构造函数来创建的.构造函数本身就是一个函数,该函数用于创建新对象.ECMAScript提供了很多原生引用类型(Object,A ...
- React Native:使用 JavaScript 构建原生应用
[转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...
- React Native – 使用 JavaScript 开发原生应用
前不久,Facebook 在F8开发者大会上正式开源了 React Native 项目.不过目前只有 iOS 版,Android 版还需要再等一段时间,这是最新的用 JavaScript 语言开发原生 ...
- 深入浅出 React Native:使用 JavaScript 构建原生应用
深入浅出 React Native:使用 JavaScript 构建原生应用 链接:https://zhuanlan.zhihu.com/p/19996445 原文:Introducing React ...
- React Native:使用 JavaScript 构建原生应用 详细剖析
数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...
- Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。
Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等. Cordova还提供了一组统一的JavaScript类库,以及为这 ...
- 用javascript写原生ajax(笔记)
AJAX 的全名叫做 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并 ...
- JavaScript高级编程——引用类型、Array数组使用、栈方法
JavaScript高级编程——引用类型.Array数组使用.栈方法 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...
- JSPatch 可以让你用 JavaScript 书写原生 iOS APP
简介 JSPatch 可以让你用 JavaScript 书写原生 iOS APP.只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本 ...
随机推荐
- MYSQL 使用事务
直接上代码,ID是唯一标识 CREATE PROCEDURE PRO2() BEGIN DECLARE t_error INTEGER; DECLARE CONTINUE HANDLER FOR SQ ...
- Codeforces_776_C_(思维)(前缀和)
C. Molly's Chemicals time limit per test 2.5 seconds memory limit per test 512 megabytes input stand ...
- HDU_1520_Anniversary party_树型dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...
- Linux终端常用快捷操作
命令或文件名自动补全:在输入命令或文件名的前几个字母后,按Tab键,系统会自动补全或提示补全 上下箭头:使用上下箭头可以回溯之前的命令,增加命令的重用,减少输入工作量 !加之前输入过的命令的前几个字母 ...
- 03JavaScript运算符与表达式
JavaScript运算符与表达式 2.5运算符与表达式 2.5.1赋值运算符 运算符 意义 运算符 意义 = x=5 /= x=x/y += x=x+y %= 求余赋值 -= x=x-y *= x= ...
- Jmeter - 获取返回结果中的字段值
Jmeter测试场景:一个web系统,需要先发送登录请求,获取到登录Token之后,后续每次请求都需要在请求头中附带Token才有权限操作.现在需要在Jmeter中自动获取每次登录请求返回的Token ...
- linux free命令-显示内存的使用情况
更多Linux 性能监测与优化 关注 Linux命令大全 free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区. 语法 free(选项) 选项 -b:以Byte为单 ...
- ubuntu 下安装wine
PPA地址: https://launchpad.net/~ubuntu-wine/+archive/ppa 添加wine的ppa源 sudo add-apt-repository ppa:ubunt ...
- HDU 5217 Brackets
[题意概述] 给出一个有左括号和右括号的序列,左边的左括号和右边的右括号可以合并.现在要求你维护这个序列,支持两种操作: 1,翻转某个位置的括号: 2,查询区间[L,R]合并后第k个括号在原序列中的位 ...
- npm安装node包时怎么显示安装进度
npm config set loglevel=http 打开这个你会看到所有的 HTTP 请求,除此之外如果还有 \ 长时间打转,那就是外部模块的编译过程,一个字:等. 具体地址可参考https:/ ...