红宝书 第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.age2: 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,第二个参数为要比较的数组
- 红宝书 第5章整理——引用类型(对象)
- 红宝书 第6章整理——创建对象
- 红宝书 第3章 整理——数据类型+函数入门
- 红宝书 第4章整理——变量+内存管理
- 红宝书 第6章整理——继承部分
- 红宝书 第7章整理——函数+闭包
- 红宝书 第8章整理——BOM
- 红宝书 第9章整理——客户端检测
- 红宝书 第10章整理——DOM
- 红宝书 第11章整理——DOM扩展
- 红宝书 第13章整理——事件
- 红宝书 第14章整理——表单
- 红宝书 第15章整理——canvas
- 红宝书 第17章整理——错误处理
- 红宝书 第18章整理——XML入门
- 红宝书 第18章整理——XML与JS
- 红宝书 第18章整理——XPath
- 红宝书 第10章整理——E4X
- JSplitPane的使用方法
- c语言输出自动补0
- C#代码审查清单
- [tensorflow学习笔记]tensor.eval
- 二维码Zxing&Zbar
- 红宝书 第5章整理——引用类型(对象)
- 今天有位大神离职了
- C#中的DateTime如何解析两位数字的年份
- java源码解读之LinkedList------jdk 1.7
- 小米嵌入式面经(转发)
- 团队合作要服务化,拒绝代劳
- Netcat 工具用于设备间文件传输
- BZOJ 4205: 卡牌配对
- 异常处理——毕向东Java基础教程学习笔记