我们更加青睐采用对象字面量的语法来作为对象语法书写。这样可以给人一种数据封装的感觉。实际上,对象字面量也是向函数传递大量参数的首选方式。
例如下面是一个函数
function test(args){
if(typeof args.name == "string"){
console.log(args.name);
}
}
test({
name:"haha";
})
访问对象属性通常用“.”的方式。而在javascript中,还支持另外一种,即作为类似数组的方式来访问。
alert(person["name"];
alert(person.name);
Array类型
- 每一项可以存任何类型的变量。
- 数组大小动态调节
- 如果一个数组colors大小为3,colors[2]访问第三个元素。colors[5]=”black”的话,数组大小会自动增加到索引值+1的长度,没有赋值的部分会定义为undefined
- 使用length属性可以很方便地在数组最后添加新元素。
检测数组
使用instanceof可以。
if(value instanceof Array){
//some operation
}
然而网页中如果包含多个框架,就存在两个以上的不同全局执行环境。不同框架中构造函数不同,这个方法会失效。
为了解决这个问题ES5新增了Array.isArray()
方法,可以判断是不是数组
转换方法
toString()
和toLocaleString
可以转换为字符串。不同的是,两个方法分别数组成员内每个成员的toString()
和toLocaleString()
方法
var a = {
toString:function(){
return "toStringMethod";
}
toLocaleString:function(){
return :"toLocaleStringMethod";
}
}
var b=[1,2,3]
var c = [a,b]
c.toString();//"toStringMethod,1,2,3"
c.toLocaleString();//toLocaleStringMethod,1,2,3"
join()方法可以实现类似上述方法,不过join对每一个对象调用的是toString()
方法。如果不给join传入参数,默认使用’,’,但是IE7或者以前会以undefined作为分隔符。
栈方法
pop()
push()
队列方法
shift()
- `push()
重排序方法
reverse()
sort()
值得注意的是,sort()方法会调用每一项的toString()
方法,然后比较得到的字符串来决定如何进行排序。即便全是数字,也会调用toString()
继而比较的是字符串。
sort()还可以接受一个比较函数,来决定哪一个值在前面。如果第一个参数应该排在前面,返回-1。我们可以这样写
function compare(val1,val2){
return val2-val1;
//效果是从大到小
}
a.sort(compare);
操作方法
slice()
concat()
- 重点说明
splice()
,主要有三种功能
功能 | 使用方法 | 说明 |
---|---|---|
删除 | splice(startPos,length) | 从startPos开始删除length个元素 |
插入 | splice(startPos,0(要删除的长度),newEle) | 在startPos开始插入元素 |
替换 | splice(startPos,length,newEle) | 就是删除掉再插入 |
splice()始终会返回一个数组,这个数组包含从数组中删除的项。
位置方法
indexOf()
lastIndexOf()
迭代方法
函数 | 说明 |
---|---|
every() | 对数组中每一项都运行指定函数,如果每一项都执行一个函数,如果每一项都返回true,那么返回true,否则返回false |
some() | 如果数组中有返回true的,则返回true |
filter() | 返回数组,数组内包含返回true的项 |
map() | 对数组中每一项运行函数,返回运行这个函数之后的数组结果,但不修改原数组,这种方式适合用于创建一个和原来数组一一对应的数组 |
forEach() | 没有返回值,相当于for |
归并方法
ES5新增了reduce()和reduceRight()方法,其实和forEach那些差不多。
传入参数可以有两个,一个是用于处理的函数,一个数作为归并基础的初始值(可选)。
用于处理的函数有四个参数,前一个值,当前值,索引,数组对象。
Function类型
ES中function可以理解为指针。使用的时候,只有带()的才会调用函数,而函数名只是代表一个指针。可以看以下例子
function add(num1,num2){
return num1+num2;
}
var add2 = add;//不会执行函数
add=null;//删除add函数,但是add2还存在
由javascript垃圾回收机制是标记法我们也可以理解这一点,因为还有add2指向这个函数,因此这个函数不会被清除。
函数声明和函数表达式
alert(sum(10,1);//11
function sum(num1,num2){
return num1+num2;
}
这是用函数声明的方式定义的函数
再看下面的例子
alert(sum(10,1));//sum is not a function
var sum = function(num1,num2){
return num1+num2;
}
这是因为解析器优先解析函数声明,而表达式的话是按照顺序进行解析,因此第二种使用方法的话就存在调用这个函数的时候这个函数还没有被解析,因此会报错。
函数作为返回值
函数可以作为参数,比如我们之前写到的sort()函数。而一个更加厉害的是ES支持函数作为返回值。
function createCompareFunc(property){
return function(obj1,obj2){
var val1 = obj1[property];
var var2 = obj2[property];
return var2-var1;
}
}
上述代码实际上是一个专门生成比较函数的类似于函数工厂的东西。只需要给定属性,就可以返回一个基于属性进行比较大小的函数。