码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript中的引用类型

时间:2017-10-08 23:22:55      阅读:466      评论:0      收藏:0      [点我收藏+]

标签:拼接   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()函数相似。

 

JavaScript中的引用类型

标签:拼接   ring   内容   type属性   cti   参数传递   global   自定义   字符   

原文地址:http://www.cnblogs.com/lpfworld/p/7636146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!