红宝书 第5章整理——引用类型(对象)

来源:互联网 发布:nba2k14 for mac 迅雷 编辑:程序博客网 时间:2024/06/08 11:44

1、引用类型:

   引用类型的值(object)
   数组(array)
   日期(date)

   函数(function)

① object:

创建方法2种:

1:var person = new Object();  //先用new声明
   person.name = "jack";     //再添加以下属性,方法
   person.age = 29;
   person.do = function(){...};

2:var person = {     //对象字面量方法
   name : "jack",     //注意!!!用逗号结尾!!
   age : 29,
   do : function(){...} // 最后一项没有符号!!
};                      // 花括号最后有一个分号!

属性的调用方法2种:

1: person.age
2: person["age"]   // 方括号适用于当属性名称有空格之类的字符时

② array:

特点:

每一项可以保存不同类型的数据,例如a[0]是string,a[1]是number,a[2]是对象。大小可以动态调整

array.length:

这个属性不是只读的,可以利用它来对数组进行操作
  例如若原数组长度为3,然后array.length = 2;  则此时数组会截取前两位
  同理,若array.length = 4; 则此时会自动为数组增一位,类型为undefined。
  一个很巧妙的为数组尾添加值的方法,等同于push —— array[array.length] = ...  //因为数组计数从0开始,length比计数正好多1

数组的转换:

  对于任何一个对象都有toLocalString()  toString()  valueOf() 方法,对于数组来说,这3个方法默认都会返回一个以逗号分隔的string
   如果想要用别的符号来分隔,可以加入join(" ")方法,参数就是你要的符号。
   e.g. array.join("||")    //默认write这个array时,调用valueOf方法,所以可以不用先valueOf再join,直接array.join(" ")即可

一些常见的函数:

 shift()
 push()
 pop()
 unshift()
 concat(x,y,z..) // 数组拼接
 slice()  // 参数可以有两个,返回起始位置之间的元素,对原数组不做改变,注意起始位置的计数
 splice()  //对原数组做改变,可以删除,添加,替换元素,根据参数的不同,由于会返回删除的元素内容,也可以做截取用
 indexOf() //从头查找,找到返回位置,没找到返回-1
 lastIndexOf() //从尾找
 reverse()  //反序
————————
下面为array的迭代方法

 every()  //参数为function(item,index,array){..} ,对数组每一位运行函数,若每一项都为true,则返回true
          //其中item代表数组的每一个元素,直接用即可,不用i++,index相当于i,array为数组本身,感觉像是一组接口,可以直接调用
          //e.g. if(item>2)  等价于if(array[index]>2)
 some() // 类比every,只要有一项为true,则为true
 forEach()  //只是挨个运行一遍,不返回状态
 map()   //运行一遍,返回一个新数组,像是一种映射

 filter()  //运行一遍,返回符合的元素

③ Date:

1:用法:

var begin= new Date();

........

........

var end = new Date();

var time = end - begin;  // 会输出这两个时间点的毫秒数

2:其他

var begin= new Date();

var beginsecond = begin.valueOf();  //  会输出从UTC时间1970年1月1日至今走过的毫秒数

④ RegExp::

创建方法2种:

1:var new = /...../ flag;

其中斜杠里面为正则表达式内容,flag可选3种,“g”“i”“m”,

g为全局模式,否则发现第一个就停止;i为不区分大小写模式;m为多行匹配模式。 3个参数可以随意搭配组合使用。

2: var reg = new RegExp("...","flag")

第一个参数若非一转义斜杠开头则直接写,若以\d这种转义开头的,需要多加一个斜杠

常见表达:

1:xx|xx|xx    //任选其一

2:[\s\d\n...]     //方括号里可为多种转义的集合

3:reg.test(element);    //将element用正则reg测试,符合返回true

4:string.split(/...../);    //将正则配合其他函数用,例如遇到正则里面的东西就划分string

⑤ function:

两种创建方法:

1:函数声明法:

    function sum (num1,num2){

    .......

  }

2:函数表达式法:

  var sum = funcion(num1,num2){

    .......

  };     // 注意此处要有分号,相当于一句变量赋值

两种方法唯一区别:

   函数声明法会率先读取,这样就可以在声明函数内容之前进行调用。而表达式法在执行到这句时才会创建函数。

内部对象:

1:arguments:

 除了之前提到的用于保存函数传进来的参数以外,arguments还有一个很棒的属性——arguments.callee

 作用:是一个指针,指向拥有这个arguments的函数,可以在递归函数中,代替原函数名

function digui(num){  if(num<=1){  return 1;}  else{   return num * arguments.callee(num-1);   // return num * digui(num-1);}}

  好处:降低函数的执行与函数名的耦合度,防止因为函数名出现什么问题导致整个函数都不能用。

  注意:函数在严格模式下该方法不能用

2:this:

引用的是当前的环境对象。在全局环境中,就是window。对象中就是对象。

函数的属性与方法:

因为函数在js中也是对象,所以function又有属性与方法。

属性:

1:length:

   function sum(num1,num2){......}

   sum.length = 2;  //即函数中参数个数

2:prototype:

   此属性非常重要,涉及到了继承,具体见第6章

方法:

1:apply()

接受两个参数,第一个是这个函数的作用域,第二个传参数(当这个函数需要参数时),参数可以是array数组,也可以是arguments对象

2:call()

接受参数,第一个也是函数的作用域,接下来必须将需要传的参数一一列举出来

3:总结:

call与apply用途都是在特定的作用域中调用函数,区别仅在于接受参数的方式不同。apply可以接受arguments对象与array对象,call只能接受具体的每个参数枚举。

实际上,这两个函数真正的用武之地是扩充函数赖以运行的作用域——

window.color = "red";var 0 = {color:"blue"};function saycolor(){  alert(this.color);}saycolor();     //"red" 因为此时saycolor()实在全局作用局中定义的,不是某个对象的方法,所以this指的是windowo.saycolor = saycolor;    //为对象o创建方法o.saycolor();             //"blue" 因为此时saycolor方法为对象o的方法,所以this指的是对象o

上面这个例子是正常情况下为对象添加方法,对象o想要拥有一个方法需要写入。

但是当利用call和apply方法时,就可以不用单独给对象o写入了,直接用call或者apply,将作用域变成对象o即可。

见下:

window.color = "red";var o =  {color:"blue"};function saycolor(){  alert(this.color);}saycolor();     //"red" 全局变量函数,this为windowsaycolor.call(this);   //"red" call的作用域指定为this,还是默认为window,结果不变saycolor.call(window);  //"red" call 的作用域指定为window,还是没变,本来就是windowsaycolor.call(o);     //"blue"  call的作用域指定为对象o,那么此时this就是指对象o,这样对比正常方法,虽然没有给对象o添加saycolor方法,但是 通过call和apply扩展了

2、 基本包装类型

为了方便基本数值类型的操作,还有3种特殊的引用类型:Boolean,number,string

正常这些基本数值类型是没有方法的,但是例如string,会自动在后台创建一个string对象,里面有很多字符串操作方法。

①创建方法:

1、后台创建

   就是用户不用自己new一个string,正常var创建就可以,这时当调用string的方法时,后台会自动创建一个String对象

  与正常创建引用类型的区别:对象的生存期。  用new创建的对象会一直保存在内存中,可以为其添加属性、方法。  但是这种后台自己创建的对象,只存在与执行代码的一瞬间,然后就被立即销毁,这就导致了你不能自己给它添加新方法和属性

2、显示创建

即用new来创建,var a = new String(“hello”);这是a就会保存在内存中,而且typeof为object,但是这种方法不推荐,容易乱。

②String的常见方法:

charAt(index);   // 返回第index位的char内容

charCodeAt(index);    // 返回第index位的字符编码,可以用这个方法来判断这位是字母还是汉字,字母的编码有一个范围,不在    这个范围内的就是汉字

concat("a","b"....);      //字符串拼接,把concat里面的所有内容依次拼在后面,返回一个新值,不会改变原始string。

                                  //但是实际中不常用,直接用+拼接就好了

slice();   //可接受两个参数,第一个为起始位,第二个为终止位,返回截取的副本,不会动原string

substring();   //可接受两个参数,第一个为起始位,第二个为终止位,返回截取的副本,不会动原string

                     //与上面slice区别,当参数为负数时处理办法会有不同,其余都相同

substr();     //接受两个参数,第一个为起始位,第二个是截取的长度。

indexOf(“x”);    // 索引,从开头找x,找到返回位置。可以接受第二个参数,说明从哪一位开始向后找

lastIndexOf("x");   //  索引,从尾找。可以接受第二个参数,说明从哪一位开始向前找

toLocalUpperCase(); / toUpperCase();     //全部转大写,二者区别,带local的更严密,针对外来语

toLocalLowerCase(); / toLowerCase();    //全部转小写,二者区别,带local的更严密,针对外来语

match(reg);     // 匹配,一般搭配正则表达式用,一般返回一个数组,保存着匹配的内容。

split();    //   分割string用,参数可以是一个符号“,” “ ” 等等,也可以是正则对象,返回一个切割好的数组

3、单体内置对象

内置对象定义:在程序执行前,js就已经为你实例化好了,不依赖于宿主环境。

                         举例:Object  Array  String

还有两个单体内置对象:Global  Math

① Global对象

最为一个兜底的对象,不属于其他任何对象的属性、方法就都归到它名下。

举例:isNaN()    paresInt()   encodeURI()   eval()

1、eval() 函数:

一个强大又危险的函数,只接受一个参数,一个字符串,里面是一句js的语句。

实际运行时,会把eval内部的语句拿出来放在程序中执行,这样看上去没什么用,跟没有eval一样

但是!!这代表着程序被打开了一个开口,允许在外部对程序进行插入语句,可以用eval接受外部的,用户录入的代码

这是非常危险的,因为输入的程序你不知道是什么,可能会导致原有的程序崩盘。

2、window对象

因为Global对象太空了,对于我们来说好像不存在,所以基本上我们说全局对象,指的都是window对象。

对于Global的内置方法,对象就都由window来继承实现了。

② Math对象

Math对象具有很多数学的方法,举例:min()   max()  

对于数组使用min方法时:

var value = [1,2,3,4,5,6,7];var max = Math.max.apply(Math,value);  //因为max方法是属于Math对象的,所以要把它用在别的作用域时,就要用call或者apply了,第一个参数为作用域Math,第二个参数为要比较的数组





0 0