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

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

返回值

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容