【JS】js的for循环、for in 、 for of 详解

在做项目中,用到的最多的,莫过于 for 循环了,遍历对象常用 for in ,for of 在个人印象中 很少用到

for 循环

1、for 循环 var
let arr = new Array(9999999).fill(0);

console.time('for')
for(var i = 0; i < arr.length; i++) {}
console.timeEnd('for')  // for: 8.13818359375 ms

console.time('while')
var i = 0;
while(i < arr.length) {
  i++;
}
console.timeEnd('while') // while: 8.020751953125 ms

var 没有块级作用域概念,创建的变量是全局的。全局状态下 i 会占用一定的内存空间,不被释放的情况下,会一直占用空间

2、for 循环 let
let arr = new Array(9999999).fill(0);

console.time('for')
for(let i = 0; i < arr.length; i++) {}
console.timeEnd('for')  // for: 4.476806640625 ms

console.time('while')
let i = 0;
while(i < arr.length) {
  i++;
}
console.timeEnd('while') // while: 10.82080078125 ms

let 是块级作用域,i 属于当前循环中的变量。此次循环结束的时候,i 就被释放,不会占用空间

整体来说,for循环是最快的

for in

fon in 性能很差:迭代当前对象中中所有可枚举的属性 的 【 私有属性大部分是可以枚举的,公有属性{出现在所属类的原型上的,} 也有部分是 可枚举的 】 查找机制上一定会搞到原型链上去

  1. 遍历顺序,会以数字优先
  2. 无法遍历symbol 类型的变量
  3. 可以遍历到共有可枚举的

比如,我们通过 Oject.proptotype 定义一个fn 和一个name ,那么我们在定义一个对象,用 for in 的时候,就会遍历到它

        Object.prototype.fn = function () { }
        Object.prototype.name1 = 'ddgprop'
        let obj = {
            name: 'ddg',
            age: 21,
            [Symbol('AA')]: 100,
            0: 200,
            1: 400,
        }
        for (let key in obj) {
            // 如果 不香遍历 , 原型链上的 东西
            if (!obj.hasOwnProperty(key)) break
            console.log(key); // 输出 顺序: 0 1 name age fn name1
        }
        // console.log(obj);
        console.log(Object.keys(obj)); // 拿到当前对象的 非symbol 的所有私有属性 ,返回的结果是一个由对象属性名字组成的数组    ["0", "1", "name", "age"]
        console.log(Object.getOwnPropertySymbols(obj)); // 拿到当前对象 所有的  symbol 私有属性  [Symbol(AA)]


        // 把两个属性 拼接到一个 就得到了 所有的 私有属性
        let keys = Object.keys(obj)
        keys = keys.concat(Object.getOwnPropertySymbols(obj))
        keys.forEach(key => {
            console.log('属性名:', key)
            console.log('属性值:', obj[key]);

        })

for of

        // iterator 迭代器
        // 部分数据结构实现了 迭代器规范
        //      Symbol.iterator
        // 实现迭代器规范的有 : 数组/部分类数组/Set/Map 等等,  但是 对象 没有
        //  for of 循环 的原理  是 按照迭代器 规范遍历的
        // 只要 有 这个 Symbol.iterator 的 才可以 用 for of

        /* 
            for of  一个数组的时候
            1. 先执行 数组 的 [Symbol.iterator]() 方法
            2. 这个方法 会 返回  一个 对象, 对象里面必须有一个  next() 方法,然后执行 next() 方法。  执行一次 next() 方法,拿到结构中 的 某一项 的值 ,done:false value:每一次获取的值
        
        */

for of 可以遍历 数组,因为数组有迭代器,,但是不能遍历对象,对象,没有

总结

  • 根据所用时间排序就是 for < for of < for in

  • 其实项目中一般数据,都是数组对象的形式,所以,即使用到循环,一般也是用 forEach() 、filter()、find()、等

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaScript中,有几种方式可以跳出for循环。其中最常用的方式是使用break关键字。当条件满足时,使用break可以立即终止当前的循环,并跳出循环体执行后续的代码。例如,在给定的代码中,当j等于2时,使用break可以跳出内部的for循环。 另一种方式是使用标签(label)来标识循环体,然后在需要跳出多层循环时,使用带有标签的break语句来实现。在给定的代码中,使用黄大大作为标签,在条件满足时,使用带有黄大大标签的break语句可以跳出外部的for循环。 需要注意的是,使用return关键字可以直接结束函数的执行,并返回一个值。但是,return只能在函数内部使用,不能在循环体外使用。 因此,如果你想要在JavaScript中跳出for循环,你可以使用break关键字或者带有标签的break语句。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [js跳出循环的三种方法](https://blog.csdn.net/qq_44749901/article/details/128134916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Js之跳出for循环,跳出多次for循环详解](https://blog.csdn.net/hdp134793/article/details/124339138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值