javascript:阻止表示添加的数组's属性作为元素(在Chrome中)
javascript: Prevent representing added Array's attributes as elements (in Chrome)
我使用这个片段来扩展Array的getUnique函数的功能:
Array.prototype.getUnique = function() {
var u = {}, a = [];
for (var i = 0, l = this.length; i < l; ++i) {
if (u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
};
一个小缺点是,如果我console.log一个数组,那么属性getUnique会与数组元素一起打印:
["126", "125", getUnique: function]
即使我知道getUnique不被视为数组元素,这也会有点令人不安。这种情况发生在Chrome中。据我所知,在Firefox中没有。有办法防止它吗?
使用Object.defineProperty
和enumerable
:
Object.defineProperty(Array.prototype, 'getUnique',
{ enumerable: false
, configurable: true
, writable: true
, value: function ()
{ var u = {};
var a = [];
for (var i = 0, l = this.length; i < l; ++i)
{ if (u.hasOwnProperty(this[i])) continue;
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
});
默认情况下,属性是可枚举的(即使它不是实例的直接属性),这意味着它可以通过数组的任何for in循环(或Object.keys
)看到。Chrome在数组上执行类似于for in循环的操作,这就是它被原样表示的原因
请注意,此功能仅适用于支持ES5的(相对)现代化浏览器,这意味着IE<9,一些较旧的Android浏览器和其他移动设备可能无法使用此代码。这就是为什么有些人建议不要扩展原生构造函数的原型的原因之一,因为这个问题可能会破坏针对这些问题构建得不好的代码。相信这一点的人通常建议不要将功能放在原型上:
function getUnique(arr)
{ var u = {};
var a = [];
for (var i = 0, l = array.length; i < l; ++i)
{ if (u.hasOwnProperty(arr[i])) continue;
a.push(arr[i]);
u[arr[i]] = 1;
}
return a;
}
我还想指出的是,getUnique
函数只会打印一个对象,因为它在技术上的实现是不正确的。类似的是,对象不是字典,只能有字符串键,这意味着任何对象(无论内容如何)都将有一个字符串值'[object Object]'
,这意味着您的函数遇到另一个对象(即使它有不同的值)时,它也不会被添加到返回的数组中。虽然效率低下,但我能想到的唯一方法是每次迭代数组:
function getUnique(arg)
{ 'use strict';
var O = Object(arg);
var len = O.length >>> 0;
var A = [];
var indexOf = function (arg, searchElement)
{ for (var i = 0, l = arg.length; i < l; ++i) if (arg[i] === searchElement) return i;
return -1;
};
for (var k = 0; k < len; ++k)
{ var elementK = O[k];
var kPresent = k in O;
if (!kPresent || indexOf(A, elementK) !== -1) continue;
A[A.length - 1] = elementK;
}
return array;
}
相关文章:
- javascript来显示元素属性
- 自定义HTML元素属性未显示-Web组件
- 主元素属性?(或技术)
- 使用模板后,使用Angular获取元素属性值
- 如何从不同范围外的元素属性中获取求值表达式
- 可以't访问元素属性(如果已明确设置)
- 传递引用 jQuery 后无法访问元素属性
- 如何替换元素属性中的部分文本
- 添加新元素属性
- 如何使用jQuery访问父元素属性
- 使用jQuery.attr()方法获取元素属性
- 修改时,哪些DOM元素属性会导致浏览器执行回流操作
- Javascript数据将元素属性绑定到URL中的锚href
- 初始化可从元素属性值观察到的Knockout
- 获取内联样式中的元素属性
- 如何在 html 元素属性中使用 Angular 2 外推法
- 将元素属性与 javascript 折叠方法结合使用时,引导折叠无法正常工作
- 如何观察聚合物元素属性值从索引.html的变化
- 使用 JavaScript 修改 DOM 元素属性
- 聚合物节点到元素属性