YUI.Array.dedupe函数,如果传参为有length属性,返回一个去除掉重复项('1’ 与1 | true 与'true’认为相等)的参数数组副本,如果传参的length为undefined,那么返回一个空数组[],如果传参没length属性,抛出一个类型错误
数组去重YArray.dedupe = Lang._isNative(Object.create) ? function (array) { var hash = Object.create(null), results = [], i, item, len; for (i = 0, len = array.length; i < len; ++i) { item = array[i]; if (!hash[item]) { hash[item] = 1; results.push(item); } } return results;} : function (array) { var hash = {}, results = [], i, item, len; for (i = 0, len = array.length; i < len; ++i) { item = array[i]; if (!hasOwn.call(hash, item)) { hash[item] = 1; results.push(item); } } return results;};
1. 在一个对象obj中 obj[1] === obj['1’] obj[true] === obj[‘true’]
2. 这个函数不会去比较数据类型,如果一个值在空对象中没值,则赋值为1,并将它push进数组,下次有相同的值,直接略过
3. 在现代浏览器中,可以直接调用Obejct.create(),构建一个没有原型的对象,但在ie8及以下中,直接创建一个{},每次还要用hasOwnProperty去检测是否是{}的属性,再去执行2的操作,速度减慢
对象var y = YUI()var newArr = y.Arrayarr = [1,2,3,4,5,1,'1',true.'true']str = '12345671'obj = { name: 'fsy'}arr1 = newArr.dedupe(arr) // ===> [1,2,3,4,5,true]arr2 = newArr.dedupe(str) // ====> [“1”,”2”,”3”,”4”,”5”,”6”,”7”]arr3 = newArr.dedupe(obj) // ====> []