美文网首页
Web之JavaScript(散碎笔记)

Web之JavaScript(散碎笔记)

作者: _palm | 来源:发表于2016-01-15 20:00 被阅读61次

    JavaScript有变量提升的特点, 全文件扫描js文件时会自动将声明变量提前,但是这里需要注意的一个地方是:
    <pre>虽然js变量声明语句会被自动提前,但是其赋值不会被提前.</pre>

    比如:

    function test() {
        alert(" test --  "  + name) ;
        var name = "hello.javascript." ;
    }
    

    调用test函数后 弹出内容为 test -- undefined , 就是这个原因,虽然能找到这个变量,但是赋值不会自动提前,也就变为未定义或者未初始化变量了

    但是目前我还不知道 这种操作是在什么时候,不知道是在javascript引擎解释的时候还是在调用的时候. 我个人的理解更倾向于引擎解释的时候.

    在比如:

    myname = "global"; // 全局变量
    function func() {
        alert(myname); // "undefined" 
        var myname = "local";
        alert(myname); // "local"
    }
    func();
    

    以上代码,第一眼大部分人都会认为 先弹出global 在弹出local 其实不是.因为变量声明被提升其实代码应该是这样的:

    myname = "global"; // 全局变量
    function func() {
        var myname ;
        alert(myname); // "undefined" 
        myname = "local";
        alert(myname); // "local"
    }
    func();
    

    //使用apply可以修复普通函数的this指针.
    这里步骤如下:我们先保存原函数的指针然后使用apply 修复this指针,这里普通函数this指向null  或者window
    //统计函数parseInt调用次数 , 我们先保存原函数 ,然后覆写函数parseInt 将计数器累加1,然后使用apply修复原函数指针. 
    oldparseInt.apply(null,arguments) ;  这样相当于修改了原parseInt函数实现.
    
    var count = 0 ;
    var oldparseInt = window.parseInt ;
    var parseInt = function() {
            count +=1 ;
            return oldparseInt.apply(window,arguments) ;
    } ;
    
    parseInt('10') ;
    parseInt('16') ;
    parseInt('14') ;
    parseInt('13') ;
    parseInt('11') ;
    parseInt('19') ;
    parseInt('12') ;
    parseInt('14') ;
    parseInt('15') ;
    parseInt('17') ;
    
    alert(count) ;
    
    
    
    //apply
    //我们可以将一个函数绑定到一个对象中.比如:
    function run() {
            return ' string is ' + this.name + this.age ;
    }
    
    var obj = {
         name : 'palm' ,
         age : 24
    } ;
    
    var value = run.apply(obj,[]) ; //这里使用apply间接的就已经调用函数run ,会返回执行结果.
    
    alert(value) ;
    

    高阶函数使用

    1. map
      在js中我们可以将一个函数赋值给一个变量,如下:
    var fun = function() {
        return '这是一个函数.' ;
    }
    

    然后,函数可以接收一个变量作为参数,那么函数也可以接收一个函数作为参数。如下:

    function fun1() {
      return 'hello, javaScript.' ;
    }
    
    function fun2(x) {
        var value = x() ;
        return value ;
    }
    
    alert(fun2(fun1)) ; //hello, javaScript.
    

    我们使用map 可以将数组反转、运算或者自定义操作等。例如:

    var oNumber = window.Number ;
    
    var Number = function(x) {
            return x*x ;
    }
    
    oNumber.apply(window,[]) ;
    var arr = ['8','0','1','2','3','4','5','6'] ;
    var arrstr = arr.map(Number) ;
    
    alert( 'source code - ' + arr + 'now --' + arrstr) ;
    

    以上代码利用了apply函数和map 使 字符串数组变为数字,并实现f(x) = x2 操作。

    继承会在父对象的原型上继承.比如:

    function Foo() {
        this.foo =  ' Foo\'s perpoties.' ;
    }
    
    function Bar() {
    }
    
    Bar.prototype = new Foo() ;
    
    Bar.prototype.constructor = Bar ;
    
    
    var bar = new Bar() ;
    var bar1 = new Bar() ;
    bar1.foo = 'bar1\'s perpoties.' ;
    alert(bar1.foo) ; //bar's perpoties.
    
    //console.log('==== '  + bar.constructor) ;
    
    

    2.javaScript 中浮点运算会丢失精度,得到的结果只会无限接近正确值,而不等于正确值,比如:

    var v1 = 0.1 ;
    var v2 = 0.2 ;
    
    console.log(v2 + v1) ;
    

    但是我还不清楚为什么 <code> 0.1 + 0.1</code> 可以得到正常结果 0.2.

    1. javaScript中switch语句case匹配内部实现为=== ,如下:
    function fun(value) {
       switch(value) {
        case 'A' : console.log('A') ; break ;
        case 'B' : console.log(B) ;  break ;
        case undefined : console.log('unkown.') ;  break ;
        default : 
        console.log(' miss.') ;
        }
    } 
    
    
    //fun('A') ;
    fun(String('A')) ;  //A
    fun(new String('A')) ;  //miss.
    ```
    
    上面使用`String()` 强转为字符串时不会新创建一个字符串,如果使用`new String()`, 则会重新创建一个新的字符串。

    相关文章

      网友评论

          本文标题:Web之JavaScript(散碎笔记)

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