【红宝书笔记】一点点关于引用类型

来源:互联网 发布:angular js scope 编辑:程序博客网 时间:2024/05/20 10:14

有点懵逼,,关于基本类型,引用类型,object类型......

JS中变量保存两种类型的值,一种是基本类型值,一种是引用类型值。像undefined,null,string,Number,Boolean就是基本类型值。

引用类型值是讲数据和功能组织在一起的类型,他们的值就是对象的实例。所有关于对象的字面量都是对象的指针。

引用类型主要有Object,Array,Date,Function,Reg等类型(注意区分object和Object。用typeof去判断变量类型的时候,如果变量是一个对象或者null,就返回object表示是一个对象,而不是说是Object类型)

1.Object

很多引用类型值(Array,Function...)都是Object的实例。

1.创建方法:使用new操作符,使用字面量{ }(该方法貌似不调用Object构造函数)

2.访问属性:使用『。』操作符或者『[ ]』操作符。建议使用点操作符,但是如果属性名称中带有空格,或者关键字等会导致语法错误的字符,就要用中括号操作符进行访问。

2.Array

1.创建方法: 使用Array构造函数(可以初始化数组内容或者数组大小),使不使用new操作符都可以使用数组字面量[ ]

2.相关属性: length => 访问数组的长度,同时也可以指定数组长度。(ps:JS中数组最大开到2^32的长度)

3.相关方法: 栈方法,队列方法。用pop()和push()模拟栈。pop()推出栈顶元素,并返回该元素。push()把元素入栈,并返回当前栈的长度。用push()和shift()模拟队列。push()将元素加入队尾,shift()把头部元素取出,并返回该元素。用pop和unshift可以实现反向队列:

                                                   

    排序方法:sort()和reverse()。

   sort默认为升序排列,传入函数可以定义数组元素的优先级,得到想要的排列。这个函数可以认为是定义两个元素间谁大谁小。比如对于function(a,b) { return a.val < b.val },如果a的val比b的val小,函数返回1,说明a比b大,那么排序的时候a就在b的后面(因为sort是升序排列的),排序规则是val小的元素排在后面。

    reverse函数就是把数组中的元素顺序进行翻转

切片方法:slice()和splice().

slice可以选择区间对数组进行切片操作,返回相对应的区间但是不改变原数组

splice是比较灵活的方法,可以在指定位置进行增加,替换和删除处理,splice(start, num, obj[0], obj[1],...)。start表示操作开始的位置(从0开始),num表示要删除的元素个数,obj表示要增加的元素,可以增加多个。

<span style="font-size:18px;"><span style="font-size:14px;"><span style="font-size:14px;color:#333333;">var arr = [1,2,3,4,5,6,7,8,9]  arr.splice(1,3,10,11,12,13)  // [2,3,4] //返回被删除的区间段arr  // [1, 10, 11, 12, 13, 5, 6, 7, 8, 9]</span></span></span>
位置方法:indexOf() 和 lastIndexOf()

传入的参数是想要查找的元素,前者返回元素第一次出现的位置,后者是最后一次出现的位置。如果没有,就返回-1

迭代方法:之前迭代没有好好看QUQ,写博客的时候因为异步遇到的问题就没能解决,最后换了个方法。。虽然显然后来的方法更合理些。。但是我居然不知道map。。TAT。。太弱鸡了。。

every() => 传入函数,如果每个元素都返回true,则返回true

filter() =>传入函数,返回那些函数返回为true的[元素的集合]

map() => 传入函数,返回每次函数调用的结果组成的函数(比如在异步的node中,想对数据库进行多个元素的查询,并且返回这些个元素的结果的时候就可以用。(联表查询),不forEach也是可以的。。TAT)

forEach() => 传入函数,对每个元素执行该函数,无返回值

some() => 传入函数,如果元素有返回true的,就返回true
归并方法:reduce() 和 reduceRight()。遍历数组中所有的元素,对每个元素执行函数,并且将函数返回值传递给下一个元素

function(pre,cur,index, array) pre是上次函数的返回值

3.Date

用来进行日期访问的。new Date()对当前日期进行访问。然后还有一堆对年月日时分的访问,这个就直接查api直接用就好了。

不过要注意的是,month的范围是从0-11,小时数也是从0-23.

可以自己设定时间 new Date(year, month, day, ...)。比如这样可以比较方便地找到对应的星期呀~_~

4.Reg

正则表达式。。可以用/『pattern』/ flags这种字面量的方法来进行表达式的建立,pattern是匹配的格式,flags是匹配模式,或者用new RegExp(pattern, flag)建立,记得这个时候不要加斜杠啦。

用exec(string)函数来进行匹配,返回第一个匹配项信息的数组,该数组有index和input属性,分别表示匹配项在字符中的位置,应用正则表达式的字符串。如果没有捕获的信息,就返回null。并且每次exec只会返回一组匹配,即使是在全局下。因此可以通过循环调用exec多次匹配一个字符串,来获得字符串中所有的匹配结果。

有一个需要注意的是,如果一个正则变量reg要匹配多个字符串,那么每次匹配之后,都要手动吧reg.lastIndex(0)置零,或者是每次匹配都重新生成一次正则变量。

5.Function

创建方法:函数声明:

<span style="font-size:18px;"><span style="font-size:14px;">function a(){ .. }</span></span>

或者函数表达式:

<span style="font-size:18px;"><span style="font-size:14px;">var sum = function (){...}</span></span>

虽然还可以用new操作符,但是这样会导致两次解析,所以并不建议:

<span style="font-size:18px;"><span style="font-size:14px;">var sum = new Function(arg[0],arg[1],content)</span></span>

函数的声明会在解析的时候得到hoist,解析器会先读取声明,这样在执行任何代码之前都是可用的(但是函数是不会先执行的,所以里面即使定义了一个全局变量,在hoist的时候也不会把全局变量也hoist!)所以函数的声明可以放在后面。有一点需要注意,在js中,如果有代码出错了,后面的代码都不会执行(哎呀这个我应该很久以前就知道了才对。。=  =)

关于函数没有重载的概念,我认为,在C++中,函数的重载通过参数传入的个数或类型或返回值不同,来进行函数的重载。但是由于JS是松散类型,参数的个数是松散的,传多了传少了都没关系,返回类型就更别说啦。所以自然是没有办法区分重载的,所以也就不存在重载这个概念。

这个函数的用法想要记一下:

<span style="font-size:18px;"><span style="font-size:14px;">function comparisonFunction(propertyName){return function(object1, object2){var x = object1[propertyName],y = object2[propertyName];return x.value < y.value;}}array.sort(comparisonFunction("name"));</span></span>

想要实现对指定属性进行排序的好方法。

函数中最重要的三个方面:argument,this,prototype。

argument是函数参数的另一种访问方式。他有一个属性callee,表示调用这些参数的函数,并不是this指针,而是显示整个函数

this是指向调用这个函数的对象,详情参见:http://blog.csdn.net/natsuyu/article/details/50849996

印象最深刻的是this指针不会隐式传递,所以函数内部的this指针就很容易归到window上

prototype是js对象中进行继承的主要方式。通过改变prototype的指向,可以让对象访问原型中的属性和方法



0 0
原创粉丝点击