《JavaScript高级程序设计》Chapter 5 引用类型

Chapter 5 引用类型

  • 使用表格进行归纳,对表格中某些内容会进行必要解释,并把解释放在表格下方。
  Object类型 Array类型 Date类型 RegExp类型 Function类型 基本包装类型
创建方法 构造函数、字面量 构造函数、字面量 构造函数Date(),显示或者隐式的配合Date.parse(日期字符串)以及Date.UTC(...)来使用。 字面量、构造函数
函数声明、
函数表达式(构造函数声明)
 
隐式创建、
显示创建(各自的构造函数、Object的类工厂方法)
构造函数的属性      
适用于作用域中的所有表达式,且基于执行的最近一次正则表达式的操作而变化,可以通过长属性名或者短属性名来进行访问。
opera和IE不完全支持,格式:RegExp.attribute):
input, lastMatch, lastParen, leftContext, rightContext, multiline,
$1, $2, $3,...
函数内部的属性:
和构造函数的属性以及函数的属性有一定的差别,因为是发生在函数内部的。
函数内部有两个特殊对象arguments和this,其中this指向当前的环境:
arguments.callee-->指向包含它的函数引用
caller(ES5)--->指向调用这个函数的函数。全局环境下为null
注意,ES5的严格模式下,会出问题。
 
访问/读取 点表示法、方括号表示法,后者应用在前者不适合的场景:属性名为变量、属性名含空格等。建议采用点表示法
方括号:array1[index];
length
       
检测 instanceof
instanceof
Array.isArray(value);注意:isArray()是Array对象的一个方法。
instanceof instanceof instanceof instanceof
转换方法
(继承的方法)
valueOf()方法
toString()方法
toLocaleString()方法
同左。
join()方法
调用toString()方法返回每个值得字符串形式拼接的以逗号分隔的字符串。valueOf()仍然返回数组。
toString()(toLocaleString())实际上调用了数组中每一个值得toString()(toLocaleString())方法
对toLocaleString()、toString()重新定义,前者配合当前地区放回适当信息(一般含AM、PM,不含时区),后者含时区。不同浏览器不一样。
valueOf()返回时间的毫秒值(相对于UTC:1970.1.1零时)
toLocaleString()、toString()返回字面量形式的样式字符串(即使通过构造函数创建)
同左。
三个继承而来的方法会返回这个函数的代码。
同左:
- Boolean的返回true/false或者"true"/"false"
- Number返回相应的数值或者字符串。toString()还可以规定返回的进制数。
- String:返回这个字符串
属性      
global, ignoreCase, multiline;
lastIndex:开始搜索下一个匹配项的字符位置
source:正则表达式的字符串表示,按照字面量的形式表示(无双重转义)
length:存储函数希望传入的参数的长度
prototype:原型,保存所有实例方法的真正所在,不可枚举,因此无法通过for-in发现
 
方法  
栈方法(LIFO)
在数组末尾push()、pop()
队列方法(FIFO):
正向队列:在数组末尾push()、在数组前端shift();
反向队列:在数组前端unshift()、在数组末尾pop()
注意进入数组后的顺序(可以实际试验一下)
重排序方法(返回排序后的数组)
reverse()、sort()
操作方法:
concat()--创建数组副本,追加新值
slice()---创建新数组,得到指定段的切割后的数组
spice()--参数(灵活):起始位置、要删除的项数、新加入的值。改变原数组,返回删除的值。
位置方法:
indexOf()
lastIndexOf()返回所在的位置。
迭代方法(不会修改原数组的值)
every()--每项返回true则true
some()--有项返回true则true
filter()--返回返回true的项组成的数组
map()--“映射”,返回每一项的结果组成的数组
forEach()--对每一项运行函数,无返回--有些像for语句迭代数组。
缩小方法(返回最终的那个值,所以“缩小”):
reduce();
reduceRight();
Date.now()---顾名思义,相当于+new   Date()//字符串
 
将日期格式化成字符串(因浏览器而异)
toDateString()
toLocaleDateString()
toTimeString()
toLocaleTimeString()
toUTCString()
toGMTString()
 
日期/时间组件方法(Date类型的具体方法,用于获取特定部分的时间或者日期信息)如:
getTime()
setTime()
getFullYear()
getDate()
...
exec()
传入待匹配的字符串。
返回一个数组:
数组有两个属性:index和input
数组第一项为第一个匹配的字符串,后面项依次为与各捕获组匹配的字符串。
即使flags设置为g,exec()方法返回数组的第一项仍然是第一个匹配的字符串,然而对下一次调用exec()的数组的index和正则表达式本身的lastIndex会有影响。
test()
传入待匹配的字符串
返回是否匹配true/false
设置函数发生时候的环境:
apply()、
call()
第一个参数均为环境值,第二参数前者可以是对象或者数组,后者必须一一列出。
- ES5中,如果不作说明,this不会自动变成window而是undefined。这个时候apply()和call()就起作用了。
绑定一个环境(一般会接着赋给一个新的函数指针)
bind()好处在于不需要这个环境(对象)与函数发生任何耦合关系。(不需要将这个函数作为方法写进这个对象中)
Number:
toFixed()--规定小数位数
toExponential()--规定小数部分位数
toPrecision()--规定所有的(不包括指数部分)的位数,会考虑情况选择合理的方式显示(toFixed()or toExponential())
 
String:
length属性
字符方法:
charAt(index),
charCodeAt(index),
像数组一样用方括号进行索引
 
字符串方法:
concat():顾名思义,拼接字符串,不会改变原字符串
slice()
substring()
substr()
参数为正的情况下,前两者输入两个参数:开始索引和结束索引(不包含),后者输入两个参数:开始索引和想要切割对字符个数。
负数的时候,slice()会将负的参数与length相加,substring会将负的参数变成0,substr会将第一个负(表示索引)的参数与length相加,第二个负(表示个数的)变成0
 
字符串位置方法:
indexOf()
lastIndexOf()
 
删除空格:
trim(), trimLeft(), trimRight()
 
字符串大小写转换:
toLowerCase()
toLocaleLowerCase()
toUpperCase()
toLocaleUpperCase()
 
 
字符串模式匹配的方法:
match() -- 与正则表达式的exec()很像
search()返回第一个匹配的索引的位置
replace()顾名思义,匹配之后替换,第二个参数还可以是函数,进行有选择的替换,功能强大。
split()根据参数分割字符串,返回数组,数组长度可以由第二个参数确定。
 
localeCompare()方法:与字符串参数进行比较,排在前面为负,后面为正,相同位置为0(同样结合数轴进行理解)
 
fromCharCode()将接收到的参数编成字符串,charCodeAt()字符串层面的反操作。
 
HTML方法:
提供一些方法,将字符串写到特定的标记之中,避免使用这个方法,因为对浏览器以来。
  • 引用类型(一类,与“类”相似,但实际上,JS并没有类的概念),对象定义--->引用类型的值(对象)的一个实例。
  • new+构造函数--->创建一个引用类型的实例。
  • 原生引用类型:下面罗列的这些都属于原生引用类型。
  • Object类型
    • 一般来说,通过字面量创建的对象实例不会调用构造函数。
  • Array类型
    • JS数组同样是有序表,但比起其他语言灵活许多,可以存储的数据类型十分灵活。
    • 检测数组:instanceof只适合单一网页(全局作用域)的情况,多个全局执行环境可以使用Array.isArray()方法。
    • sort方法默认升序排列,且调用toString()按照字符串排列,最好和比较函数连用。对于比较函数返回的正负数与升降序的关系,可以结合一维坐标理解。
    • slice()方法中的两项不包含结尾那项。参数为负数,则用数组长度加上该参数。若结束位置小于起始位置,则返回空数组。
    • 迭代方法:参数为函数,以及可选的作用域。函数的参数有三个:数组项的值,索引,数组对象自己。(value, index, array)
    • 缩小方法:参数为函数,以及(可选的)初始值。函数参数有4个:prev, cur, index, array
  • Date类型
    • Date()不传入参数的时候可以获取当前时间。传入参数的话需要毫秒值,这个时候就可以隐式或者显式的配合Date.parse()/Date.UTC()将日期/时间转换为毫秒值之后再传入。
  • RegExp类型
    • 字面量创建:var expressions = /patterns/flags
    • 构造函数创建: var expressions = new RegExp("patterns", "flags");
    • 构造函数创建的时候需要对patterns进行双重转义处理(一般是针对“\”符号),flags可以是g、m、i。
    • ES3创建的正则表达式字面量共享一个RegExp实例,而构造函数则是不同的。共享一个RegExp实例会对下一次匹配的开始索引产生印象。ES5将这一点纠正。
  • Function类型
    • 函数声明语法会发生“声明提前”,而作为表达式,函数表达式只有执行到这里的时候才会进行解释。
    • 构造函数创建functoin实例同样属于函数表达式,传入的最后一个参数始终会被认为是函数体的执行代码。由于经历了两次解析,所以不推荐这种方式。
    • 注意理解,“函数是对象,函数名是指针”。函数是对象,有方法和属性,函数名是指针,实际上是指向函数的一个引用而已--->函数没有重载,就是因为函数的名称实际上只是引用,指向同一位置。
    • 注意,区分this所指的环境与函数本身引用的位置的差别,二者是不同的概念:注意:无论在window下调用this还是在什么其他的对象环境中调用,虽然this的指向环境不一样,但是函数的引用(函数名)始终指向一个函数的位置。 
    • 函数是对象,是值,所以可以传入到另一个函数,也可以作为值被返回:访问函数指针而不是执行函数,不需要圆括号,例如,访问指针:addSum 执行函数 addSum() 可以帮助理解以后的内容。 
  • 基本包装类型
    • 基本类型有的时候需要一些属性和方法,这显然不该发生在基本类型身上(基本类型不该有属性和方法)。为了解决这一问题出现了对应的基本包装类型Number、Boolean、String。
    • 实际上,当我们对基本类型使用方法或者属性的时候,后台隐式创建了对应的基本包装类型(然而声明周期很短,使用完成之后便销毁。)
    • 不仅可以通过各自的构造函数显示创建基本包装类型,还可以通过Object的类工厂函数的方法创建:var v = new Object(true)--此举创建了个Boolean包装类型。
    • 这里提出了一个需要区分的地方(虽然我认为并没有什么必要):Number()和new Number()的区别。前者是转型函数(转换为数字),后者为构造函数,所以利用typeof的时候,前者是“number”,后者是“object” 
    • 再次理解typeof和instanceof的区别:
      • typeof someThing:返回字符串。区分具体的基本类型(boolean\number\string\null\undefined)和引用类型(object)以及特别些的function
      • someThing instanceof object/String/Boolean/Number/Function/RegExp/Date/Array -- 区分具体的引用类型。
    • Boolean造成误解的地方:基本包装类型都会被认为是true:所以无论new Boolean(true)还是new Boolean(false)放在逻辑判断语句中都会被认为是true。
    • alert()函数接收的是字符串数据。
  • 单体内置对象
    • Global:所有不属于其他对象的属性和方法都属于Global(即无法严格分类的那些)
      • 方法:
        • URL编码、解码方法:
          ecodeURL()/ecodeURLComponent/decodeURL/decodeURLComponent
        • eval()方法:输出执行的结果、将原位置替换位代码段。由于是按照字符串解析,所以不会出现函数声明的提升。注意防止代码注入,慎用。
      • 属性:如undefined、NULL、NaN、String、Object等等
      • 通过window对象取得Global对象
    • Math:存储数学方法和属性的对象。
posted @ 2017-10-23 09:14  nebulium  阅读(182)  评论(0编辑  收藏  举报