美文网首页
javascript高级程序设计读书笔记(四)

javascript高级程序设计读书笔记(四)

作者: youngiyang_打码少年 | 来源:发表于2016-09-08 13:47 被阅读11次

    NO.1 引用类型中的Date类型

    创建一个日期对象
    var now = new Date();
    如果对象中没有传入参数,则默认取当前时间
    想要创建特定的日期对象,用Date.prase()或者Date.UTC();
    var someDate = new Date(Date.parse("May 25, 2004"))等价于
    var someDate = new Date("May 25,2004")

    var allFives = new Date(Date.UTC(2005,4,5,17,55,55)); //表示GTM时间2005年5月5日下午5:55:55
    var allFives = new Date(2005,4,5,17,55,55) //这两个创建的时间对象都是基于系统设置的本地时区设置的

    ES5中添加了Date.now()方法,返回表示调用这个方法时的日期和时间的毫秒数
    这个方法简化了使用Date对象分析代码的工作,例如:

    var start = Date.now()
    doSomething()
    var stop = Date.now()
    var result = stop - start
    

    继承的方法toString,根据浏览器设置的地区相适应的格式返回日期和时间;
    valueOf()方法,不返回字符串,返回日期的毫秒数表示,,因此日期可以比较大小;

    NO.2 RegExp类型

    JS通过RegExp类型来支持正则表达式
    var expression = / 表达式(pattern)/(标志g/i/m)

    标志:
    g表示全局,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
    i表示不区分大小写模式
    m表示多行模式,即在到达一行文本末尾时,还会继续查找下一行是否存在于模式中匹配的项

    NO.3 Function类型

    每个函数都是Function的实例,并且和其他引用类型一样具有属性和方法,关键句:『函数是对象,函数名是指针』

    函数定义的三种方式:
    1.使用函数声明语法直接定义

    function sum (a , b){
        return a+b ;
    }
    

    2.使用函数表达式

    var sum = function(a, b){
        return a +b ;
    };
    

    3.使用Function的构造函数

    var sum = new Function("num1","num2", "return num1+num2");
    

    一个函数可能会有多个名字:

    function sum(sum1, sum2){
        return sum1 + sum2
    }
    alert(sum(10,10)); //20
    
    var anotherSum = sum
    alert(anotherSum(10,10)) //20
    
    sum = null
    alert(anotherSum(10,10)) //20
    

    注意,使用不带圆括号的函数名是访问函数指针,而非调用函数,以上例子就是anotherSum和sum都指向同一个函数,因此anotherSum也可以被调用

    函数声明提升:
    解析器会率先读取函数声明,并使之在执行任何代码之前可以用,例如:

    alert(sum(10, 10));
    function sum(sum, sum2){
        return num1+num2;
    } //20
    

    以上代码是可以执行的,因为在代码开始执行之前,解析器就通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。如果将函数换成表达式方式定义,将会报错;

    alert(sum(sum1, sum2));
    var sum = function(sum, sum2){
        return num1+num2;
    } //error
    

    作为值的函数:
    因为JS中的函数名本身就是变量,所以函数也是可以作为值来使用,也就是说,不仅仅可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。例子:
    function callSomeFunction(someFunction, someArgument){
    return someFunction(someArgument);
    }
    这个函数接收2个参数,第一个是一个函数,第二个参数是要传递给该函数的一个值,然后就可以像下面的例子传递函数了

    function add10(num){
        return num +10;
    }
    
    var result1 = callSomeFunction(add10, 10)
    alert(result1); //20
    

    函数内部属性:
    在函数内部,有两个特殊的对象,arguments和this
    arguments类数组对象,包含着传入函数中的所有参数。arguments还有一个属性,叫做callee。这个属性是一个指针,指向拥有这个arguments对象的函数。

    callee的作用,是用来消除函数引用自己时的耦合,比如:

    function factorial(num){
        if(num<1){
            return 1;
        } else {
            return num*factorial(num-1)
        }
    }
    

    上面那个函数,当函数重命名之后,就函数就不能正确执行,解决办法如下:

    function factorial(num){
        if(num<1){
            return 1;
        } else {
            return num*arguments.callee(num-1)
        }
    }
    

    函数内部另外一个特殊的对象this

    this引用的是函数据以执行的环境对象--或者也可以说是this值(当在网页的全局作用域中调用函数时,this对象引用的就是window)例子如下:

    window.color = "red";
    var o = { color:"blue" };
    function sayColor(){
        alert(this.color);
    }
    sayColor(); //"red"
    o.sayColor = sayColor
    o.sayColor(); // "blue"
    

    当运行sayColor()时,函数的执行的环境对象为window对象。
    当运行o.sayColor()时,函数的执行对象为o对象。

    函数属性和方法:

    每个函数包含两个属性,length和prototype,其中length表示函数希望接收到的命名参数的个数。

    prototype,对于引用类型而言,prototype是保存所有实例方法的真正所在。例如:toString()和valueOf();

    每个函数都包含非继承而来的两个方法:apply()和call();
    apply()和call()的真正强大的地方是可以扩充函数赖以运行的作用域:

    window.color = "red";
    var o = { color: "blue" };
    function sayColor(){
        alert(this.color);
    }
    sayColor();
    
    sayColor.call(this); //red
    sayColor.call(window); //red
    sayColor.call(o); //blue
    

    ES5还定义了一个方法,叫做bind(),这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。例如:

    window.color = "red";
    var o = {color :"blue"}
    function sayColor(){
        alert(this.color);
    }
    var objectSaycolor = sayColor.bind(o);
    objectSaycolor(); //"blue"
    

    相关文章

      网友评论

          本文标题:javascript高级程序设计读书笔记(四)

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