gpt4 book ai didi

javascript:防止将添加的数组属性表示为元素(在 Chrome 中)

转载 作者:行者123 更新时间:2023-11-30 12:52:26 25 4
gpt4 key购买 nike

我正在使用此代码段通过 getUnique 函数扩展 Array 的功能:

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;
};

轻微的缺点是属性 getUnique 与数组元素一起打印,如果我 console.log 一个数组:

["126", "125", getUnique: function]

即使我知道 getUnique 不被视为数组元素,这还是有点令人不安。这发生在 Chrome 中。据我所知,不在 Firefox 中。有什么办法可以预防吗?

最佳答案

使用Object.definePropertyenumerable:

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 浏览器和其他移动设备可能无法使用此代码。这就是为什么有些人建议不要扩展 native 构造函数的原型(prototype)的原因之一,因为这个问题可能会破坏针对这些问题构建得不好的代码。相信这一点的人通常建议不要将功能放在原型(prototype)上:

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:防止将添加的数组属性表示为元素(在 Chrome 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20491723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com