Javascript|Javascript 基本概念(语句 函数)

Javascript|Javascript 基本概念(语句 函数)
文章图片
语句 if 语句

if (condition1) { statement1 } else if (condition2) { statement2 } else { statement3 }

如果condition1true,执行statement1,如果condition1falsecondition2true,执行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在代码中添加标签,以便以后会用到。
continuebreak语句 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

breakcontinue 语句都可以与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

    推荐阅读