js学习笔记:语句和函数

语句

if语句
  • if的条件结果并不一定是布尔值,js会自动调用Boolean()转换函数来将这个表达式的结果转换为布尔值。
do-while语句

后测试循环语句,循环体内的代码至少会被执行一次。

while语句

前测试循环语句

for语句

前测试循环语句。
- 使用while循环做不到的,使用for循环也做不到
- 如果将for语句的初始化表达式、控制表达式和循环后表达式全部省略,就会创建一个无限循环

for-in语句

是一种精准的迭代语句,可以用来枚举对象的属性。

  • ECMAScript对象的属性没有顺序,因此通过for-in循环输出的属性名的顺序是不可预测的,返回的先后顺序可能会因浏览器而异。
label语句

在代码中添加标签以便将来使用。一般由break和continue语句引用。

break和continue语句

用于在循环中精确的控制代码的执行。

  • break会立即退出循环,强制执行循环后面的语句。
  • continue语句也会立即退出循环,但退出循环后会从循环的顶部继续执行。
  • break与continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在循环嵌套的情况下。
var num = 0;
outermost:
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        if(i==5 && j==5){
            break outermost;
        }
        num++;
    }
}

alert(num);  //55,此标签导致break不仅退出内部循环,也退出外部循环
var num = 0;
outermost:
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        if(i==5 && j==5){
            continue outermost;
        }
        num++;
    }
}

alert(num);  //95,此标签导致continue会退出内部循环,继续执行外部循环,这就意味着内部循环少执行5次,因此是95
with语句

将代码的作用域设置到一个特定的对象中。目的主要是为了简化多次编写同一个对象的工作。

with(location){
    var qs = search.substring(1);
    var hostName = hostname;
    var url = href;
}

像search,hostname和href,会被认为是一个局部变量,如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性。如果发现了同名属性,则以location对象属性的值作为变量的值。

  • 严格模式下不允许使用with语句。
  • 大量使用with语句会导致性能下降,也会给调试带来困难,因此不建议使用。
switch语句
  • switch在比较时使用的是全等操作符,因此不会发生类型转换。

函数

  • return语句可以不带任何返回值,这种情况下函数在停止执行后将返回undefined
  • 严格模式对函数有一些限制
    • 不能把函数命名为eval或arguments
    • 不能把参数命名为eval或arguments
    • 不能出现两个命名参数同名的情况
有关参数

ECMAScript函数不介意传递进来多少个参数,也不在乎传递进来的参数是什么数据类型。即便定义函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数,可以传递一个,三个或不传。原因是ECMAScript中的参数在内部是用一个数组表示的,函数接收到的始终是这个数组。在函数体内可以通过arguments对象来访问这个参数数组。

  • arguments对象并不是数组,只是与数组类似。可以使用方括号下标访问每一个元素,也可以用length属性确定传递进来多少个参数。因此函数内部也可不显式地使用命名参数,利用arguments来访问参数。
function sayHi(){
    alert("hello" + arguments[0] + "," + arguments[1]);
}
  • ECMAScript函数的特点:命名的参数只是提供便利,但不是必需的。
  • 在函数内部访问arguments.length可以知道有多少个参数传递给了函数
  • arguments对象可以与命名参数一起使用
function doAdd(num1,num2){
    alert(arguments[0]+num2);
}
  • arguments的值永远与对应命名参数的值保持同步
function doAdd(num1,num2){
    arguments[1] = 10;
    alert(arguments[0]+num2);
}

每次执行这个函数都会重写第二个参数,将第二个参数改为10,因为arguments对象中的值会自动反映到对应的命名函数,所以修改了arguments[1]就等于修改了num2 。但是arguments与num2的内存空间是独立的,但它们的值会同步。

  • arguments对象的长度是由传入的参数个数决定的,而不是由定义函数时的命名参数的个数决定的
  • 没有传递值的命名参数值为undefined。
  • 严格模式中不会发生前面的更改arguments[1],num2也跟着改变的情况,此时num2还是undefined。
  • ECMAScript中所有参数传递的都是值,不可能通过引用传递参数。
没有重载

由于ECMAScript函数没有签名(接收的参数的类型和数量),因此无法像java一样做到重载。

  • 如果定义了两个名字相同的函数,则该名字只属于后定义的函数。
  • 通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值