day002 JavaScript知识合辑01
1.简史
(1)web日益流行,人们对客户端脚本语言的需求日愈强烈,直观体现:用户为了完成简单的表单验证而进行复杂的数据交换。于是,Netscape公司着手开发一种用来处理简单表单验证操作的客户端语言,JavaScript诞生了!
(2)在Netscape Navigator 2浏览器发布前夕,Netscape为了搭上媒体炒热Java的顺风车,临时将LiveScript改名为JavaScript1.0,JavaScript1.0大获成功。随即,Netscape Navigator 3浏览器中又发布了JavaScript1.1。所以JavaScript与Java是两个完全不同的编程语言,不论是概念还是设计。JavaScript的官方名称是ECMA—262,ECMAScript 6(2015)是最新的JavaScript版本。
(3)不久,Microsoft公司在与Netscape Navigator 3竞争的自己产品Internet Explorer 3中加入了实现JavaScript功能的JScript。实际上是微软抄袭JavaScript开发出JScript语言。
(4)此时,JavaScript实现有了三个不同的JavaScript版本:Netscape Navigator 3中的JavaScript、Internet Explorer 3中JScript、ScriptEase中的CEnvi。JavaScript的标准化问题就提上了议事日程。
(5)1997年,欧洲计算机制造商协会1(ECMA)指定39号技术委员会(TC39)负责“标准化一种通用、跨平台、供应商中立的脚本语言的语义和语法”。TC39经过数月的努力完成了ECMA-262——定义一种名为ECMAScript的新脚本语言的标准。
ECMA-262定义的ECMAScript与Web浏览器没有依赖关系,Web浏览器只是可能让ECMAScript实现的一种宿主环境之一。宿主环境不仅提供ECMAScript的基础实现,同时也会提供ECMAScript的扩展实现,该扩展是以ECMAScript为基础所构建起来,比如BOM、DOM。ECMAScript标准结合其扩展BOM、DOM共同构建更完善的脚本语言JavaScript。
即:一个完整的JavaScript实现应该由核心规范(ECMAScript)、文档对象模型(Document Object Model ,BOM)、浏览器对象模型(Browser Object Model,BOM)三个部分组成。
(6)ISO/IEC采用了ECMAScript作为标准,浏览器开发商就开始致力于将ECMAScript作为各自JavaScript实现的基础。
2.简介
(1)JavaScript是一门运行在客户端浏览器中的脚本语言。每一个浏览器都有JavaScript的解析引擎。所谓脚本语言,即不需要编译,直接可以被浏览器解析执行。
(2)JavaScript可以通过控制HTML元素让网页呈现各种动态效果,从而增强用户和HTML页面的交互过程,进而使用户的具有良好的使用体验。所以目前全世界大部分网页的制作都使用JavaScript,因此所有的主流浏览器都支持JavaScript。
(3)任何语言的核心都必然会描述这门语言最基本的工作原理,而描述的内容通常都要涉及这门语言的语法、操作符、数据类型、内置功能等用于构建复杂解决方案的基本概念。
3.在HTML中使用JavaScript
(1)向HTML页面中插入JavaScript代码的方法是使用script元素,使用script元素的方式有两种:①直接在<script>标签内嵌入JavaScript代码,②通过<script>标签的src属性引入外部的JavaScript文件(推荐)。
(2)<script>可以定义在html页面的任何地方。但是定义的位置会影响执行顺序。现代web应用程序一般把全部JavaScript引用文件,即script标签,放在页面内容的后面,即body标签内容的底部。从而避免先运行脚本而导致网页延迟进而出现窗口空白的问题。
(3)noscript元素用于在不支持脚本或支持但禁用脚本的浏览器中显示替代的内容。
4.标识符
(1)定义:标识符是指变量、函数、ID属性值、函数参数名称。标识符是按照一定格式规则组合起来的一个或多个字符。
(2)命名标识符的规则:
①由英文字母、美元符号、下划线、数字组成;
②但是不能以数字作为首字符(据此区分标识符和数值);
③同时不能把关键字、保留字、true、false、null用作标识符;
④JavaScript中的标识符对大小写敏感,Name和name是两个不同的变量名;
⑤所有的名称标识符必须是唯一的,标识符可以是短名称(x,y),也可以是更具描述性的名称(age,sum);
⑥名称标识符易于理解。
(3)JavaScript程序员倾向于标识符采用驼峰式大小写格式。也就是第一个字母小写,剩下的每个有意义的单词的首字母大写。例如:getElementById()。
5.变量
(1)作用:变量是用于存储数据值的容器、存储器、内存空间。我们可以把变量理解为一个盒子,为了区分盒子,可以用box1,box2等名称代表不同的盒子,box1,box2就是盒子名字,也就是变量的名字;每个变量仅仅是一个用于存储值的占位符。
(2)声明(创建、定义):①使用关键词“var”声明变量;②命名变量的规则和命名标识符的规则一样;③在脚本的开头声明所有的变量是个好习惯;④可以在一条语句中声明多个变量,以var关键词作为语句的开头,以逗号分隔变量,声明也可以横跨多行;⑤使用var关键词声明的变量将成为声明该变量的作用域中的局部变量。
Java语言是强类型语言,而JavaScript是弱类型语言。
强类型:在开辟变量存储空间时,定义空间(变量)将来存储的数据的数据类型。只能存储固定类型的数据。
弱类型:在开辟变量存储空间时,不定义空间(变量)将来的存储数据类型,可以存放任意类型的数据。
(3)赋值:使用赋值运算符“=”为变量赋值,变量要先声明再赋值,声明和赋值两者可同步进行,变量也可以重复赋值;
(4)类型:①JavaScript变量是松散类型的,可以用来保存任何类型的数据;②根据可见性,变量可以分为全局变量和局部变量;全局变量在整个页面中可见,并在页面任何位置被允许访问;局部变量只能在指定函数内可见,函数外是不可见的、不可访问的。所有省略“var”关键词声明的变量都是全局变量,所有在函数外声明的变量也是全局变量,所有在函数内使用“var”关键词声明的变量都是局部变量。
var variate2,variate3,variate4; //声明多个变量,变量之间用逗号隔开,同样未赋值,值为undefined
var variate6=1,variate7=2,variate8=3; //多个变量的声明与赋值同步进行,变量之间用逗号分隔
var variate9="a(域外)是全局变量"; //所有在函数外声明的变量也是全局变量
function function1(){
var variate10="b(域内)是局部变量"; //所有在函数内使用“var”关键词声明的变量都是局部变量。
variate11="c(域外)是全局变量"; //所有省略“var”关键词声明的变量都是全局变量,,
}
6.注释
(1)作用:①可用于解释代码,提高代码的可读性,帮助自己和团队成员阅读和理解你所编写的JavaScript代码;②也可用于测试替代代码时阻止代码执行;③JavaScript不会执行注释,因此注释不会显示在页面中。
(2)种类:分为单行注释和多行注释。①单行注释以// 开头,从//开始到行末之间的文本都会被注释掉,不会执行。但是在//之前的代码不会被注释掉,所以可以在代码行末使用单行注释来解释代码;②多行注释以/* 开头,以*/结束,任何位于/*和*/之间的文本内容都会被注释掉。
7.关键词和保留字
(1)关键词:被赋予了特定含义、特定用途、特殊意义的单词叫做关键词,关键词可用于表示控制语句的开始或结束、也可用于执行特定操作。
(2)保留字:保留字目前还没有任何特定的用途,但是有可能在将来被用作关键字。
(3)关键字特点:关键字的字母全部小写;常用的代码编辑器,针对关键字有特殊的颜色标记,高亮显示,非常直观;无需记忆有哪些关键词,只需要在学习的过程中多留意,慢慢的就记住全部了。
8.数据类型
JavaScript中有5种简单(基本、原始、值)数据类型:Undefined、Null、Boolean、Number、String,还有一种复杂(引用)数据类型:Object,所有值都将是上述6种数据类型之一,而不支持任何创建自定义类型的机制。
typeof操作符
①JavaScript的数据类型是松散的、弱类型的,因此需要有一种手段来检测给定变量的数据类型,typeof是用来检测给定变量数据类型的操作符。
②typeof操作符的操作对象可以是变量,也可以是数值字面量。另外,typeof是操作符而不是函数。
var variate2;
alert(typeof variate2); //"undefined"
alert(typeof null); //"object"
alert(typeof true); //"boolean"
alert(typeof 95); //"number"
alert(typeof "some string"); //"string"
(1)Undefined类型
①Undefined类型只有一个值:undefined,在使用var声明某变量但未对其进行初始化时,这个变量的值就是undefined。
②声明而未初始化的变量与未声明且未初始化的变量还是有些不同的,后者会报出错误。但是声明而未初始化的变量与未声明且未初始化的变量执行typeof操作符都返回undefined值。
var variate3; //variate3变量有声明没有初始化
alert(variate3==undefined)//true
//var variate4 //variate4变量没有声明没有初始化
alert(variate4); //由于传递给alert()函数的是一个尚未声明的变量,所以会"报出错误"
alert(typeof variate3); //"undefined"
alert(typeof variate4); //"undefined"
(2)Null类型
①Null类型也只有一个值:null,null值表示一个空对象指针,这也正是使用typeof操作符检测null值会返回“object”的原因。
②只要意在保存对象的变量准备在将来用于保存对象而还没有真正保存对象,就应该明确地将该变量初始化为null,为不是其他值。这样一来,只要检测null值就可以知道相应的变量是否已经保存了一个对象的引用。
var variate5=null;
alert(typeof variate5); //"object"
var variate6=null;
if(variate6==null){ //检测变量是否已经保存了对象。
alert("该变量没有保存一个对象,它的值是null");
}else{
alert("该变量已经保存了一个对象");
}
(3)Boolean类型
①Boolean类型只有两个字面值:true和false,这两个字面值是区分大小写的。
②虽然Boolean类型的字面值只有两个,但JavaScript中所有类型的值都能等价的转换成这两个字面值,
要将一个值转换成其对应的Boolean值,可以调用转型函数Boolean(),至于返回的这个Boolean值是true还是false,就取决于要转换的数据类型及其实际值。
③转型函数Boolean()对理解流控制语句自动执行相应的Boolean转换非常重要。
alert(Boolean(true)); //true
alert(Boolean("string")); //true
alert(Boolean(10)); //true
alert(Boolean(null)); //false
alert(Boolean(undefined)); //false
(4)Number类型
①Number类型包含两种数值类型:整数和浮点数值(双精度数值)。为支持这两种数值类型,定义了不同的数值字面量格式:十进制整数、八进制整数、十六进制整数,在进行算术运算时,所有以八进制和十六进制表示的数值都将被转换成十进制数值。
②浮点数值就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。由于保存浮点数值(8字节)需要的内存空间是保存整数值(4字节)的两倍,所以JavaScript会不失时机地把浮点数值转换为整数值。对于那些极大或极小的数值,可以用科学计数法(e表示法)表示的浮点数值表示。e表示法:表示的数值等于e前面的数值乘以10的指数次幂。
③由于内存的限制,JavaScript并不能保存世界上所有的数值,即数值范围存在边界(最大数值和最小数值)。如果某次计算结果超出JavaScript数值范围的边界,那么这个数值将自动转换成特殊的infinity(无穷)。要想确定一个数值是不是在数值范围之内,可以调用isFinite()函数,该函数在参数位于数值范围之间时会返回true。
④NaN(Not a Number),非数值是一个特殊的数值, 该数值用于表示一个本来要返回数值的操作数未返回数值的情况。NaN本身有两个非同寻常的特点:任何涉及NaN的操作都会返回NaN;NaN与任何值都不相等,包括它本身。 针对NaN的两个特点,JavaScript定义了isNaN()函数,用于确定参数是否“不是数值”,返回值是Boolean值。
⑤有三个函数可以把非数值转换为数值:Number()函数、parseInt()函数、parseFloat()函数。从名字也能看出来:转型函数Number()可以用于任何数据类型,但该转型函数在转换字符串时比较麻烦,于是转型函数parseInt()专门用于将字符串转换成整数型数值,parseFloat()专门用于将字符串转换成浮点型数值。
var variate7=1.0; //整数,解析为1
var variate8=2.13e6; //等于2.13*10^6
alert(isFinite(1097899)); //1097899在数值范围之内,所以为“true”。
alert(isNaN(10)); //10是一个数值,不是一个非数值,所以为“false”。
alert(Number(true)); //1 //Boolean值
alert(Number(15)); //15 //number值
alert(Number(null)); //o //null值
alert(Number(undefined)); //NaN //undefined值
alert(parseInt("70",10)); //70 //string值
alert(parseInt("70",8)); //56 //string值
alert(parseFloat("0908.5")); //908.5 //string值
(5)String类型
①String类型用于表示字符序列,即字符串。字符串可以由双引号("")或单引号('')表示,两者表示的字符串完全相同,但注意开头与结尾相匹配。
②String数据类型包含一些特殊的字符字面量(转义字符),用于表示非打印字符、特定功能字符。
③字符串的特点是不可变的,字符串一旦创建,它们的值就不会改变。要改变某个变量保存的字符串,首先要用包含新值的字符串填充该变量,然后销毁原来的字符串(后台进行)。
④要把一个值转换为一个字符串有两种方式:String()函数和toString()函数。转型函数String()能够将任何类型的值转换为字符串,该函数的转换规则:如果值是null,则返回“null”,如果值是undefined,则返回“undefined”,此外调用toString函数;转型函数toString()能够转换数值、布尔值、对象、字符串值。该函数在转换数值以外的3种类型时,不必传入参数。在转换数值类型时,可以传入一个参数:输出数值的基数。
var variate12=10;
var variate13=true;
var variate14="string"
alert(variate12.toString(2)); //"1010" //数值
alert(variate13.toString()); //"true" //布尔值
alert(variate14.toString()); //"string" //字符串
(6)Object类型
①对象其实就是一组数据和功能的集合,对象可以通过“new操作符+对象类型的名称”来创建。而创建object类型的实例并为其添加属性和方法,就可以创建自定义对象。
②仅仅创建Object实例没有什么好处,关键是要理解一个重要思想:
JavaScript中,Object类型是所有它的实例的基础,即Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
var variate15=new Object(); //创建对象
alert(variate15.toString()); //返回对象的字符串表示
9.操作符(运算符)
(1) 一元操作符:只有一个操作数的操作符,包括:自增(++)、自减(--)、一元加(+)、一元减(-)
前置自增(自减):先进行自增(自减)操作,再进行其他运算操作;
后置自增(自减):先进行其他运算操作,再进行自增(自减)操作;
一元加:放在数值前面,对数值没有任何影响,放在非数值前面,会调用Number()转型函数对这个非数值转换成数值。
一元减:放在数值前面,会将数值变成负数;放在非数值前面,会调用Number()转型函数对这个非数值转换成数值,再将得到的数值转换成负数。
(2) 位操作符:按内存中表示数值的位来操作数值的操作符。包括:按位非(NOT)(~)、按位与(AND)(&)、按位或(OR)(|)、按位异或(XOR)(^)、左移(<<)、有符号的右移(>>)、无符号右移(>>>)
按位非(NOT):执行按位非的结果就是返回数值的反码。按位非操作的本质:操作数的负值减1。
按位与(AND):它有两个操作数,按位与操作只有在两个数值的对应位都是1时才返回1,任何一位是0,结果都是0。
按位或(OR):它有两个操作数,按位或操作在有一位是1的情况下就返回1,而只有在两个位都是0的情况下才返回0。
按位异或(XOR):它有两个操作数,两个数值对应位值不同,则返回1;否则返回0。
左移(<<):这个操作符会将数值的所有位向左移动指定的位数,左移操作后,会以0来填充右侧的空位。
有符号的右移(>>):这个操作符会将数值向右移动,但保留符号位。有符号的右移操作与左移操作正好相反。向右移位后,将出现在原数值的左侧、符号位的右侧的空位,用符号位的值来填充
无符号右移(>>>):这个操作符会将数值的32位都向右移动。对正数来说,无符号右移的结果与有符号右移相同无符号右移操作符会把负数的二进制码当成正数的二进制码,由于负数以其绝对值的二进制补码来表示,因此会导致无符号右移后的结果非常大。
//1.按位非(~)
var num1=25; //二进制0000 0000 0000 0000 0000 0000 0001 1001
var num2=~num1; //二进制1111 1111 1111 1111 1111 1111 1110 0110
alert(num2); //-26
var num1=25;
var num2=-num1-1;
alert(num2); //"-26"
//2.按位与(&)
var result=25&3;
alert(result); //1
//25=0000 0000 0000 0000 0000 0000 0001 1001
//3=0000 0000 0000 0000 0000 0000 0000 0011
//OR=0000 0000 0000 0000 0000 0000 0000 0001
//3.按位或(|)
var result=25|3;
alert(result); //27
//25=0000 0000 0000 0000 0000 0000 0001 1001
//3=0000 0000 0000 0000 0000 0000 0000 0011
//OR=0000 0000 0000 0000 0000 0000 0001 1011
//4.按位异或(^)
var result=25^3;
alert(result);//26
//25=0000 0000 0000 0000 0000 0000 0001 1001
//3=0000 0000 0000 0000 0000 0000 0000 0011
//XOR=0000 0000 0000 0000 0000 0000 0001 1010
//5.左移(<<)
var oldValue=2; //等于二进制的10
var newValue=oldValue<<5; //等于二进制的1000000,十进制的64
//6.有符号的右移(>>)
var oldValue=64; //等于二进制的1000000
var newValue=oldValue>>5; //等于二进制的10
//7.无符号右移(>>>)
//(1)正数
var oldValue=64; //等于二进制的1000000
var newValue=oldValue>>>5; //等于二进制的10
//(2)负数
var oldValue=-64; //二进制1111 1111 1111 1111 1111 1111 1100 0000
var newValue=oldValue>>>5; //等于十进制134217726
(3) 布尔操作符(逻辑运算符)包括:逻辑非(NOT)(!)、逻辑与(AND)(&&)、逻辑或(OR)(||)
逻辑非(NOT):逻辑非操作符会先将它的操作数按照一定的转换规则转换为一个布尔值,然后在对其求反。转换规则为对象(false)、空字符串(true)、非空字符串(false)、数值0(true)、非数值0(false)、null(true)、NaN(true)、undefined(true)。同时使用两个逻辑非操作符,实际上就会模拟出 Boolean() 转型函数的行为,用于将一个值转换为与其对应的布尔值。
逻辑与(AND):有两个操作数,逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。如果有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。如果两个操作数都是布尔值,当两个操作数都为true,返回true;否则返回false。另外,逻辑与操作属于短路操作。即第一个操作数能决定结果,那就不会在对第二个操作数求值。
逻辑或(OR):与逻辑与操作相似,有两个操作数,逻辑或操作可以应用于任何类型的操作数,而不仅仅是布尔值。如果有一个操作数不是布尔值的情况下,逻辑或操作就不一定返回布尔值。如果两个操作数都是布尔值,当两个操作数都为false,返回false;否则返回true。另外:逻辑或操作也属于短路操作,即如果第一个操作数的求值结果为 true,就不会再对第二个操作数执行求值。
(4) 算术操作符(算术[数]运算符,包括加性操作符[+ -]和乘性操作符[* / %]):(加)+ 、(减)-、(乘)*、(除)/、(取模、取余)%
注意:对于操作数非数值型,会在后台自动调用Number()、valueOf()、toString()、String()等转型函数尽可能的转换为数值型。
(加)+ :操作数都是数值则进行常规加法运算;只要有一个操作数是字符串,则进行字符串的拼接。
(减)- :操作数都是数值则进行常规减法运算。
(乘)* :操作数都是数值则进行常规乘法运算;操作数有一个不是数值,自动调用Number()转型函数转换为数值,再进行常规乘法运算。
(除)/ :操作数都是数值则进行常规除法运算;操作数有一个不是数值,自动调用Number()转型函数转换为数值,再进行常规除法运算。
(取模、取余)% :操作数都是数值则进行常规除法运算,返回除得的余数
(5) 关系操作符(比较运算符):用于对两个值进行比较并返回一个布尔值的操作符,包括:小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。如果两个操作数都是数值,则执行数值比较;如果有一个操作数不是数值,要进行数值转换等操作。
(6) 相等操作符:相等(==)、不相等(!=)、全等(===)、不全等(!==)
相等(==):如果两个操作数相等,则返回true
不相等(!=):如果两个操作数不相等,则返回true
相等和不相等操作符都会先转换操作数(强制转型),然后再比较它们的相等性。
全等(===):只在两个操作数未经转换就相等的情况下返回true
不全等(!==):在两个操作数未经转换就不相等的情况下返回true
全等和不全等操作符都不会先转换操作数,而是直接比较它们的相等性。
(7) 条件操作符(三元运算符、三元表达式):
格式:variable = boolean_expression ? true_value : false_value
含义:如果boolean_expression的值为true,则给variable 赋true_value值;如果boolean_expression的值为false,则给variable 赋 false_value值。
(8) (复合)赋值操作符:将右侧的值赋给左侧的变量,每个主要的算数操作符都有对应的复合赋值操作符。只是简化代码,不会带来性能的提升。包括:赋值(=)、加/赋值(+=)、减/赋值(-=).....
(9) 逗号操作符:可以在一条语句中执行多个操作,多用于声明多个变量。
10.流程控制语句
(1)条件语句(分支语句、选择语句):if...else...语句、switch语句
if...else...语句
①if...else语句是在指定的条件成立时执行if后面的代码,在条件不成立时执行else后的代码;
②语法:
if(判断条件)
{条件成立时执行的代码}
else
{条件不成立时执行的代码}
③细节说明:判断条件可以是任意表达式,所以表达式求值的结果不一定是布尔值,JavaScript会自动调用Boolean( )转换函数将该结果转换为一个布尔值。结果为true即条件成立,结果为false即条件不成立。
当在if/else语句中嵌套使用if语句时,必须确保else语句匹配正确的if语句,if/else匹配规则是:else总是和就近的if语句匹配。避免匹配错误的最佳方法是始终使用花括号。
switch语句
①switch语句与if语句的关系最为密切,switch语句就是为了让开发人员免于编写复杂的if...else...语句代码。
②语法:
switch(表达式){
case value1 : 语句1;
break;
case value2 : 语句2;
break;
case value3 : 语句3;
break;
case value4 : 语句4;
break;
default : 语句5;
}
③细节说明:switch语句正适合处理当所有的分支都依赖于同一个表达式的值的情况。switch语句首先计算expression的值,然后查找case子句的表达式是否和expression的值相同。如果找到匹配的case,那么将会执行这个case对应的代码块。如果找不到匹配的case,那么将会执行default标签中的代码块。如果没有default标签,switch语句将跳过它的所有代码块。
每一个case语句块结尾处都使用的关键词break会导致代码执行流跳出switch语句,而避免同时执行多个case代码的情况。最后的关键词default则用于在表达式不匹配前面任何一种情形的时候,执行机动代码,相当于else语句。
可以在switch语句中使用任何数据类型,而且每个case的值不一定是常量,可以是变量或表达式。switch语句中,对每个case的匹配操作实际上是'==='恒等运算符比较,而不是'=='相等运算符比较,因此,表达式和case的匹配并不会做任何类型转换。
(2)4种循环语句:while、do...while、for、for...in
它们的工作原理几乎一样:只要给定条件仍能得到满足,包含在循环语句里的代码就将重复地执行下去。一旦给定条件的求值结果不再是true,循环也就到此为止。大多数循环都会有一个像count这样的计数器变量,如果想要让代码可读性更强,就应当使用更具语义的变量名。计数器的三个关键操作是初始化、检测和更新。for语句将这三步明确声明为循环语法的一部分,各自使用一个表达式来表示。
do...while...语句
①do...while...语句是一种后测试循环语句,先执行循环体,后执行判断条件。即在对条件表达式求值之前,循环体内的代码至少会被执行一次。
②语法:
do{
语句1;
}while(判断条件);
③细节说明:先执行“语句1”,再测试“判断条件”,如果条件满足,循环将一直执行下去。像do...while...这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。
while语句
①while语句属于前测试循环语句,先执行判断条件,后执行循环体。即在循环体内的代码被执行之前,就会对判断条件求值,因此,循环体内的代码有可能永远都不会被执行
②语法:
while(判断条件)
{
语句1;
}
③细节说明:先测试“判断条件”,再可能执行“语句1”。
for语句
①for语句也是一种前测试循环语句。它具有执行循环前初始化变量和定义执行循环后要执行的代码的能力。
②语法:
for(初始化变量[1];判断条件[2];循环后表达式[4]){
语句1;[3]
}
等价于:
初始化变量[1];
while( 判断条件[2] );{
语句1;[3]
循环后表达式;[4]
}
③细节说明1:for循环语句只是把while循环相关的代码集中在了一个位置,使用while循环做不到的,使用for循环同样也做不到。鉴于此,for语句中的初始化表达式、控制表达式、循环表达式都是可选的,因为可以写在外面。
④细节说明2:在循环内部定义的变量是全局变量,也可以在外部访问到。for循环常见用途是对某个数组里的全体元素进行遍历处理:
⑤如果循环中的一次迭代会改变多个变量,则需要用到逗号运算符,它将初始化表达式和自增表达式合并入一个表达式中以用于for循环。如:var i,j;for(i = 0,j =10; i<10; i++,j--) sum+= i*j;
for-in语句
①for-in语句是一种精准的迭代语句,可以用来枚举对象的属性。
②语法:
for( 属性[变量] in 对象){
语句1;
}
③细节说明:每次执行循环时,都会将对象中存在的属性赋值给变量,这个过程会一直持续到对象中的所有属性都被枚举一遍为止,该语句枚举出的属性没有顺序。
(3)跳转语句:label、break、continue、return
label语句
①使用label语句可以在代码中添加标签,以便将来引用。
②语法:label : 语句1
示例:
start : for (var i = 0; i<count; i++){
alert(i);
}
③细节说明:标签语句通常与break语句和continue语句配合使用,示例中定义的start标签可以在将来由break或continue语句引用。加标签的语句一般都要与for语句等循环语句配合使用,跳出特定的循环。通过给语句定义标签label,就可以在程序的任何地方通过标签名引用这条语句。
break和continue语句
①break和continue语句用于在循环中精确地控制代码的执行。break语句会立即退出循环,强制继续执行循环后面的语句;continue语句也会立即退出本次循环,但退出循环后会从循环的顶部强制继续执行循环。
②break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。break语句只有出现在循环语句或switch语句中才合法,出现在其他语句中会报错;continue语句只能在循环体内使用,出现在其他语句中会报错。
with语句
①with语句的作用是将代码的作用域设置到一个特定的对象中。定义该语句的目的主要是为了简化多次编写同一个对象的工作。
②语法:
var qs=location.search.substring(1);
var hostName=location.hostname;
var url=location.href;
//等价于:
with(location){
var qs=search.substring(1);
var hostName=hostname;
var url=href;
}
③with语句的代码块内部,每个变量首先被认为是一个局部变量。上面几行代码中都包含location对象,使用with语句关联location对象。
return语句
函数调用是一种表达式,而所有表达式都有值。函数中的return语句就是指定函数调用后的返回值
return语句只能出现在函数体内,否则会报语法错误。当执行到return语句时,函数终止执行,并返回表达式的值给调用程序。
本文地址:https://blog.csdn.net/qq_45459315/article/details/109250897