page128 6.4检测属性
javascript对象可以看作属性的集合,类似下面例子
var obj={
v:"变量",
foo:function (){},
}
判断某个属性是否存在于对象中,可以用in运算符,hasOwnProperty()和propertyIsEnumerable()
使用格式:
"v" in obj;
"foo" in obj;
obj.hasOwnProperty("v");
obj.hasOwnProperty("foo");
propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到这个自有属性的可枚举性为true时才会返回true;
page130 可枚举性
for/in循环可以在循环体中遍历所有可枚举的属性(包括自有属性和继承的属性)
var obj={
v:"变量",
foo:function (){},
}
for(p in obj){
console.log(p);
}
object.create(obj);用于创建一个继承至obj的对象
page132 属性的setter和getter
var o={
$x:"我是o",
get getX(){
return this.$x;
},
set setX(x){
this.$x=x;
}
};
调用时:
console.log(o.getX);
o.setX="new Obj";
console.log(o.setX);
6.7属性的特性
对象的属性有四个特性:(1)值(2)可写性writeable(3)可枚举性(4)可配置性
var txt=Object.getOwnPropertyDescriptor({x:1},"x");
console.log(txt);
上面语句可用于查询一个对象的某个属性(自有属性,访问不到继承属性)的四大特性。
原型:
通过字面量创建的对象采用 Object.prototype 作为原型
通过new创建的对象采用构造函数的原型
通过object.create()创建的对象使用第一个参数作为创建的对象的原型。
序列化对象:
str=JSON.stringify(o);
p=JSON.prase(str);
page144 数组
数组的创建
a.直接使用方括号,数组可以存储不同类型的元素
var empty=[];
var primes=[1,2,3,4,5];
var misc=[1,true,2,"a"];
b.数组直接量可以不为常数
var base=1024;
var arr=[base,base+1,base+2,base+3]
c.数组可以包含数组or对象字面量
var foo=[[1,2,3],{x:1,y:2},[{foo:function...},{foo2:function...}]]
d.利用Array构造函数创建,调用时可以有个数值参数,为数组的长度
var arr1=new Array();
var arr2=new Array(10);
数组是对象的特殊形式,使用方括号访问数组元素就像用方括号访问对象的属性一样
对一个常规对象
var o={};
o[1]="one";
数组就是将索引值变成字符串
数组于常规对象的不同之处在于,使用2^32以内的非负整数作为属性名时,会自动维护其length的属性值
事实上数组的索引与对象的属性名并无不同之处,所以数组的访问也不存在越界一说
访问不存在的数组索引就像访问没定义的对象属性一样,返回undefined
数组属性length的特殊行为
a=[1,2,3,4,5];
a.length=3;//此时数组中只存在[1,2,3]
a.length=0;//此时数组中不存在元素
a.length=5;//数组等价于new Array(5)
给数组的length赋值会改变数组的内容
在E5中 可以让数组的length属性变为只读的
a=[1,2,3];
Object.defineProperty(a,"length",{writable:false});
这样数组的长度就不可以改变了
给一个定义了只读的数组push元素,程序会报错
pop()对应push("param"),push在数组尾部加上"param"元素,而pop()则删除数组最后一个元素,并返回这个删除的元素
shift()于unshift(),shift用于删除数组的第一个元素,并将后面的元素索引往前移动。而unshift则添加参数。
常用数组方法:
1.Array.join();
将数组中所有元素转化成字符串并拼接在一起
当其中有参数时,用参数字符串分割各元素;无参数时,默认为逗号:例如"1,2,3,4,5" "1-2-3-4-5"
2.Array.reverse();
将数组颠倒顺序
3.Array.sort(function);
排序,当没有参数时,以字母表顺序排序,undefined排在最后
当要求以字母表顺序排序时,需指定一个比较函数传进sort()内;
var a=[22,3,444,1111];
a.sort();//字母表排序
for(var i=0,len=a.length;i<len;i++) console.log(a[i]);
a.sort(function(a,b) {return b-a});//函数返回正值,b在a之前,返回负值,b在a只后
将字符串按忽略大小写的字母表排序
var str=["ant","Bug","Dog","cat"];
str.sort(function(s1,s2){
st1=s1.toLowerCase();
st2=s2.toLowerCase();
if(st1>st2)return 1;
if(st1<st2)return -1;
return 0;
})
for(var i=0,len=str.length;i<len;i++) console.log(str[i]);
4.Array.contact()创建并返回一个新数组
5.Array.slice()返回指定数组的子数组
Array.splice()与slice功能相似,但是splice会修改母数组
ECMA5中定义的数组方法:
1.forEach(function(v,i,arr){
arr[i]=v+1;
});//回调函数读取v 元素值,i 元素索引,arr数组本身
//模拟实现
var o = {
forEach: function (callback) {
// alert(this.length);
for (var i = 0, len = this.length; i < len; i++) {
callback && callback(this[i], i, this);
}
},
get length(){
var sum=0;
for(var n in this) {
sum+=1;
}
return sum;
}
};
Object.defineProperty(o,"length",{enumerable:false});
Object.defineProperty(o,"forEach",{enumerable:false});
/* 特别注意defineProperty和defineProperties的使用
Object.defineProperties(o,{
length:{enumerable:false},
forEach:{enumerable:false}
});
*/
o[0] = 0;
o[1] = 1;
o[2] = 2;
o.forEach(function(v,i,arr){
arr[i]=v+1;
console.log(arr[i]+"callback");
});
2.map()
调用示例:
a=[1,2,3];
b=a.map(function(x){return x*x;});
map返回一个数组,一个元素值在回调函数操作过后的数组
//模拟实现
map:function(callback){
var temp=[];
for (var i = 0, len = this.length; i < len; i++) {
temp[i]=callback && callback(this[i]);
}
return temp;
},
3. filter()
every()
some()
数组对象的一些方法
isArray()