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()
时间: 2024-09-28 04:18:51