-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JS-Array #100
Comments
方法ES3/5/next都提供了不少方法,每个阶段提供的方法都有当时的时代性和局限性:
ES3主要是操作元素相关的方法 1.
|
练习数组去重var a = [1, 2,3,4,3,2]
// ES3
for(var i = 0,len = a.length; i !== len; ++i) {
if(b.indexOf(a[i]) === -1) {
b.push(a[i])
}
}
// ES5
var b = a.reduce((result, item) => {
if(result.indexOf(item) === -1) {
result.push(item)
}
return result
}, [])
// ES6
var a = Array.from(new Set(a)) 1. 利用排序减少遍历次数var b = a.sort().reduce((result, item) => {
if(result[result.length -1 ] !== item) {
result.push(item)
}
return result
}, []) 2. 高性能数组去重除了1,2还有其他多种方式史上最全JavaScript数组去重的十种方法(推荐)各种方法的性能PK见JavaScript 高性能数组去重。
// case1
Array.from(new Set(arr));
// case2
[...new Set(arr])]; 优化方案总结去重方案一般涉及双层遍历(除了ES6的方式
第一层遍历避免不了(并且一次遍历性能也没问题),主要看怎么优化第二层遍历(Array自带的诊断方法基本上都是基于遍历的,实际没有优化):
var obj = {}
function include(arr, ele) {
if(ele in obj) {
return true;
}
obj[ele] = void 0;
return false;
} 缺点:只针对基本类型数据
按顺序运行Promise涉及元素前后依赖的都可以借助 |
练习1. 输出结果Daily-Interview-Question-66[3, 15, 8, 29, 102, 22].sort() 2. 输出结果Daily-Interview-Question-76var obj = {
'2': 3,
'3': 4,
'length': 2,
'splice': Array.prototype.splice,
'push': Array.prototype.push
}
obj.push(1)
obj.push(2)
console.log(obj) 3. 数组里面有10万个数据,取第一个元素和第10万个元素的时间相差多少没差别。 4. 有以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
}; |
一、JS没有“真正的数组”
像C++,Java这些编程语言中数组元素分配的内存都是连续,这有利于性能提升,但是JS的数组不是这样的。它使用对象模拟数组,即对象属性为数字,并含有length属性。所以JS数组对象的内存不是连续的,同一般对象内存分配。
二、创建数组
2.1 字面量方式
2.2 使用构造函数Array
new Array()
等价于直接调用Array()
;三、索引和属性名称
注意:
3.2 稀疏数组
JS数组元素不一定是连续的,索引位置上没有元素(没有元素跟取值是undefined的元素是不同的)的数组叫稀疏数组。
注意:
四、
length
属性4.1
length
属性length
属性表示“数组元素的数量”,JS的数组元素并不是连续的,有些索引的位置可能没有元素,所以length
属性并不能真正表示元素的数量,其值等于数组最大索引+1
。可以利用修改
length
修改进行删除元素(甚至清空数组)4.2 伪数组
广义上只要含有length属性且
length
值是在索引有效取值范围内(或可以通过类型转换成有效索引)的对象都可以视为伪数组。伪数组可以应用数组的一些方法:五、JavaScript 数组 —— 演进&性能
现代浏览器已经针对相同类型的数组进行了优化。
参考
The text was updated successfully, but these errors were encountered: