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 ...
随机推荐
- Qt编写linux上视频流播放器(支持海康大华宇视等各种网络摄像机)
一.前言 在windows上的视频流播放器有很多,而且各个监控厂家无论大厂还是小厂,基本上都提供了客户端,甚至很多第三方的监控平台软件厂商,也都提供了windows的版本,基本的都没有提供linux版 ...
- Qt编写地图综合应用38-覆盖物矩形
一.前言 矩形的应用场景和多边形基本一致,也是用来框起一块区域,然后根据坐标点集合,找到该区域内的标注点集合,比如指定某个县市区域多边形,然后找到这个县市对应的所有站点,拿到这些站点在做其他处理. 二 ...
- [转]Pelco-D协议使用
1.Pelco-D协议格式如下图所示: 2. 通用示例为:水平向右控制 FF address 00 02 Hspeed 00 checksum水平向左控制 FF address 00 04 Hspee ...
- IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
本文作者:丁同舟,来自金蝶随手记技术团队. 1.引言 接上篇<金蝶随手记团队的Protobuf应用实践(原理篇)>,本文将以iOS端的Objective-C代码为例,图文并茂地向您菔救绾卧 ...
- Linux 检查磁盘空间命令合集
1. DF df 是检查Linux安装程序上可用分区空间的最常用的命令之一.可以使用"df -TH"以直观易读的格式打印分区类型和分区大小.此命令将显示每个部分的总可用空间.已用空 ...
- redux初探
action是一个普通对象 里面必须有一个type字段,代表将要执行的行为,其他字段自己规划. action只是描述了将要发生的事情并不能直接修改状态 action创建函数 尽量是一个纯函数,他返回的 ...
- 变量-python
变量-python 1. 变量的定义 变量是存储数据的地方,在程序运行时,变量的值可以改变.变量的定义格式如下: 变量名 = 数据 例如: a = 10 b = "hello" c ...
- 存储过程专题(Oracle)
本文转自 https://www.cnblogs.com/lukelook/p/9600407.html,感谢博主 豆豆DE思念 整理分享. 1.Oracle 存储过程基本格式 最简单的版本 is ...
- h5使用vue-photo-preview 做全屏预览
h5页面使用全屏预览 最近需要在微信小程序中跳转到h5页面 在h5页面中需要进行图片预览展示 由于没有使用第三方的组件库. 只能手写,但是时间很紧张. 所以只能够寻找第三方的插件 vue-photo- ...
- auto-wing将AI应用于自动化项目
GitHub: https://github.com/SeldomQA/auto-wing 背景:我们之前介绍过 midsence.js AI自动化测试辅助工具,midsence.js的思路我个人是比 ...