标签:拼接 ring 内容 type属性 cti 参数传递 global 自定义 字符
引用类型的值是一个对象,一个引用类型相当于一个类,一个对象相当于一个实例。新对象用new操作符后跟构造函数来创造。
1.Object类型(Object类型本身不具备太多的功能,如Array这样的引用类型本身就有很多功能,但是对存储和传输数据时,或者自定义类时,比较方便)
有两种创造方法:一是用new 构造函数方式;二是用字面量的方式创建
程序员通常会使用字面量方式来创建,因为字面量方式方便传递大量的数据,将含有大量数据的对象当做一个参数传递给函数。
2,Array类型(最常用的数据类型,ECMAScript的数组和其他语言不同的是,它可以用来保存任何类型的数据,而且大小是可以动态调整的)
有两种创建方式:一是用new构造函数方式,二是数组字面量方式
例如:var colors=new Array(20); var colors=new Array(“Bule”,“red”);//var colors=["red","blue"];
Array的已有功能:可以通过length来对数组增删改查;
确定某个对象是否是数组在一个网页中使用instanceof 例如:if(value instanceof Array){} ;
但是如果网页中有多个框架,就有两个不同的执行环境,这样就会存在不同的Array构造函数,如果从一个框架,往另一个框架中传东西,那么他们两个是从属于不同的构造函数的,为了 解决这个问题,现在就有另一个函数Array.isArray()函数来确定,它是否是一个数组;
转换方法:toString(),toLocalString();valueof()方法。
toString会把每个数组数据项转为字符串然后以逗号分隔拼接。调用valueOf的话其实返回的还是数组,toLocalString通常返回的值和前两一样。不同的是,toLocalString通常会对每个元素判断,其定义的toLocalString方法,来返回值
以以上方法返回数组通常是以逗号隔开,使用join()方法,可以用不同分隔符来构建这个字符串,join()接收一个参数
例如:var colors=["red","green","blue"];
alert(colors.join(",")); //red,green,blue
alert("||");//red||green||blue
栈方法(先进先出):push()添加到数组的末尾和pop()从数组末尾移除最后一项。
队列方法(先进后出):push()添加到数组末尾和shift()取得数组第一项。 反向操作队列 unshift()添加第一项,pop()从数组末尾移除最后一项
重排序方法:reverse()方法和sort()方法;其中reverse()会翻转数组中的数据项,仅仅是翻转过来,没有拍序。
而sort()方法会先调用toString方法,让数组以数字,大写字母,小写字母来排序。因此在比较数字时,应该做个比较函数。sort(compare());
例如:function compare(value1,value2){if(value1<value2){return 1;}else if(value1>value2){return -1;}else{retrun 0;}}//按升序排列 要是按降序排列则返回值翻一下
var values=[0,1,5,10,15]; values.sort(compare); alert(values);
对于数据类型是数值的或者valueof()方法返回的数据类型是数值的对象类型,也乐意用
function compara(value1,value2){return value1-value2;}
操作方法(就是对已有的数据项进行操作的方法) :
concat()方法连接数组,添加一个数组的副本到另一个数组的末尾
slice()截取数组返回新数组,参数是起始位置和结束位置,如果参数是负数,则加上数组长度。
splice()方法,最强大的数组方法,主要用途是向数组中部插入项。
1,删除任意数量的项,两个参数,删除第一项的位置和要删除的项数例如:splice(0,2)删除前两项
2,插入指定位置任意数量的项。三个参数,起始,0(要删除的项数),和要插入的项。例如:splice(2,0,“red”,“green”);从位置2来时插入两个元素
3,替换,三个参数(其实和2是一样的)例如:splice(2,1,“red”,“green”);删除从2位置的项,删除1项,并插入2个元素
位置方法:indexof()和lastindexof()两个都是接收两个参数,要查找的项和表示查找起点位置的索引;indexof()是从前往后找,lastindexof()是从后往前找,返回值为要查找的数据项在数组中 的位置。没有找到则返回-1;例如:var numbers=[1,2,4,5,6,6,7]; alert(numbers.indexof(4));//2 alert(numbers.indexof(4,2));从第5开始查找,没找到返回-1;
迭代方法:ECMAScript为数值定义了5中迭代,都是接收两个参数:1,要在每一项上运行的函数function,(function会接收三个参数:数值项的值,该项在数组中的位置,和数组本身)2,运行该函 的作用域对象----影响this的值。
every():对数组中的每一项运行指定的function,每一项都返回true,则返回true;
filter():对数组中的每一项运行指定的function,返回运行function返回值为true的数组项组成的数组。
forEach():对数组中的每一项运行指定的function,没有返回值
map():对数组中的每一项运行指定的function,返回每次调用function产生的结果值组成的数组
some():对数组中的每一项运行指定的function,有一项为true,则返回true
例如 :var nubmers=[1,2,3,4,5,6,5,4,3,2,1];
var everyResult=numbers.every(function(item,index,array){ reutrn (item>3); }); alert(evetyResult);
var mapResult=numbers.map(function(item,index,array){return(item*2)}); alert(mapResutl);
归并方法:reduce()和reduceRight()两个方法都会迭代数组,然后构建一个最终的返回值。都是接收两个参数:1,作用在数组每一项上的函数function2,(可选)作为归并的初始值
reduce()从数组的第一项开始,逐个遍历到最后,reduceRight()方法从最后一项开始,
例如:var numbers=[1,2,3,4,5];
var sum=numbers.reduce(function(prev,cur,index,array){return pre+cur;}); alert(sum);//15;
其中function函数接收4个参数,前一个值,当前值,项的索引和数组本身。
3,Date类型
1, var now=new Date();//在不传参的情况下,新创建的对象自动获取当前日期和时间,如果想 根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数(既是从1970年算起)ECMAScript提供了两种方法:Date.parase()方法和Date.UTC()方法
其中Date.parse()方法接收一个表示日期的字符串参数,然后根据这个字符串来转化为相应的毫秒数。字符串格式有四种:如6/13/2004;january 12,2004等
例如:var nowDate=new Date(Date.parase("May 25 ,2004")); 这样就得到了一个和“May 25 ,2004”相同的日期对象。
Date.UTC()方法同样是返回毫秒数,但是其参数是年份,格式为(年月日),只有前两个是必须的。
例如; var nowDate=new Date(Date.UTC(2004,12,23));
系统会根据本地时间,和系统设置的时间两种来判断,毫秒数使到什么时间。
Date.now()方法,返回调用这个方法时的日期个时间; var sarteTime=Date.now(); doSomething(); var endTime=Date.now(); 这样就可以知道运行的时间差了
2,继承的方法
Date对象的toLocalString(),toString()和valueof()方法
toLocalString会按照与浏览器设置的地区想适应的格式返回日期和时间。
toStirng则通常返回带有时区信息的时间。具体见:浏览器标准
valueof()根本不返回字符串,而是以毫秒表示,因此可以用大小比较符来比较两个时间。
例如: var date1=new Date(2007,0,1); var date2=newDate(2007,1,2);
3,日期的格式化输出(有一些函数专门将,日期转化为某种格式来展现)
如toDateString();toTimeString();等等具体见101页
4,日期/时间组件方法(都是直接取得和设置日期值中特定的方法。)
如:getTime()返回时间的毫秒数和valueof()一样;getMonth()返回日期中的月份;getHours()返回日期中的小时,等等见102页
4,RegExp类型
ECMAScript用RegExp类型来支持正则表达式。 var expression=/pattern/flags;
1,正则表达式中有三种匹配模式,对应3个标志:g(全局模式),应用于所有字符串;i(不区分大小写模式);m(多行模式)既是在达到一行文本末尾时,还会继续查找下一行
例如:var pattern1=/at/g; 匹配字符串中所有的“at”
var pattern2=/[bc]at/i; 匹配第一个bat或者cat,并不区分大小写
var pattern3=/.at/gi; 匹配所有以at结尾的字符串,并不区分大小写
2,如果([ { \$ |}])作为字符出现在匹配模式中,必须用"\"来进行转义。例如:var pattern=/\[bc\]at/ ;和 “\\[bc\\]at”; 其中对"\"字符进行了转义;
3,有两种创建正则对象的方法,一种是字面量方式,一种是用new RegExp()构造函数:构造函数要接受两个参数,一个是匹配模式字符串,一个是标识字符
如果是字面量的话,\*****\中间是没有转义字符“\”的,而是他本身的字符;转义字符要出现在构造函数中
4,RegExp实例属性:例如:var pattern=/[ba]t/gi; alert(pattern.global); //true
global:布尔值,标识是否设置了全局模式
ignoreCase:布尔值,标识是否设置了i标志
lastIndex:整数,表示开始搜索下一个匹配项的字符位置。从0算起
multiline:布尔值标识是否设置了m标识。
source:正则表达的字符串标识,
5,RegExp实例的方法
1, RegExp对象的主要方法是exec();主要功能是捕获组
接收一个参数,既是应用模式的字符串,然后返回包含第一个匹配项信息的数组,没有匹配到返回null;然后返回的这个数组包含两个新属性;index和input
index标识匹配项在字符串中的位置,而input标识应用正则表达式的字符串
例如:var text=“ mom and dad and baby”;
var pattern=/mom(and dad(and baby)?)?/gi/; //这个正则中包含了两个捕获组 先从最内部的捕获组开始
var matches=pattern.exec(text); //此时matches是一个包含信息 的数组
alert(matches.index); //0
alert(matches.input); //"mom and dad and baby" //q去除捕获组后的正常的正则要匹配的数组
alert(matches[0]);//"mom and dad and baby"
alert(matches[1]); //"and dad and baby"
alert(matches[2]);//"and baby"
2,test()方法,接收一个参数,模式与参数匹配返回true,不匹配返回false
例如:var text=“000-00-000”;
var pattern =/\d(3)-\d(2)-\d(4)/;
if(pattern.test(text)){******}
3,toLocalString和toStirng都会返回其字面量字符串
6,RegExp构造函数的属性(有长属性名和短属性名)短属性名必须用方括号括起来:input(最近一次要匹配的字符串) lastMatch(最近一次的匹配项) 等等 见于108页
5,Function类型(每个函数都是Function的实例)
1,三种实例方式:1,function sum(num1,num2){ ****} 2,var sum=function(num1,num2){*****};(末尾要加分号,和其他变量一样) 3,var sum=new Function(“”“”“”“”“”“”“”“”“”“”)(不推荐)
JavaScript中函数没有重载:将函数名想象成指针,根据引用类型 的断线规则,可以清楚的看到,创建第二个函数时,会覆盖一个函数的内容(既是堆中的实际内容会被覆盖)
2,函数声明和函数表达式
例如:alert(sum(10,10)); function sum(num1,num2){*******} //这是正确的
alert(sum(10,10)); var sum=function(num1,num2){*********}//这是错误的,
原因是,JavaScript中会将函数的解析优先级提高在语句之前,而通过变量定义的函数,并不会提高优先级 ;处了这点之外,其他均相同
3,作为值的函数(JavaScript中函数名本身就是变量,所以可以当做值来使用)
作为值很多时候是作为一个函数的参数来传递,JavaScript中,通常是以第一个参数传递函数名,第二个参数为一个作为参数的函数的参数
例如:function callSomeFunction (somFunction,someArgument){
return someFunction(someArgument);}
someArgument 为someFunction的参数;
当然 也可以从一个函数中返回另一个函数,这也是非常有用的技术; 例如:sort()排序的比较
function creatComparaFunction(property){
return function (object1,object2){
var name1=object1[property];
var name2=object[property];
if(name1>name2){return 1;}else if(name1<name2){return -1}else{return 0}} }
4,函数的内部属性(arguments和this两个特殊的对象)
1,arguments主要是为了保持参数,但是其有一个属性callee,这个属性是一个指针,用处理递归算法。arguments.callee 表示指向自己
2,this对象,在不同的执行环境中代表当前的环境对象,全局中是window对象; 在函数中代表是调用函数的对象
function setColors(){alert(this.colors;)} //谁调用这个函数,this就代表谁,代表那个对象,将这个对象的colors打印出来
5,函数的属性和方法
ECMAScript中的函数是对象,因此函数也有属性和方法
1,每个函数包括两个属性:length和prototype;
其中length表示希望接收到命名参数的个数,既是函数参数的个数
prototype属性保存它们实例方法的真正所在,也就是说toString(),valueof()等方法实际存在pr,函数体内的this对象的值。
2,包括两个方法call()和apply()方法;用途在于在某个作用域内调用函数,下面的例子就是在 callsum1和callsum2函数中调用了sum函数
1,apply()方法接收两个参数,一个是调用它的作用域,另一个是参数数组(可以是Array的实例,也可以是arguments对象)
例如:function sum(num1,num2){return num1+num2;}
function callsum1(num1,num2){ return sum.apply(this,arguments)}
function callsum2(num1,num2){ return sum.apply(this,[num1,num2])}
alert (callsum1(10,10)); //这个例子中传入this做完this值,因为在全局中,this代表了window
2,call()方法和apply()方法的作用相同,仅有的区别在参数的传递上。call()方法,第一个参数是this没有变化,其余的参数都是直接传递给函数。必须逐个列举
return sum.call(this,num1,num2);
3,它们真正的强大之处在于扩充函数运行的作用域
例如 window.color="red"; var o={color="blue"}; function sayColor(){alert(this.color;)} saycolor();//red sayColor(this); //red sayColor(o);//blue
相当于规定了函数运行的作用域。
3,ECMAScript函数还定义了一个bind()方法,这个方法会创建一个函数的实例。其this的值会被绑定到bind()函数的值
window.color="red"; var o={color="blue"}; function sayColor(){alert(this.color;)} var ObjectSayColor=sayColor.bind(o); ObjectSayColor(); //blue
相当于规定了函数运行的作用域和上面的call()函数相似。
标签:拼接 ring 内容 type属性 cti 参数传递 global 自定义 字符
原文地址:http://www.cnblogs.com/lpfworld/p/7636146.html