前端循环全解析:JS/ES/TS 循环写法与实战示例

循环是编程中控制流程的核心工具。本文将详细介绍 JavaScript、ES6+ 及 TypeScript 中各种循环的写法、特性,并通过实际示例帮助你掌握它们的正确使用姿势。


目录

  1. 传统三剑客

    • for 循环

    • while 循环

    • do...while 循环

  2. ES6 新特性

    • forEach

    • for...of

    • for...in

  3. 数组高阶方法

    • map

    • filter

  4. TypeScript 特别注意事项

  5. 循环对比与选择指南


一、传统三剑客

1. for 循环

特性

  • 最基础的循环结构

  • 明确控制循环次数

  • 支持 break 和 continue

// JavaScript
for (let i = 0; i < 5; i++) {
  console.log(i); // 0-4
}

// TypeScript
const items: number[] = [10, 20, 30];
for (let i: number = 0; i < items.length; i++) {
  console.log(items[i]);
}

2.

(!) Failed to run dependency scan. Skipping dependency pre-bundling. Error: The following dependencies are imported but could not be resolved: @/views/HomeView.vue (imported by D:/Vuezy/learn-plan-system/src/router/index.js) @/views/AddTaskView.vue (imported by D:/Vuezy/learn-plan-system/src/router/index.js) Are they installed? at file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:11238:33 at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:34671:15 23:35:49 [vite] (client) Pre-transform error: Failed to resolve import "@/views/HomeView.vue" from "src/router/index.js". Does the file exist? Plugin: vite:import-analysis File: D:/Vuezy/learn-plan-system/src/router/index.js:2:22 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import HomeView from '@/views/HomeView.vue' | ^ 3 | import AddTaskView from '@/views/AddTaskView.vue' 4 | 23:35:49 [vite] Internal server error: Failed to resolve import "@/views/HomeView.vue" from "src/router/index.js". Does the file exist? Plugin: vite:import-analysis File: D:/Vuezy/learn-plan-system/src/router/index.js:2:22 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import HomeView from '@/views/HomeView.vue' | ^ 3 | import AddTaskView from '@/views/AddTaskView.vue' 4 | at TransformPluginContext._formatLog (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:31446:43) at TransformPluginContext.error (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:31443:14) at normalizeUrl (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:29992:18) at async file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:30050:32 at async Promise.all (index 1) at async TransformPluginContext.transform (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:30018:4) at async EnvironmentPluginContainer.transform (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:31260:14) at async loadAndTransform (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:26434:26) at async viteTransformMiddleware (file:///D:/Vuezy/learn-plan-system/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:27519:20) 23:35:49 [vite] (client) ✨ new dependencies optimized: vue, pinia, vue-router
最新发布
06-27
import { resolve } from 'path'; import { loadEnv } from 'vite'; import type { UserConfig, ConfigEnv } from 'vite'; import Vue from '@vitejs/plugin-vue'; import VueJsx from '@vitejs/plugin-vue-jsx'; import progress from 'vite-plugin-progress'; import EslintPlugin from 'vite-plugin-eslint'; import { ViteEjsPlugin } from 'vite-plugin-ejs'; import { viteMockServe } from 'vite-plugin-mock'; import PurgeIcons from 'vite-plugin-purge-icons'; import ServerUrlCopy from 'vite-plugin-url-copy'; import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'; import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; import { createStyleImportPlugin, ElementPlusResolve, } from 'vite-plugin-style-import'; import UnoCSS from 'unocss/vite'; import { visualizer } from 'rollup-plugin-visualizer'; // https://vitejs.dev/config/ import process from 'node:process'; import Federation from '@originjs/vite-plugin-federation'; import exposes from './exposes'; const root = process.cwd(); function pathResolve(dir: string) { return resolve(root, '.', dir); } export default ({ command, mode }: ConfigEnv): UserConfig => { let env = {} as any; const isBuild = command === 'build'; if (!isBuild) { env = loadEnv( process.argv[3] === '--mode' ? process.argv[4] : process.argv[3], root, ); } else { env = loadEnv(mode, root); } return { base: env.VITE_BASE_PATH, plugins: [ Vue({ script: { // 开启defineModel defineModel: true, }, }), VueJsx(), ServerUrlCopy(), progress(), env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'false' ? createStyleImportPlugin({ resolves: [ElementPlusResolve()], libs: [ { libraryName: 'element-plus', esModule: true, resolveStyle: (name) => { if (name === 'click-outside') { return ''; } return `element-plus/es/components/${name.replace( /^el-/, '', )}/style/css`; }, }, ], }) : undefined, EslintPlugin({ cache: false, failOnWarning: false, failOnError: false, include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'], // 检查的文件 }), VueI18nPlugin({ // runtimeOnly: true, compositionOnly: true, include: [resolve(__dirname, 'src/locales/**')], }), createSvgIconsPlugin({ iconDirs: [pathResolve('src/assets/svgs')], symbolId: 'icon-[dir]-[name]', svgoOptions: true, }), PurgeIcons(), env.VITE_USE_MOCK === 'true' ? viteMockServe({ mockPath: 'mock', enable: !isBuild, }) : undefined, ViteEjsPlugin({ title: env.VITE_APP_TITLE, }), UnoCSS({ mode: 'global' }), Federation({ name: 'purchasecenter', filename: 'remoteEntry.js', exposes, }), ], css: { preprocessorOptions: { scss: { additionalData: '@use "@/styles/variables.module.scss" as *;', }, }, }, resolve: { extensions: [ '.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css', ], alias: [ { find: 'vue-i18n', replacement: 'vue-i18n/dist/vue-i18n.cjs.js', }, { find: /\@\//, replacement: `${pathResolve('src')}/`, }, ], }, esbuild: { pure: env.VITE_DROP_CONSOLE === 'true' ? ['console.log'] : undefined, drop: env.VITE_DROP_DEBUGGER === 'true' ? ['debugger'] : undefined, }, build: { target: 'es2015', outDir: env.VITE_OUT_DIR || 'dist', sourcemap: env.VITE_SOURCEMAP === 'true', minify: false, // brotliSize: false, rollupOptions: { plugins: env.VITE_USE_BUNDLE_ANALYZER === 'true' ? [visualizer()] : undefined, // 拆包 output: { manualChunks: { 'vue-chunks': ['vue', 'vue-router', 'pinia', 'vue-i18n'], 'element-plus': ['element-plus'], 'wang-editor': ['@wangeditor/editor', '@wangeditor/editor-for-vue'], echarts: ['echarts', 'echarts-wordcloud'], }, }, }, cssCodeSplit: !(env.VITE_USE_CSS_SPLIT === 'false'), cssTarget: ['chrome31'], }, server: { port: 4000, proxy: { // 选项写法 '/api': { target: 'http://10.114.72.169:8080', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''), }, '/be-saleslink-masterdata-product': { target: 'https://saleslink-dev.byd.com/', changeOrigin: true, }, // '/sales-link-masterdata': { // target: 'http://10.114.72.87:8080', // changeOrigin: true, // }, '/sales-purchase': { target: 'https://saleslink-dev.byd.com', // target: 'http://10.114.72.113:8080', changeOrigin: true, }, '/sales-vehicle': { target: 'https://saleslink-dev.byd.com', changeOrigin: true, }, '/sales-operation': { target: 'https://saleslink-dev.byd.com', // target: 'http://10.114.72.23:8080', changeOrigin: true, }, '/confcntr': { target: 'https://saleslink-dev.byd.com', changeOrigin: true, }, '/sales-stock': { target: 'https://saleslink-dev.byd.com', changeOrigin: true, }, '/saleslink-sku': { target: 'https://saleslink-dev.byd.com/', changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/saleslink-sku/, ''), }, }, hmr: { overlay: false, }, host: '0.0.0.0', }, optimizeDeps: { include: [ 'vue', 'vue-router', 'vue-types', 'element-plus/es/locale/lang/zh-cn', 'element-plus/es/locale/lang/en', '@vueuse/core', 'axios', 'qs', 'echarts', 'echarts-wordcloud', 'qrcode', '@wangeditor/editor', '@wangeditor/editor-for-vue', 'vue-json-pretty', '@zxcvbn-ts/core', 'dayjs', 'cropperjs', ], }, }; }; 这是vite.config.ts 现在想要连接后端的本地,怎么修改
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念九_ysl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值