Date类型

Javascript中的Date类型是采用Java中的java.util.Date类基础上构建的,使用UTC时间来保存数据,可以精确到1970年1月1日之前或之后的285616年

创建一个日期对象,使用new关键字加构造函数声明(日期对象也是引用类型的),在不给构造函数传递任何参数的情况下,新对象自动获取当前的日期和时间,如下:

var nowTime=new Date();
document.write(nowTime); //ed Aug 27 2014 13:31:12 GMT+0800 (中国标准时间)

有两个方法可以根据特定的日期和时间来创建日期对象:Date.parse()和Date.UTC()

Date.parse():分析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间相差的毫秒数。

        var dateString="November 1, 1997 10:15 AM"
var mSec = Date.parse(dateString);
document.write(mSec);
// Output: 878404500000

Date.parse() 函数返回一个整数值,此整数表示 dateVal 中所提供的日期与 1970 年 1 月 1 日午夜之间相差的毫秒数。

Function类型

Javascript中最有意思的莫过于函数了,在Javascript中函数实际上是对象,每个函数都是Function类型的一个实例

而且与其他引用类型一样具有属性和方法。由于函数式对象,所以函数名实际上也是一个指向函数对象的指针,不会与

某个函数绑定

函数定义语法有三种:

方法一:函数声明

        function functionName([argname1  [, ...[, argnameN]]])
{
return argname1+...+argnameN;
}

方法二:函数表达式定义法

        var sum=function([argname1  [, ...[, argnameN]]]){
return argname1+...+argnameN;
};

在这个方法中function关键字后面没有函数名,因为此时可以通过变量sum访问到该函数,就没有必要再加上函数名,最后要像变量定义一样在函数末尾加个分号

方法三:构造函数法

var sum=new function("argname1","...","argnameN","return argname1+...+argnameN");

这种方法更利于理解:“函数式对象,函数式指针”概率,它使用function构造函数来创建函数,function构造函数可以接受任意个参数,最后一个参数被看成是函数体,前面的参数表示函数参数;这种语法的缺点是:导致代码两次解析,第一次解析常规的ECMAscript代码,第二次解析传入构造函数中的字符串

回到之前,由于函数式对象,所以函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同,也就是说一个函数可以有多个函数名,请看下面的示例:

        function sum(num1,num2,num3){
return num1+num2+num3;
}
document.write(sum(10,20,30)); //Output:60
var anotherSum=sum; //注意这里的sum函数不能带圆括号,否则变成了调用函数了
document.write(anotherSum(100,200,300)); //Output:600
anotherSum=null; //让another与函数断绝关系
document.write(anotherSum(100,200,300)); //无输出

Javascript函数的特殊性决定了它不像传统编程语言那样:函数重载,在Javascript中函数是没有重载的。

//没有重载
function sum(num1,num2,num3){
return num1+num2+num3;
}
function sum(num1,num2,num3){
return num1*num2*num3;
}
document.write(sum(100,200,300)); //Output:6000000

虽然上面两个函数名称相同,但结果是最后一个函数覆盖了前面一个同名函数

函数声明与函数表达式的区别:

前面介绍了函数的定义方法有三种:函数声明、函数表达式、new加构造函数,但是解析器在处理函数声明和函数表达式两种时是区别对待的

函数声明法:解析器先读取函数声明,并使其在执行任何代码之前都可以访问到

        document.write(sum(110,120,119));   //Output:1570800
function sum(num1,num2,num3){
return num1*num2*num3;
}

这段代码完全正确,能够正常运行的,因为在执行之前,解析器读取并将函数声明添加到执行环境中;在对代码求值时Javascript引擎在第一次会声明函数并且将它们放到源代码树的顶部,也就是说即使声明函数的代码在调用它的代码之后,Javascript引擎也能把函数声明提升至顶部,相反对于函数表达式法定义的函数,则会导致执行错误

        document.write(sum(110,120,119));
var sum=function(num1,num2,num3){
return num1*num2*num3;
};

【把函数当做值传递】

函数是对象,函函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同,所以函数也可以当做值来使用,也就是说可以像传递参数一样把函数传递给另一个函数,并且可以把函数作为另一个函数的参数返回

        function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
}

这个函数接受两个参数,第一个参数表示函数,第二个是普通参数

【函数的内部属性】

在Javascript函数内部有两个特殊的对象:arguments和this

arguments对象:保存所有传入函数中的参数,它是一个数组对象,这个对象有一个callee属性,它是一个指向拥有arguments对象的函数,利用它可以解决函数和函数名的耦合问题。先看下面的阶乘代码:

 //阶乘函数
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);
}
}

变更之后,就可以消除函数和函数名的关联了。因为每个函数都有arguments对象,而这个对象,又拥有callee方法,用它来指定拥有arguments对象的函数

现在可以这样调用函数:

        var trueFactorial=factorial;  //把factorial函数的指针,保存一份到trueFactorial变量中
factorial= function () { //重写原函数factorial函数的功能
return 0;
};
document.write(trueFactorial(10)); //Output:3628800
document.write(factorial(10)); //Output:0

重写之后,原函数名,无法执行到原来函数的功能了,而用新函数名则可以,这样的话,就使函数和函数名的耦合取消了

Javascript中另一个对象是this,它的含义很多,它可以是全局对象、当前对象或者任意对象,this到底绑定到哪里?这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用(参考:http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/)

函数作为对象的方法调用:

在Javascript中函数也是对象,因此函数可以作为一个对象的属性,这时该函数被称为对象的方法,使用这种调用方式是,this被自然绑定到拥有函数的对象上

        var point={
x:10,
y:10,
moveTo:function(x,y){
this.x=this.x+x;
this.x=this.y+y;
}
}; point.moveTo(10,10)

这里定义一个对象,该对象point具有属性x,y,同时有一个moveTo方法。这个时候函数被当做方法调用,this关键字,就是代表这个对象,即this=point 改写成以下方式也完全正确

         var point={
x:10,
y:10,
moveTo:function(x,y){
point.x=point.x+x;
point.y=point.y+y;
}
}; var result=point.moveTo(10,10);
  window.color="red";
var o={color:"Blue"};
//printColor()是在全局作用域中定义的
function printColor(){
document.write(this.color);
}
printColor(); //在全局作用域中调用函数,则this代表了window
o.printColor=printColor //把函数给了对象
o.printColor();//此时this引用的是o.color

作为函数调用

当函数被直击调用时候,this被绑定到全局对象,在浏览器中window就是该全局对象

         function makeNoSense(x){
this.x=x; //这个x本来是局部变量,但是当函数被直接调用的时候,x就变成了全局变量
}
makeNoSense(100); //x已成了一个值为100的全局变量

关于内部函数的绑定

         var point={
x:10,
y:10,
moveTo:function(x,y){
//声明在函数MoveTo内部的内部函数
var moveX=function(x){
this.x=x;
};
//声明在函数MoveTo内部的内部函数
var moveY=function(y){
this.y=y;
};
moveX(x);
moveY(y);
}
};
point.moveTo(10,10);
point.x;
point.y;
x;
y;

函数的属性和方法

Javascript中函数式对象,既然是对象,那么它就有属性和方法,每个函数都包括两个属性:length和prototype

length:希望接受命名参数的个数

prototype:保存所有实例方法

  //函数的length属性
function printName(name){
document.write(name);
}
function sum(num1,num2,num3){
return num1*num2*num3;
} function sayHi(){
document.write("Hello JavaScript!");
} document.write(printName.length); //Output: 1
document.write(sum.length); //Output: 3
document.write(sayHi.length); //Output: 0

this对象:引用函数据以执行的环境对象

JavaScript引用类型(二)的更多相关文章

  1. 2、JavaScript 基础二 (从零学习JavaScript)

     11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...

  2. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  3. 初探JavaScript(二)——JS如何动态操控HTML

    除去五一三天,我已经和<JavaScript Dom编程艺术>磨合了六天,第一印象很好.慢慢的,我发现这是一块排骨,除了肉还有骨头.遇到不解的地方就会多看几遍,实在不懂的先跳过,毕竟,初次 ...

  4. 从头开始学JavaScript (十二)——Array类型

    原文:从头开始学JavaScript (十二)--Array类型 一.数组的创建 注:ECMAscript数组的每一项都可以保存任何类型的数据 1.1Array构造函数 var colors = ne ...

  5. 图解Javascript引用类型之数组

    以图说事明理,恰当时候会事半功陪.今天我就尝试着用图的方式讲讲“JavaScript引用类型之数组”.望更多童鞋给我反馈! 好东西分享给大家,但要尊重事实!!!因此特别说明:本图非我本人亲自所作,乃我 ...

  6. 使用JavaScript生成二维码教程-附qrcodejs中文文档

    使用javascript生成二维码 依赖jquery 需要使用到的库 https://github.com/davidshimjs/qrcodejs DIV <div id="qrco ...

  7. 同事问如何判断同花顺,我用javascript的二维数组写了个简易demo

    有个前同事在群里问如何判断是否为同花顺我用javascript的二维数组写了个简易demo. <!DOCTYPE html> <html> <body> <s ...

  8. Javascript面向对象二

    Javascript面向对象二 可以通过指定原型属性来对所有的对象指定属性, Object.prototype.name="zhangsan"; Object.prototype. ...

  9. QrCode C#生成二维码 及JavaScript生成二维码

    一 C#的二维码    示例: class Program { static void Main(string[] args) { QrEncoder qrEncoder = new QrEncode ...

随机推荐

  1. Trie树学习2

    数组实现的Trie树 字符容量有限,能够使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include < ...

  2. 修改MyEclipse内存-------OutOfMemoryError错误

    1.打开MyEclipse后,进入Windows/Preferences/Java/Installed JREs 点击后,在右边窗口选择JREs,双击后进入 2.在Default VM Argumen ...

  3. C++学习笔记之数据类型

    一.变量名 几条简单的C++命名规则: 在名称中只能使用字母,数字和下划线 名称的第一个字符不能是数字 区分大小写 不能将C++关键字用作名称 以两个下划线和大写字母打头的名称被保留给实现(编译器及其 ...

  4. 一步步学Mybatis-实现多表联合查询(4)

    上一章节中我们已经完成了对单表的CRUD操作,接下来今天这一讲讲述的是关于Mybatis在多表查询时候的应用,毕竟实际业务中也是多表的联合查询比较多嘛~ 还记得最一开始我们新建过一张Website表吗 ...

  5. POJ 2309 BST 树状数组基本操作

    Description Consider an infinite full binary search tree (see the figure below), the numbers in the ...

  6. SQL Server 2008数据库重命名方法

    假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...

  7. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  8. JAVA+FlexPaper+OpenOffice+SWFTools文档预览

    http://blog.csdn.net/core_star/article/details/10148047 1.软件环境: openoffice:启动openoffice服务:soffice.ex ...

  9. 终端I/O之stty命令

    所有的终端选项标志,在程序中都可用tcgetattr和tcsetattr函数(http://www.cnblogs.com/nufangrensheng/p/3576682.html)进行检查和更改. ...

  10. 压缩工具和整盘备份工具dd

    一.使用gzip压缩文件 gzip是GNU zip的缩写. [命令格式] gzip [option] filename [常用选项] c:压缩后将结果输出到标准输出,并保留原始文件. d:解压缩文件. ...