标签:math object类 编写 逗号 引用类型 nim 重要 自动 数学公式
欢迎关注本人的微信公众号“前端小填填”,专注前端技术的基础和项目开发的学习。
本节内容对应《JavaScript高级程序设计》的第五章内容。
在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,通常也被称为类,有时候也被成为对象定义,因为他们描述的是一类对象所具有的属性和方法。对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的, var person = new Object() ; 创建了一个object对象。构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义的。
ECMAScript提供了很多原生引用类型,以便开发人员用以实现常见爱你的计算任务。
1、Object类型:Object类型是ECMAScript中使用最多的一个类型。
var person = new Object(); person.name = “Nicholas”; person.age = 29;
另一种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。注意:在通过这种方法创建对象时,实际上并不会调用object的构造函数。
var person = { name:”Nicholas”, age:29 //最后一个属性不加逗号 };
2、Array类型:除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了。而且,ECMAScript中的数组与其他多数语言中的数组有着很大的区别。与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二个位置来保存数值,用第三个位置来保存对象,依次类推。而且,ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
//直接创建对象 var colors = new Array() ; //创建指定数组大小的数组对象 var nums = new Array(20) ; //预先知道要保存的数据项 var anims = new Array("tiger","cat","dog") ;
//创建一个空数组 var names = []; //创建一个包含三个字符串的数组 var colors = [“red”,”blue”,”green”];
var colors = ["red","blue","green"]; colors.length = 2; alert(colors[2]); //undefined
var numbers = [0,1,5,10,15]; numbers.sort(); alert(numbers);//0,1,10,15,5
sort()方法可以接收一个比较函数作为参数,以便指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。
function compare(value1 , value2){ if(value1 < value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; } } var numbers = [0,1,5,10,15]; var characters = ["A" , "a" , "e" , "b"]; characters.sort(compare); numbers.sort(compare); alert(numbers);//0,1,5,10,15 alert(characters);//A,a,b,e
删除:可以删除任意数量的项,只需指定两个参数:要删除的第一项的位置和要删除的项数。例如:splice(0,2)会删除数组中的前量项。
插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。如果插入多个项,可以再传入第四、第五,以至任意多个项。例如:splice(2,0,”red” , “green”),会从当前数组的位置2开始插入字符串”red”和”green”。
替换:可以项指定位置插入任意数量的项,同时删除任意数量的项,只需指定3个参数:其实位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice(2,1,”red”,”green”)会删除当前数组位置2的项,然后再从位置2开始插入字符串”red”和”green”。
splice()方法始终会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)。var numbers = [0,1,2,3]; var removed = numbers.splice(0,1);//删除第一项 alert(numbers);//1,2,3 alert(removed);//0 removed = numbers.splice(1,0,8,9); alert(removed);//返回的是一个空数组 removed = numbers.splice(1,1,5,6); alert(removed);//8
var numbers = [0,1,2,3]; var everyResult = numbers.every(function(item , index , array){ return (item > 2); }); alert(everyResult);//false var someResult = numbers.some(function(item , index , array){ return (item > 2); }); alert(someResult);//true
var nums = [1,2,3,4,5,6]; var sum = nums.reduce(function(prev, cur , index , array){ return prev + cur; }); alert(sum);//21 alert(nums);//1,2,3,4,5,6
3、Date类型:ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的。为此,Date类型使用自UTC(CoordinatedUniversal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285616年。
//GMT 时间2000年1月1日午夜零时 var y2k = new Date(Date.UTC(2000 , 0)); //GMT时间2005年5月5日下午5:55:55 var allFives = new Date(Date.UTC(2005 , 4 ,5 , 17 , 55 , 55));
//取得开始时间 var start = Date.now(); //执行某些操作 …… //取得停止时间 var stop = Date.now(); var result = stop – start;
直接取得和设置日期值的方法
方法 |
说明 |
getTime() |
返回表示日期的毫秒数;与valueOf()方法返回的值相同 |
setTime(毫秒) |
以毫秒数设置日期,会改变整个日期 |
getFullYear() |
取得4位数的年份(如2016而非仅16) |
getUTCFullYear() |
返回UTC日期的4位数年份 |
setFullYear(年) |
设置日期的年份。传入的年份值必须是4位数字 |
setUTCFullYear(年) |
设置UTC日期的年份。传入的年份值必须是4位数字 |
getMonth() |
返回日期中的月份,其中0表示一月,11表示十二月 |
getUTCMonth() |
返回UTC日期中的月份,其中0表示一月,11表示十二月 |
setMonth(月) |
设置日期中的月份。传入的月份值必须大于0,超过11则增加年份 |
setUTCMonth(月) |
设置UTC日期中的月份。传入的月份必须大于0,超过11则增加年份 |
getDate() |
返回日期月份中的天数(1到31) |
getUTCDate() |
返回UTC日期月份中的天数(1到31) |
setDate(日) |
设置日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份 |
setUTCDate(日) |
设置UTC日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份 |
getDay() |
返回日期中星期的星期几(其中0表示星期日,6表示星期六) |
getUTCDay() |
返回UTC日期中星期的星期几(其中0表示星期日,6表示星期六) |
getHours() |
返回日期中的小时数(0到23) |
getUTCHours() |
返回UTC日期中的小时数(0到23) |
setHours(时) |
设置日期中的小时数,传入的值超过了23则增加月份中的天数。传入的值为负数,则实际值为前一天的24减参数的绝对值小时。 |
setUTCHours(时) |
设置UTC日期中的小时数,传入的值超过了23则增加月份中的天数。传入的值为负数,则实际值为前一天的24减参数的绝对值小时。 |
getMinutes() |
返回日期中的分钟数(0到59)。 |
getUTCMinutes() |
返回UTC日期中的分钟数(0到59)。 |
setMibutes(分) |
设置日期中的分钟数,传入的值超过59则增加小时数 |
setUTCMinutes(分) |
设置UTC日期中的分钟数,传入的值超过59则增加小时数 |
getSeconds() |
返回日期中的秒数(0到59) |
getUTCSeconds() |
返回UTC日期中的秒数(0到59) |
setSeconds(秒) |
设置日期中的秒数,传入的值超过59则增加分钟数 |
setUTCSeconds(秒) |
设置UTC日期中的秒数,传入的值超过59则增加分钟数 |
getMilliseconds() |
返回日期中的毫秒数 |
getUTCMilliseconds() |
返回UTC日期中的毫秒数 |
setMilliseconds(毫秒) |
设置日期中的毫秒数 |
setUTCMilliseconds(毫秒) |
设置UTC日期中的毫秒数 |
getTimezoneOffset() |
返回本地时间与UTC时间相差的分钟数。 |
4、RegExp类型:ECMAScript通过RegExp类型来支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式。 var expression =/pattern/flags; 其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可以有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志:
//匹配第一个“bat”或“cat”,不区分大小写 var pattern2 = /[bc]at/i;
5、Function类型:在ECMAScript中函数实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函数声明语法定义的。函数是对象,函数名是指针。
function sum(num1 , num2){ returnnum1 + num2; } //这与下面使用函数表达式定义函数的方式几乎相差无几 var sum = function(num1 , num2){ returnnum1 + num2; }; //注意末尾有分号 alert(sum(10,15)) ; //25 var sum2 = sum ; alert(sum2(10,15)) ; //25 sum = null ; alert(sum2(10,15)) ; //25
function sum(num1){ return num1 + 10; } function sum(num1 , num2){ return num1 + num2; } alert(sum(10)) ; //NaN alert(sum(10,30)); //40
alert(sum(10 , 20));//30 function sum(num1 , num2){ return num1 + num2; } //alert(add(10 , 20)); //报错,停止向下解析执行 var add = function(sum1 , sum2){ return sum1 + sum2; }; alert(sum(10 , 20)); //30
function createComparisonFunction(propertyName){ return function(object1,object2){ var value1 = object1[propertyName] ; var value2 = object2[propertyName] ; if(value1 < value2){ return -1 ; }else if(value1 > value2){ return 1 ; }else{ return 0 ; } } } var data = [{name:"Zachary", age:"23"}, {name:"Nicholas", age:"26"}] ; data.sort(createComparisonFunction("name")) ; alert(data[0].name) ; //Nicholas data.sort(createComparisonFunction("age")) ; alert(data[0].name) ; //Zachary
function factorial(num){ if(num <=1){ return 1; }else{ return num*factorial(num-1); } } alert(factorial(5)); //120 //利用arguments的callee的属性 function factorial(num){ if(num <=1){ return 1; }else{ return num*arguments.callee(num-1); } } alert(factorial(5));//120
函数内部的另一个特殊对象是this,其行为与Java和C#中的this大致类似。换句话说,this引用的是函数执行的环境对象——或者也可以说是this值(当在网页的全局作用域中调用函数时this对象引用的就是winsow)。
function outer(){ inner(); } function inner(){ alert(inner.caller); //代码会导致警告框中显示outer()函数的源代码。 //因为outer()调用了inner(),所以inner.caller就指向outer()。 } outer();
6、基本包装类型:为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean、Number和String。这些类型与其它引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。对于每个不同的包装类型都有很多对应的操作方法,我们可以通过一些API文档进行深入的学习和掌握。特别是Number和String类型的很多方法,我们会经常用到的。
7、单体内置类型:ECMA-262对内置对象的定义是“由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”意思就是说,开发人员不必显式地实例化内置对象,因为它们已经实例化了。前面已经介绍了大多数内置对象,如Object、Array和String。ECMA-262还定义了两个单体内置对象Global和Math。
《JavaScript高级程序设计》学习笔记(4)——引用类型
标签:math object类 编写 逗号 引用类型 nim 重要 自动 数学公式
原文地址:http://www.cnblogs.com/mukekeheart/p/6111369.html