计算机对于大批量数据的处理速度比起人类不知道快了多少,因此对于重复的操作,使用循环语句处理是很方便的,对于我们前端来说,给同一标签的元素绑定事件啦,tab切换啦,左右联动效果啦,等等都可以使用循环语句处理。js里边最基础的循环语句就是for和while两个了,其他的诸如:for... in遍历对象 ,for...of遍历数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)等,在此不作讨论。

for( 初始值...;条件...;某一增量...)

首先谈一下for循环,对于for循环来说,基本结构如上所示,三条语句都不是必须的,但是两个分号是必须的。(昨天撸了半天的文字忘记点修改了,结果php博客的本地保存功能一点都不好使,哎,今天继续码吧)

对于for循环来说,执行的时候小括号里边的前两条语句顺序执行,如果满足第二条条件语句,就执行循环体,完毕执行之后再做增量运算,然后重复以上步骤。而在这里边我要额外多说几句的是前后缀运算符的使用,因为我发现很多非科班出身的程序猿确实对这个不会,举个例子很容易就看明白了;

let a = 0,b = 0;
console.log( a++ ); //0
console.log( ++b ); //1
a; //1
b;//1

其实就是对值得引用时机不同,前缀运算符和变量那个在前就先引用谁的值。通常我们会使用for循环遍历一个数组,或者类数组对象,在写这篇文章的时候我也想到了一个遍历数组的方法:

function iteratorArr ( arr ) {
    if( !arr.length )
        return;
     let len = arr.length;
     if( len % 2 == 0 ){//偶数个元素
         for( let i = 0 ; i < len / 2 ; i++ ){
             arr[i];
             arr[len-i-1];
         }
     }else{//奇数个元素
         for( let i = 0 ; i <= (len - 1) /2; i++ ){
             if( i == (len - 1) /2 ){
             }else{
                 arr[i];
                 arr[ len - i -1 ];
             }
         }
     }
}

这个方法在10000000数量级以下的遍历数组中(我做的是累加操作),比传统for循环慢点,1000000个数的时候,比传统的慢了1毫秒,等于10000000这个数量级的时候比传统的for遍历数组快了两毫秒。测试环境实在chrome的console环境里弄的。所以处理轻量级的数据用for直接遍历就行了。貌似我们前端处理的数据量也远远没有这么高,所以这个方法基本作废,另外,其实我就是把一个数组一分为二,一次循环期间对数组的两个元素做一次操作,然而这样一个问题是,假如按照我的思路:就是假设一次循环操作的元素越多,那么算法性能越好的话,那么三分法,四分法,甚至五分法是不是性能会更优一点 ? 到底有没有最优解,这个我目前没法判断出来,而且,依照上面的判断的话,这样一直分下去似乎是一个无解的题,所以上面这个方法纯属自娱自乐了。但是于我个人而言,还是想写在这篇文章里,因为死了几个脑细胞啊。

值得一说的是,任何东西都会产生一个瓶颈问题,正是因为量变产生质变,为了解决性能问题,所以才产生了这些人类的智慧结晶,比如基本的查找排序算法,鉴于前边谈了一大堆的废话,下面介绍一个比较有意思的算法题(也算比较经典):

题目描述:简而言之就是在一个从左到右,从上到下递增的的二维矩阵里边找到一个值,而要求算法的时间复杂度为O(n).

//解法示例
function searchIndex ( arr, key ){
    let rows = arr.length - 1;
    let cols = arr[0].length-1,i = 0,j = cols ;
    while(  i <= rows && j >= 0){
        if(  key >  arr[i][j]){    
            i++;
        }else if( key < arr[i][j] ){
            j--;
        }else{
            return { i,j }
        }
    }
    return false;
}

这个解法是一种经典解法,用了两个指针,说到这里不得不提一个东西 --- 就是思维固化,人很容易思维固化的,乃至于你使用for循环的时候最开始的三条语句除了初始值,判断条件,增量之外写不出其他,一个tab除了全部隐藏,再显示的写法之外不会考虑其他的,是的,思维固化很可怕,但也很正常,在日复一日的码畜工作中逐渐丧失自我,不会思考。所以你的思维需要有东西去扩展,去打破,多看看那些经典算法是一个很不错的解决方案。回到上面那个问题,一般而言你往一个n*n的二维数组里找一个元素使用两重for循环是轻而易举的事,但是时间复杂度是o(n^2)的,浙大的陈姥姥说过,一旦出现这种复杂度的算法你就要警惕了,作为一个成熟的程序猿你得学会优化啊。而使用了两个指针之后,整个代码复杂度就降下来了 。当然这是一种特殊情况。

while

基本用法
while(expression){ 
    ...
    ...
 }

执行过程:先检测expressioin的值是否为true来决定是否执行循环体,说实话,我个人不怎么用。

基本循环语句先到这里,以后想到的话再补充。

js回忆录(3) -- 循环语句,前后缀运算符的更多相关文章

  1. js种的循环语句

    //js种的循环语句 //while与do while的区别是while是满足条件后才执行 //do while是不管满不满足条件都会执行一次 //for 循环与while,do while相比循环结 ...

  2. js中的循环语句

    js中的循环语句可分为三种:1.while:2.do……while:3.for. while的语法为 while (exp) {    //statements;} var a=1,b=0; whil ...

  3. mybatis循环生成前后缀:mapper.xml的<trim></trim>

    *在mapper.xml中<trim prefix="(" suffix=")" suffixOverrides="," prefix ...

  4. JS基础语法---循环语句之:for 循环 + 9个练习

    for循环 语法: for(表达式1;表达式2;表达式3){ 循环体; } 执行过程: 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环 如果表达式2成立,执行循环体的代码,结束后,跳到 ...

  5. js的几种循环语句

    //js种的循环语句 //while与do while的区别是while是满足条件后才执行 //do while是不管满不满足条件都会执行一次 //for 循环与while,do while相比循环结 ...

  6. HTML基础--JS简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、数组、函数、函数调用.avi

    JS简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司(已被Oracle收 ...

  7. js简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、函数、函数调用

    javascript是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 三个常用对话框 alert("")警告对话框,弹出一个警告对话框 <script> al ...

  8. JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构

    JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...

  9. PHP变量、数据类型、字符串、运算符、条件语句、循环语句、数组、函数

    PHP 简介: php :是一门动态交互的计算机语言  静态交互 html  css  js 但凡是动态交互的 都需要服务器. php都是以.php结尾的文件 Html文件里不能写php代码,但是ph ...

  10. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等

    [源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native  ...

随机推荐

  1. Iframe标签显示目标网页的指定区域,视频可全屏可缩小

    由于播放的直播视频有多余的logo和聊天框等所以需要去掉,用Iframe标签显示目标网页的指定区域,视频可全屏可缩小 用自己私人的服务器来测试吧,99买阿里云 HTML代码 <html> ...

  2. PHP API接口数据简单快速的加密解密

    php7.0版本以上不支持mcrypt_encryp函数进行加密的代码,加密方式改为openssl_encrypt 用自己私人的服务器来测试吧,99买阿里云 openssl_系列支持php5.3以上版 ...

  3. Qt编写的项目作品32-定制化安装包工具(雨田哥作品)

    一.功能特点 纯Qt编写,跨平台. 支持自定义安装目录等. 安装和卸载界面可自定义. 一键式脚本build.bat,生成安装包EXE. 兼容XP系统. 支持配置文件填充安装包信息. 指定应用程序中文名 ...

  4. com.mysql.cj.jdbc.Driver和com.mysql.jdbc.Driver的区别

    今天写东西测试的时候发现一个问题,如下: application.yml中数据源是这样配置的: 第一反应就是记忆中连接mysql的驱动不都是com.mysql.jdbc.Driver吗?com.mys ...

  5. 使用ollama玩转本地大模型

    使用ollama玩转本地大模型 https://ollama.com/download 安装 安装验证 测试 ollama run llama2 ollama run qwen

  6. 在shell脚本中为日志添加颜色

    在 Shell 脚本中,可以通过添加 ANSI 转义序列来为日志输出添加颜色.以下是一个完整的 Shell 脚本示例,包含日志颜色定义.日志函数封装以及使用示例: 完整脚本:colored_logs. ...

  7. h5 canvas 视频透明度抠图,视频需要一个灰度通道副本表示透明度

    视频透明度抠图,视频需要一个灰度通道副本表示透明度 目前抖音等直播平台的礼物特效就是这个方法处理的 <!DOCTYPE html> <html> <head> &l ...

  8. 学Shiro完结版-2

    第四章 INI配置--<跟我学Shiro> 之前章节我们已经接触过一些INI配置规则了,如果大家使用过如Spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即 ...

  9. 第六章 (Nginx+Lua)Web开发实战HTTP服务

    此处我说的HTTP服务主要指如访问京东网站时我们看到的热门搜索.用户登录.实时价格.实时库存.服务支持.广告语等这种非Web页面,而是在Web页面中异步加载的相关数据.这些服务有个特点即访问量巨大.逻 ...

  10. SQL SERVER日常运维(一)

    以下语句请使用SA用户或者有DBA权限的用户进行执行,否则可能会出现权限不足报错 一.基础命令 查看当前数据库的版本 SELECT @@VERSION; 查看服务器部分特殊信息 select SERV ...