|
| 1 | +/** |
| 2 | + * 枚举属性 by Think on 2016/7/13. |
| 3 | + */ |
| 4 | + |
| 5 | +/** |
| 6 | + * for/循环可以在循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性), |
| 7 | + * 把属性名称赋值给循环变量。对对象继承的方法不可枚举,但是在代码中给对象添加的属性是可以枚举。 |
| 8 | + * @type {{x: number, y: number, z: number}} |
| 9 | + */ |
| 10 | +var o = { x: 1, y :2, z: 3}; // 三个可枚举的自有属性 |
| 11 | +console.log(o.propertyIsEnumerable("toString")); // =>false ,不可枚举 |
| 12 | +for(var p in o) |
| 13 | +console.log(p) // 输出x、y和z |
| 14 | + |
| 15 | +/** |
| 16 | + * 对对象的属性(非自有属性)过滤,常见两种方式: |
| 17 | + */ |
| 18 | + |
| 19 | +// 方式一: |
| 20 | +for(p in o){ |
| 21 | + if(!o.hasOwnProperty(p)) continue; // 跳过继承属性 |
| 22 | + console.log("方式一:",p); |
| 23 | +} |
| 24 | + |
| 25 | +for(p in o){ |
| 26 | + if( typeof o[p] === 'funciton' ) continue; // 跳过函数方法 |
| 27 | + console.log("方式二:",p); |
| 28 | +} |
| 29 | + |
| 30 | + |
| 31 | +// 用来枚举属性的对象工具函数 |
| 32 | + |
| 33 | +/** |
| 34 | + * 把p中的可枚举属性复制到o中,并返回o |
| 35 | + * 把o和p中含有同名属性,并覆盖ozho |
| 36 | + * 备注:不能解决IE中的bug |
| 37 | + * @param o |
| 38 | + * @param p |
| 39 | + */ |
| 40 | +function extend(o,p){ |
| 41 | + for (var prop in p){ // 遍历p中的所有属性 |
| 42 | + o[prop] = p[prop]; // 遍历属性添加至o中 |
| 43 | + } |
| 44 | + return o; |
| 45 | +} |
| 46 | + |
| 47 | +/** |
| 48 | + * 将p中的可枚举属性复制到o中,并返回o |
| 49 | + * 如果o和p中同名的属性,o中的属性将不受影响 |
| 50 | + * 这个函数并不处理setter和getter以及复制属性 |
| 51 | + * @param o |
| 52 | + * @param p |
| 53 | + */ |
| 54 | +function merge(o,p){ |
| 55 | + for(prop in p ){ // 遍历p中所有属性 |
| 56 | + if(p.hasOwnProperty(prop)) continue; // 过滤已经在o中存在的属性 |
| 57 | + o[prop] = p[prop]; // 将属性添加至0中 |
| 58 | + } |
| 59 | + return o; |
| 60 | +} |
| 61 | + |
| 62 | +/** |
| 63 | + * 如果o中的属性没有在p中没有同名的属性,则从o中删除这个属性 |
| 64 | + * @param o |
| 65 | + * @param p |
| 66 | + * @returns {*} |
| 67 | + */ |
| 68 | +function restrict(o,p) { //限制 |
| 69 | + for(prop in o) { // 遍历o中的所有的属性 |
| 70 | + if(! (prop in p)) delete o[prop]; // 如果在p中不存在,则删除 |
| 71 | + } |
| 72 | + return o; |
| 73 | +} |
| 74 | + |
| 75 | +/** |
| 76 | + * 如果o中的属性在p中存在同名的属性,则从o中删除这个属性 |
| 77 | + * return 0 |
| 78 | + */ |
| 79 | +function subtract(o,p) { // 减去 |
| 80 | + for(prop in p){ // 遍历p中的所有属性 |
| 81 | + delete o[prop]; // 从o中删除(删除一个不存在的属性不会报错) |
| 82 | + } |
| 83 | + return 0; |
| 84 | +} |
| 85 | + |
| 86 | +/** |
| 87 | + * 返回一个新对象,这个对象同时拥有o的属性和p的属性 |
| 88 | + * 如果o和p有重名属性,使用p中的属性值 |
| 89 | + * @param o |
| 90 | + * @param p |
| 91 | + * @returns {*} |
| 92 | + */ |
| 93 | +function union(o,p){ |
| 94 | + return extend(extend({},o),p); |
| 95 | +} |
| 96 | + |
| 97 | +/** |
| 98 | + * 返回一个新对象,这个对象拥有同时o和的出现的属性 |
| 99 | + * 像求o和p的交集,但是p中的属性值忽略 |
| 100 | + */ |
| 101 | +function intersection(o,p){ |
| 102 | + return restrict(extend({},o),p); |
| 103 | +} |
| 104 | + |
| 105 | +/** |
| 106 | + * 返回一个数组,这个数组包含是的o中可枚举的自有属性的名称 |
| 107 | + * @param o |
| 108 | + * @returns {Array} |
| 109 | + */ |
| 110 | +function keys(o){ |
| 111 | + if (typeof o !== "object" ) throw TypeError(); // 参数必须是对象 |
| 112 | + var result = []; // 属性数组 |
| 113 | + for( var prop in o ){ |
| 114 | + if(o.hasOwnProperty(prop)) result.push(prop); |
| 115 | + } |
| 116 | + return result; |
| 117 | +} |
| 118 | + |
| 119 | +// ECMAScript5定义了两个个用以枚举属性名称的函数 |
| 120 | +// 第一个:Object.keys( o ); |
| 121 | +// 第二个:Object.getOwnPropertyNames( o ); |
| 122 | +console.log("Object keys:", Object.keys(o)); |
| 123 | +console.log("Object keys:", Object.getOwnPropertyNames(o)); |
| 124 | + |
| 125 | + |
| 126 | + |
| 127 | + |
| 128 | + |
| 129 | + |
| 130 | + |
0 commit comments