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 ...
随机推荐
- springboot 多数据源(aop方式)
一.实现思路 在yml中定义多个数据源的配置,然后创建一个类DynamicDataSource去继承AbstractRoutingDataSource类 AbstractRoutingDataSour ...
- Qt开源作品17-IP地址输入控件
一.前言 这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式 ...
- vue.js中vue.config.js的配置说明
如果你的项目没有vue.config.js,请在根目录新建一个. vue.config.js里面的代码如下: module.exports = { /** 区分打包环境与开发环境 * process. ...
- Docker Inspect 模板
Docker 使用Go 模板,您可以使用它来操作某些命令和日志驱动程序的输出格式. Docker 提供了一组基本函数来操作模板元素.所有这些示例都使用该docker inspect命令,但许多其他 C ...
- Solution -「NOI Simu.」逆天题
\(\mathscr{Description}\) 对于 \(r=0,1,\cdots,n-1\), 设 \(\{1,2,\cdots,nm\}\) 中有 \(f_r\) 个子集满足子集内元素之和 ...
- 部署简单的单节点k8s
1.Kubernetes简介 Kubernetes,简称K8s,是用8代替名字中间的8个字符"ubernete"而成的缩写.Kubernetes是Google开源的一个容器编排引擎 ...
- Dart中操作符详细介绍和使用
dart中静态成员 1 使用satic关键字 来实现类级别的变量和函数 2 静态方法不能够访问非静态成员, 非静态方法可以访问静态成员 3 静态属性,不要通过this去访问 因为this指向的是这个实 ...
- brew切换数据源为阿里源
# 查看 brew.git 当前源 $ cd "$(brew --repo)" && git remote -v origin https://github.com ...
- Idea无法下载插件或下载插件报错
Plugin Python was not installed: Cannot download 'https://plugins.jetbrains. file -> settings -& ...
- flutter ios 深色模式下状态栏文字是白色的,白色背景下看不见
flutter ios 深色模式下状态栏文字是白色的,白色背景下看不见 theme: ThemeData( appBarTheme: const AppBarTheme( systemOverlayS ...