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. 手机web开发Repeater四层嵌套

    最近有朋友想让我给他做个手机上页面,页面功能是显示省--市--区--门店信息,这种层级关系的数据,首先来看看效果: 我想现在的手机都是智能机了对于普通的asp.net页面开发应该没什么两样,不过最终开 ...

  2. Mac OS增删环境变量

    一.首先查看shell版本 使用命令echo $SHELL 如果输出的是:csh或者是tcsh,就是C Shell.如果输出的是:bash,sh,zsh,就是Bourne Shell的一个变种. Ma ...

  3. javascript优化

    javaScript是一门解释性的语言.它不像java.C#等程序设计语言.由编译器先进行编译再运行.而是直接下载到用户的客户端进行执行.因此代码本身的优劣就直接决定了代码下载的速度以及执行的效率. ...

  4. Codeforces Educational Codeforces Round 5 E. Sum of Remainders 数学

    E. Sum of Remainders 题目连接: http://www.codeforces.com/contest/616/problem/E Description The only line ...

  5. Shadow Mapping 的原理与实践(一)

    早在上世纪七十年代末,Williams在他的“Casting Curved Shadows on Curved Surface”一文中提出了名为Shadow Map的阴影生成技术.之后,他人在此基础上 ...

  6. Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象

    Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象 package org.rui.collection2.map; /** * ...

  7. 浏览器使用ActiveX控件

    在IE中使用ActiveX控件,需要使用HTML中的标志是<OBJECT>,该标记几个重要的参数特性有:1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的入口.2.CLA ...

  8. Linux下判断cpu物理个数、几核

    自己服务器的输出 1. 查看物理CPU的个数   #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l    1 2. 查 ...

  9. oracle的触发器

    oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1, insert触发器: 2, update触发器: 3, delete触发器: 触 ...

  10. 关于mysql下hibernate实体类字段与数据库关键字冲突的问题

    好久没写了,都忘记博客了,趁着现在还在公司,写的东西是经过验证的,不是在家凭记忆力写的,正确率有保障,就说说最近遇到的一件事情吧. 以前一直用的oracle数据库,这次项目我负责的模块所在的系统是用的 ...