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. rpm包的管理

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.S.u ...

  2. ENTBOOST 2014.180L 发布,开源企业IM免费企业即时通讯

    ENTBOOST,VERSION 2014.180 Linux版本发布,主要增加企业IM应用集成功能,完善安卓SDK功能及部分BUG修正: 7/1(明天)发布Windows版本,敬请关注! ENTBO ...

  3. __declspec,__cdecl,__stdcall区别和作用

    _cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的 顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...

  4. 可配置多功能门 SN74LVC1G57, 1G58, 1G97, 1G98, 1G99

    Configurable Multiple-Function Gate  SN74LVC1G57 SN74LVC1G58 SN74LVC1G97 SN74LVC1G98 SN74LVC1G99

  5. 查看系统和PowerShell版本

    查询PowerShell当前版本$psversiontable.BuildVersion.Major 查询Windows当前版本:[System.Environment]::OSVersion.Ver ...

  6. embed 隐藏播放器显示

    昨天在页面做音频播放的时候,客户要求仅仅有声音.不显示播放器. 百度搜到解决方法: <embed id="embed_sound_id" src="test.mp3 ...

  7. 从零开始学android开发-项目打包发布

    右键项目 选择[android tools]-[export signed application package] 点击[next] 如果没有keystore可以选择[create new keys ...

  8. Winform 导出成Excel打印代码

    WinForm中 直接调用Excel的打印预览功能,但不显示Excel文件 using Microsoft.Office.Interop.Excel; //引用 public void PrintPr ...

  9. 【JavaScript】HTML5存储方案

    1.Web SQL 2.IndexedDB 3.Local Storage 4.Session Storage 5.Cookies 6.Application Cache

  10. Understanding page frames and pages

    Memory in Linux is organized in the form of pages (typically 4 KB in size). Contiguous linear addres ...