Javascript|Javascript 基本概念(语句 函数)
文章图片
语句
if
语句
if (condition1) {
statement1
} else if (condition2) {
statement2
} else {
statement3
}
如果
condition1
为true
,执行statement1
,如果condition1
为false
,condition2
为true
,执行statement2
, 否则执行statement3
。statement如果只有一行可以不用放在代码块
{}
中,不过推荐无论何时都使用代码块。condition如果不是布尔值,会调用
Boolean()
将其转化为布尔值do-while
语句
先执行后测试循环语句do {
statement
} while (condition)
可以看出
do-while
语句,statement
会至少执行一次。while
语句
while (condition) {
statement
}
可以看出
statement
可能永远都不会执行。for
语句
for (initialization;
expression;
post-loop-expression){
statement
}
-
initialization
是循环开始前定义的初始化参数,我们也可以在for
语句之前定义好,然后放在这里使用。 -
expression
是本次循环是否进行的条件判断语句。 -
post-loop-expression
是循环后进行的操作。
var count = 10;
var i = 0;
while (i < count){
alert(i);
i++;
}
等同于
for(var i = 0;
i < count;
i++){
alert(i);
}
可见
for
语句其实就是 while
语句的简化版。前面提到过
i
可以在循环外定义:var i;
for(i = 0;
i < count;
i++){
alert(i);
}
由于ECMAScript不存在块级作用域,因此在循环内定义的变量,比如
i
,也可以在外面访问到。for
语句中,初始表达式,控制表达式和循环后表达式都是可选的for (;
;
) { // 无限循环
doSomething();
}
var i = 0;
for (;
i < 10;
){//相当于while
alert(i);
i++;
}
for-in
语句
用来枚举对象的属性,不保证顺序。for (var propName in window) {
document.write(propName);
}
每次都会将
window
对象存在的属性名赋给propName
,如果要迭代的对象为null
or undefined
,在ECMAScript 3中会报错,在ECMAScript会不执行循环,因此循环前,最好判断对象是否是null
or undefined
。label
语句
label: statement
使用
label
在代码中添加标签,以便以后会用到。continue
与 break
语句
break
语句用于退出整个循环,即后续满足条件的循环都不会执行。continue
语句用于退出当前循环,后续满足条件的循环继续执行。举两个例子:
var num = 0;
for (var i=1;
i < 10;
i++) {
if (i % 5 == 0) {
break;
}
num++;
}
alert(num);
//4
var num = 0;
for (var i=1;
i < 10;
i++) {
if (i % 5 == 0) {
continue;
}
num++;
}
alert(num);
//8
break
和continue
语句都可以与label
语句联合使用,用于在指定代码位置发挥作用,多用于循环嵌套。举两个例子:var num = 0;
outermost: for (var i=0;
i < 5;
i++) {
for (var j=0;
j < 5;
j++) {
if (i == 2 && j == 2) {
break outermost;
//跳出整个循环
}
num++;
}
}
alert(num);
//5 + 5 + 2 = 12
var num = 0;
for (var i=0;
i < 5;
i++) {
for (var j=0;
j < 5;
j++) {
if (i == 2 && j == 2) {
break;
}
num++;
}
}
alert(num);
// 22
var num = 0;
outermost: for (var i=0;
i < 5;
i++) {
for (var j=0;
j < 5;
j++) {
if (i == 2 && j == 2) {
continue outermost;
//跳出本次循环,继续外层循环
}
num++;
}
}
alert(num);
//5 * 5 -3 = 22
var num = 0;
for (var i=0;
i < 5;
i++) {
for (var j=0;
j < 5;
j++) {
if (i == 2 && j == 2) {
continue;
}
num++;
}
}
alert(num);
// 5 * 5 -1 =24
with
语句
with (expression) statement;
with
可以将代码的作用域设置到一个特定的对象中,主要是为了简化多次访问同一个对象的操作。var name = cat.name;
var age = cat.age;
var hobby = cat.hobby;
使用
with
可以写成:with(cat) {
var name = name;
//name首先被认为是局部变量, 如果局部变量没有name,则使用cat对象中的name属性
var age = age;
//age首先被认为是局部变量, 如果局部变量没有age,则使用cat对象中的age属性
var hobby = hobby;
// hobby首先被认为是局部变量,如果局部变量没有hobby,则使用cat对象中的hobby属性
}
严格模式下不能使用
with
。由于大量使用with 语句会导致性能下降,同时也会给调试代码造成困难,因此
在开发大型应用程序时,不建议使用with 语句。
switch
语句
switch (expression) {
case value1:
statement1
break;
case value2:
statement2
break;
case value3:
statement3
break;
default:
statement4
}
等价于
if (expression == value1){
statement1
} else if (expression == value2) {
statement2
} else if (expression == value3) {
statement3
} else {
statement4
}
当然我们也可以省略
break
关键字,用于合并几种情形,比如:var num = 2;
switch(num) {
case 1:
console.log("1");
case 2:
console.log("2");
case 3:
console.log("3")
default:
console.log("default");
break;
}
//打印出 2 3 default
如果匹配到的情形中没有
break
,会继续执行下面的情形中的语句,直至遇到break
或语句结束。switch
语句中可以使用任何数据类型,case
可以使用常量、变量或表达式,比如:var attr_me = 'Sue';
var name_brother = 'Ben';
switch(attr_me ) {
case 'Su' + 'e':
console.log("It is my name.");
break;
case 18:
console.log("It is my age.");
break;
case name_brother :
console.log("It's my brother");
break;
default:
console.log("default");
break;
}
switch
在比较时用的是全等操作符。书中还提到了比较巧妙的使用方法,
switch
语句使用布尔值,case
就可以使用各种可以返回布尔值得操作符或方法。switch(true) {
case 2 === 3:
console.log("2===3");
break;
case 2 < 3:
console.log("2 < 3");
break;
default:
break;
}
函数
function functionName(arg0, arg1,...,argN) {
statements
}
参数 ECMAScript中定义函数时,我们有的时候会定义一些这个函数需要外界传入的参数,需要注意的是,调用一个函数时,传入或不传、传几个,解析器都不会在意,因为最终解析器会把他们打包进一个参数数组中,我们可以在函数中通过
arguments
获得这个数组,这个数组里的值会按顺序映射到我们定义的命名参数中,于是我们就可以通过命名参数获得用户传来的参数。如果开发者需要通过用户输入的参数个数为用户提供不同的功能:
function operation() {
if(arguments.length === 0) return;
if(arguments.length === 1) return arguments[0];
if(arguments.length === 2) return arguments[0] + arguments[1];
}operation();
// undefined
operation(3);
// 3
operation(1, 2);
// 3
有点像方法重载。
arguments
中的值永远与命名参数的值保持同步,举个例子:function test(num) {
console.log(num);
num++;
console.log(arguments[0]);
}test(3);
// 3 4
虽然
arguments
中的值与命名参数的值是同步的,但他们的内存空间是独立的,访问它们并不是在访问同一个内存空间,那些没有传入值的命名参数值为undefined
。function test(num1, num2) {
console.log(num1, num2);
}test(3);
// 3 undefined
ECMAScript只有传值,没有传引用。严格模式下,不能修改
arguments
,会抛出错误。没有重载 由于ECMAScript并不在意以一个函数定义了哪些命名参数,因此,名字相同,参数却不同的几个函数在ECMAScript的认知中,只是同一个函数被定义了多次,最后一个函数会将前面定义的覆盖掉。
function add(num) {
return num++;
}
function add(num1, num2) {
return num1 + num2;
}
add(8);
// NaN
但我们可以参照前面说的方法模仿重载。
返回值 【Javascript|Javascript 基本概念(语句 函数)】ECMAScript 中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return 语句后跟要返回的值来实现返回值,当执行到
return
时,立刻退出函数,如果return
后不指名返回值,将返回undefined
。推荐阅读
- 事件代理
- 数组常用方法一
- 数据库总结语句
- HTML基础--基本概念--跟着李南江学编程
- Improve|Improve Nested Conditionals(优化嵌套的条件语句) 面对大量的if-else语句
- neo4j|neo4j cql语句 快速查询手册
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- 项目团队管理|项目团队管理 - 塔克曼阶梯理论
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历