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

2016-09-08  本文已影响11人  youngiyang_打码少年

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"
上一篇下一篇

猜你喜欢

热点阅读