js回忆录(3) -- 循环语句,前后缀运算符
计算机对于大批量数据的处理速度比起人类不知道快了多少,因此对于重复的操作,使用循环语句处理是很方便的,对于我们前端来说,给同一标签的元素绑定事件啦,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) -- 循环语句,前后缀运算符的更多相关文章
- js种的循环语句
//js种的循环语句 //while与do while的区别是while是满足条件后才执行 //do while是不管满不满足条件都会执行一次 //for 循环与while,do while相比循环结 ...
- js中的循环语句
js中的循环语句可分为三种:1.while:2.do……while:3.for. while的语法为 while (exp) { //statements;} var a=1,b=0; whil ...
- mybatis循环生成前后缀:mapper.xml的<trim></trim>
*在mapper.xml中<trim prefix="(" suffix=")" suffixOverrides="," prefix ...
- JS基础语法---循环语句之:for 循环 + 9个练习
for循环 语法: for(表达式1;表达式2;表达式3){ 循环体; } 执行过程: 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环 如果表达式2成立,执行循环体的代码,结束后,跳到 ...
- js的几种循环语句
//js种的循环语句 //while与do while的区别是while是满足条件后才执行 //do while是不管满不满足条件都会执行一次 //for 循环与while,do while相比循环结 ...
- HTML基础--JS简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、数组、函数、函数调用.avi
JS简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司(已被Oracle收 ...
- js简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、函数、函数调用
javascript是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 三个常用对话框 alert("")警告对话框,弹出一个警告对话框 <script> al ...
- JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构
JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...
- PHP变量、数据类型、字符串、运算符、条件语句、循环语句、数组、函数
PHP 简介: php :是一门动态交互的计算机语言 静态交互 html css js 但凡是动态交互的 都需要服务器. php都是以.php结尾的文件 Html文件里不能写php代码,但是ph ...
- 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等
[源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native ...
随机推荐
- k8s集群部署mysql完整过程记录
挂载MySQL数据卷 在k8s集群中挂载MySQL数据卷 需要安装一个NFS. 在主节点安装NFS yum install -y nfs-utils rpcbind 在主节点创建目录 mkdir -p ...
- Pytorch损失函数总结
损失函数 nn.L1Loss 创建一个衡量输入中每个元素之间的平均绝对误差 (MAE) 的标准XX和目标是的是的. nn.MSELoss 创建一个标准,用于测量输入中每个元素之间的均方误差(平方 L2 ...
- 敏捷开发:如何高效开每日站会(Daily Stand-up Meeting)
介绍 在敏捷开发框架 Scrum 中,每日站会(Daily Stand-up Meeting,又叫 Daily Scrum)是 Sprint 迭代开发中,一个很重要的流程,一个重要的例会.在有限的时间 ...
- Dynaimc CRM查找字段自定义过滤视图
实现方式参考官方文档提供的Xrm.Page.getControl(arg).addCustomView(viewId, entityName, viewDisplayName, fetchXml, l ...
- 微信小程序开发基础详解
1.结构 util.js 工具类 app.js 全局工具函数 app.json 小程序配置 app.wxss 全局样式 2.生命周期 onLoad(opt ...
- Solution -「PKUWC 2018」「洛谷 P5298」Minimax
\(\mathscr{Description}\) Link. 给定一棵二叉树,每片叶子有一个权值,所有权值互不相同.每个非叶结点 \(u\) 有一个概率 \(p_u\in(0,1)\),表示 ...
- UWP 系统通知测试
code: using System; using System.Collections.Generic; using System.IO; using System.Linq; using Syst ...
- 深度剖析 GROUP BY 和 HAVING 子句:优化 SQL 查询的利器
title: 深度剖析 GROUP BY 和 HAVING 子句:优化 SQL 查询的利器 date: 2025/1/14 updated: 2025/1/14 author: cmdragon ex ...
- Mac安装brew的四种方法(指定能行)
一,执行brew官网命令安装brew https://brew.sh/ 官网中复制下图中命令,在terminal中输入该命令,即: /bin/bash -c "$(curl -fsSL ht ...
- [车联网/以太网] SOME/IP 协议
概述: SOME/IP 协议 车载以太网协议栈总共可划分为5层: 物理层 数据链路层 网络层 传输层 应用层 其中本文所要描述的SOME/IP就是一种应用层协议. SOME/IP协议内容按照AUTOS ...