zoukankan      html  css  js  c++  java
  • 语法

    在代码中,每个代码块和方法都会返回一个值,结果值就如同一个隐式的返回,在函数中,如果没有指定return,那么就相当于在结束出添加一个 return undefined 。在代码块中返回最后一个语句的结果值,如:

    var b;
            if (true) {
                b = 5 + 32;
            }

    上面的代码中,其返回结果是37,但是想拿到返回值,用这种方法却不行:

        var b;
            var a= if (true) {
                b = 5 + 32;
            }

    如果想要拿到其返回值,可以使用eval获取,即:

    var b;
            var a = eval("if (true) {b = 5 + 32;}");
            console.log(a); //37

    虽然不是一个好办法,但确实能获取到

    ()表达式

     var a = 42;
            var b = (a++);
            console.log(a); //43    
            console.log(b); //42

    由结果可以看出,其实(0本身并不是一个封装表达式。

    else if

    在JavaScript中,其实是没有else if 语句的,所以我们经常用到的 else if 其实是这样的:

         if (a) {
            }
            else {
                if (b) {
    
                } else {
    
                }
            }

    函数参数

     function foo(a=42,b=a+1)
                {
                    console.log(arguments.length,a,b,arguments[0],arguments[1])
                }
                foo(); //0 42 43 undefined undefined
                foo(10); //1 10 11 10 undefined
                foo(10,undefined); //2 10 11 10 undefined
                foo(10,null);//2 10 null 10 null

    虽然参数a和b都有默认值,但是函数不带参数时,arguments数组为空。

    在来看一个参数绑定的例子:

       function foo(a) {
                a = 42;
                console.log(arguments[0]);
            }
            foo(2); //42
            foo(); //undefined

    由此可以看出,向函数传递参数时,arguments数组中的对应单元会和命名参数建立关联,以得到相同的值,相反,不传递参数就不会建立关联。

    需要特别注意的是,它并不是JavaScript语言本身的特性,而是语言引擎底层实现的一个抽象泄露。所以不要同时访问参数和其对应的arguments数组单元。

    try finally

    finally中的代码总是会再try之后执行,如果有catch则在catch之后执行,即无论什么情况下一定会被调用。如:

     function foo() {
                try{
                    return 42;
                }
                finally {
                    console.log("finally");
                }
                console.log("nerver");
            }
            console.log(foo());
            //finally
            //42

    这里return 42会先执行,并将foo()函数的返回值设置为42,然后try执行完毕,在执行finally。最后foo执行完毕,执行console.log

    如果finally中抛出异常,函数就会在此处种植,如果此前try中已经有return设置了返回值,则该值会被丢弃。

    另外还需要注意,如果finally中用return返回了值,那么它会覆盖try 或 catch 返回的值。

    switch

    switch中的case的匹配算法,是与===相同。但是有时需要通过强制转换来进行比较,即==,这是就需要做一些特殊处理:

     var a = "42";
            switch (true) {
                case a == 10:
                    console.log("10");
                    break;
                case a == 42:
                    console.log("42");
                    break;
            }
            //42

    尽管可以这样使用,但有一个需要特别注意的地方:

          var a = "42";
            var b = "45"
    
            switch (true) {
                case (a||b==42):
                    console.log("10");//永远不会执行到这里
                    break;
            }

    因为(a||b==42)的返回结果是42,而非true,所以严格相等比较不成立,这是需要强制转换返回true或false,如 case !!(a||b==42)

    全局DOM变量

    有时我们在创建有id属性的dom时,也会创建一个同名的全局变量。例如:

    <div id="foo"></div>
    if(type foo==undefind){
        foo=42;
    }
    console.log(foo) //html元素

    上面的代码中,如果稍不注意就会很容易让全局变量的检查错误百出,这有时尽量不要使用全局变量的一个原因。如果必须要用,那么久要保证唯一,不与html和第三方的代码同名。

  • 相关阅读:
    MySql—修改权限
    linux apache Tomcat配置SSL(https)步骤
    spark-shell启动错误
    spark
    Ubuntu不能连接网络
    NSGA-II算法学习
    SpringBoot集成mybatis,同时读取一个数据库中多个数据表
    设置虚拟机ip地址
    发送邮件
    spring session
  • 原文地址:https://www.cnblogs.com/y8932809/p/6210402.html
Copyright © 2011-2022 走看看