美文网首页Javascript高级程序设计 读书笔记
Javascript 基本概念(语句 函数)

Javascript 基本概念(语句 函数)

作者: Sue1024 | 来源:发表于2018-02-01 21:37 被阅读31次

语句

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

但我们可以参照前面说的方法模仿重载。

返回值

ECMAScript 中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return 语句后跟要返回的值来实现返回值,当执行到return时,立刻退出函数,如果return后不指名返回值,将返回undefined

相关文章

网友评论

    本文标题:Javascript 基本概念(语句 函数)

    本文链接:https://www.haomeiwen.com/subject/uwnlzxtx.html