【Js-Javascript】 关于hasOwnProperty和IndexOf的性能对比

【Js-Javascript】 关于hasOwnProperty和IndexOf的性能对比

(ps:不要吐槽我的标题,js-JavaScript 只是为了方便搜索而已,如果你能看到这篇文章,那么它的作用就体现了,:) )

今天做了一个小测试(测试环境node),测试了js的hasOwnProperty和indexOf的性能对比。先来看一下简单的测试demo

let arr = [];
for(let i = 1;i <= 1000000;i++) {
  arr[i] = i;
}

console.time("indexOf");
arr.indexOf(1000000)
console.timeEnd("indexOf");

console.time('hasOwnProperty')
arr.hasOwnProperty(1000000)
console.timeEnd('hasOwnProperty')

给一个数组赋值了1000k个数,获取最后一个数的下标,查看消耗的时间

打印结果:

indexOf: 1.252ms
hasOwnProperty: 0.008ms

indexOf的时间不是很稳定,有时候会飙到2ms多(这大概和机器的执行环境有关),但是对比起来,和hasOwnProperty就相差很大了,hasOwnProperty直接是微秒级别。

到底为什么会有这么大的差异。emmm,首先看一下indexOf和hasProperty的原理。

indexOf做的事情就是遍历整个数组,找到需要访问的数的位置,然后返回它的下标,这种情况下时间复杂度可以达到O(n)。

而hasOwnProperty就不同了,数组可以看作是一个键值对,键是数组的下标,值是对应下标的值,这样的话就很容易做hash,时间复杂度可以达到n(1)。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: for in 循环是用来遍历对象属性的。它会循环遍历对象自身的和继承的可枚举属性(不包括 Symbol 属性)。 for of 循环是用来遍历可迭代对象的(包括 Array、Map、Set、String 等)。它可以直接获取对象的值。 举个例子,如果你要遍历一个数组,你可以使用 for in 循环: ``` let array = [1, 2, 3]; for (let index in array) { console.log(index); // 0, 1, 2 } ``` 但是,如果你使用 for of 循环,你就可以直接获取数组中的值: ``` let array = [1, 2, 3]; for (let value of array) { console.log(value); // 1, 2, 3 } ``` ### 回答2: 在JavaScript中,`for...in`和`for...of`是用于遍历数组和对象的两种不同的语句。 1. `for...in`循环用于遍历对象的可枚举属性。它是通过迭代对象的键来进行循环的。例如: ```javascript let obj = { a: 1, b: 2, c: 3 }; for (let key in obj) { console.log(key); // 输出 a, b, c } ``` `for...in`循环还可以遍历数组,但它循环的是数组的索引,而不是数组的元素。 2. `for...of`循环用于遍历可迭代对象的元素。它是通过迭代对象的值来进行循环的。例如: ```javascript let arr = [1, 2, 3]; for (let value of arr) { console.log(value); // 输出 1, 2, 3 } ``` `for...of`循环可以用于遍历数组、字符串、Map、Set等可迭代对象的元素。 总结来说,`for...in`循环遍历对象的键,而`for...of`循环遍历可迭代对象的值。在遍历数组时,`for...in`循环会遍历索引,而`for...of`循环会遍历元素值。 ### 回答3: 在JavaScript中,for...in和for...of是两种不同的循环语句,用于遍历对象和数组。 for...in循环语句是用来遍历对象的属性,它根据对象的属性列表进行迭代。每次迭代时,它将返回对象的每个可枚举属性的键(key)。例如: ```javascript const obj = { a: 1, b: 2, c: 3 }; for (const key in obj) { console.log(key); // 输出:a, b, c } ``` 需要注意的是,for...in循环不仅迭代对象的自有属性,还会迭代继承的属性,所以在使用时需要进行属性过滤或使用`hasOwnProperty()`方法来判断是否为自有属性。 for...of循环语句则是用来遍历可迭代对象,比如数组、字符串、Set、Map等。在每次迭代时,它将返回对象的每个元素值。例如: ```javascript const arr = [1, 2, 3]; for (const value of arr) { console.log(value); // 输出:1, 2, 3 } ``` for...of循环只能遍历可迭代对象的值,而不能获取其索引或键。如果需要获取数组的索引,可以结合使用`entries()`方法: ```javascript const arr = [1, 2, 3]; for (const [index, value] of arr.entries()) { console.log(index, value); // 输出:0 1, 1 2, 2 3 } ``` 总结起来,for...in适用于遍历对象的属性,而for...of适用于遍历可迭代对象的元素值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值