ECMAScript《JavaScript高级程序设计》笔记:引用类型(五)

Object类型

开创object实例方法发生星星点点种植。第一种方式运用new操作符后以及object构造函数。如下:

var person=new Object();
person.name="Nicholas";
person.age=29;

亚种植办法运用对象字面量表示拟。如下:

var person={
    name:"Nicholas",
    age:29
}

Array类型

检测数组

使用instanceof操作符:

if(value instanceof Array){
        //对数组执行某些操作
    }

ECMAScript5新加Array.isArray()方法。这个方法的目的是最终确定有值到底是匪是几度组,而随便它是以哪个全局执行环境被开创的。这个措施如下:

if(Array.isArray(value)){
        //对数组执行某些操作
    }

IE9+及以上,其它主流浏览器兼容。

 转换方法

toLocaleString()方法

toString()方法

valueOf()方法

join()方法

负有目标都独具toLocaleString()、toString()、valueOf()方法。其中调用数组的toString方法会返回以数组中的每个值的字符串形式拼接而成为的一个缘逗号分割的字符串。

若调用valueOf()方法返回的或者数组。

var colors = ['red','blue','green'];
console.log(colors.toString());
console.log(colors.valueOf());
console.log(colors.toLocaleString());

取得的结果如图所示:

此外toLocaleString()方法经常会返回跟toString()和valueOf()方法同样之价值。但也无是究竟这么。当调用数组的toLocaleString()方法时,它吗会创一个频组值的为逗号分割的字符串。而跟眼前少单主意唯一不同之是,这无异于蹩脚为赢得各级一样码之价,调用的诸一样起之toLocaleString()方法,而休是toString()方法。如下面例子:

var person1 = {
    toLocaleString: function(){
        return "Nikolaos";
    },
    toString: function(){
        return "Nicholaos";
    }
}
var person2 = {
    toLocaleString: function(){
        return "Grigorios";
    },
    toString: function(){
        return "Greg";
    }
}

var person = [person1,person2];
alert(person); //Nicholaos,Greg
alert(person.toString()); //Nicholaos,Greg
alert(person.toLocaleString());//Nikolaos,Grigorios

证:由于alert()要接字符串参数,所有它会以后台调用toString()方法,得到同直接调用toString()方法同样的结果。

数组继承的toLocaleString()、toString()、valueOf()方法,在默认情况下都见面为逗号分割的字符串的款式返回数组项。可以行使join()方法,则可用不同的相间符来构建这个字符串。

join()方法

join() 方法用于把数组中的装有因素放入一个字符串。元素是透过点名的相间符进行分隔的。返回一个字符串。

var colors = ['red','blue','green'];
console.log(colors.join(',')); //red,blue,green
console.log(colors.join('||')); //red||blue||green

栈方法(后进先出)

仓库是一律种LIFO(Last-In-First-Out,后进先出)的数据结构,也便是新型添加的要素最早于移除。

ArrayObj.push()方法

ArrayObj.pop()方法

ArrayObj.push():就是向阳数组末尾添加新的要素,返回的凡数组新的尺寸。
ArrayObj.pop():就是往数组中删去数组最后一个要素而返回该因素。如果数组为空就返回undefined。

排方法(先进先出)

ArrayObj.shift()

ArrayObj.unshift()

ArrayObj.shift():方法用于把数组中之第一单因素删除,并返回第一只要素的值。
若数组是拖欠的,则shift()
方法不进行其他操作,返回undefined。请小心,该措施不创造新数组,而是径直修改原来的数组。该方法会改变屡组的长度。

ArrayObj.unshift() :该方式而拿它们的参数顺序上加到数组的头颅。它直接修改了往往组,而休是创立一个新的数组。返回的是新数组的尺寸。 
unshift()每当IE6,IE7下,数据产生补充加事业有成,但回到回值却是undefined.

重排序方法

reverse()方法

sort()方法

reverse()方法会对反转数组项的一一。

var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values);  //5,4,3,2,1

这边数组的初始值及顺序是1、2、3、4、5。而调用数组的reverse()方法后,其值的逐一变成了5、4、3、2、1。

sort()措施按升序排列数组——即绝小之值位于极端前头,最可怜的值消除在末对。为了兑现排序,sort()方法会调用每个数组项的toString()转型措施,然后比较得到字符串,以确定哪些排序。即使数组中之每一样宗都是屡屡组,sort()方法较的也是字符串,如下所示:

var values = [0, 1, 5, 10, 15];
values.sort();
alert(values);  //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;
   }
}

本条比函数可以动用被大部分数据类型,只要将该当做参数传递给sort()方法即可,如下面这个事例所示:

var values = [0, 1, 2, 5, 10, 15];
values.sort(compare);
alert(values);  //0,1,5,10,15

每当以比函数传递至sort()方法之后,数值还保持了正确的升序。当然,也堪透过比较函数产生降序排序的结果,只要交换比较函数返回的价即可:

function compare(value1, value2) {
   if (value1 < value2) {
       return 1;
   } else if (value1 > value2) {
       return -1;
   } else {
       return 0;
   }
}
var values = [0, 1, 2, 5, 10, 15];
values.sort(compare);
alert(values);  //15,10,5,1,0

reverse()和sort()方法会返回值是由此排序之后的数组。

对于数值类或者其valueOf方法会返回数值类的靶子类型,可以采用一个再简明的比函数。这个函数只要用第二独值减第一个值即可:

function compare(value1, value2) {
   return value2 - value1;
}

是因为较函数通过返回一个低于零、等于零还是超零底值来影响排序结果,因此减法操作就可适量处理所有情况。

操作方法

concat()方法

slice()方法

splice()方法

concat() 方法用于连接两只或多只数组。
该方法无见面变动现有的勤组,而只有会回给连续数组的一个副本。

<script type="text/javascript">

var a = [1,2,3];
document.write(a.concat(4,5));

</script>

输出的结果:1,2,3,4,5

 

简介slice()与splice()方法**

slice(start,end)方法
start
必需。规定自何处开始摘。如果是负数,那么它们规定于数组尾部开始算从的岗位。也就是说,-1
指最后一个元素,-2 指倒数第二个元素,以此类推。 
end
可选。规定从哪里结束选取。该参数是数组片断结束处的数组下标。如果没有点名该参数,那么切分的数组包含从
start
到数组结束的有所因素。如果是参数是负数,那么它规定之是自从数组尾部开始算从的素。
返回值:返回一个初的频繁组,包含从 start 到 end (不包拖欠因素)的
arrayObject 中的因素。

 

splice() 方法用于插入、删除或调换数组的素

语法:arrayObject.splice(index,howmany,element1,…..,elementX)

index 必需。规定自何处添加/删除元素。
欠参数是开始插入和(或)删除的数组元素的下标,必须是数字。

howmany 必需。规定相应去多少元素。必须是数字,但可是 “0”。
一旦不规定是参数,则去从 index 开始交原数组最后的有着因素。

element1 可选。规定而增补加到数组的初因素。从 index
所依靠的下标处开始插入。 
elementX 可选。可于数组添加若干素。

返回值:如果由 arrayObject
中剔除了元素,则赶回的是含有让删去的因素的数组。
证实:splice() 方法而去从 index
处开始的零个或多只因素,并且用参数列表中宣称的一个或多单价值来替换那些让删的元素。

 

脚简要概括一下slice()与splice()方法

slice(start, end);
slice()方法返回从参数指定位置上马到当下数组末尾的有项。如果起半点个参数,该方式返回起死和收位置之间的项,但非包括了位置的起。

var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);

console.log(colors2); // green, blue, yellow, purple
console.log(colors3); // green, blue, yellow

splice()有去,插入,替换的成效

删除
待简单个参数,要去的第一宗之岗位与苟删减的项数。

var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1);
console.log(colors); // greeen, blue
console.log(removed); // red

插入
需要三单参数:起始位置、0(要刨除的项数)和苟插入的起

var colors = ["red", "green", "blue"];
var removed = colors.splice(1,0,"yellow", "orange");
console.log(colors); // ["red", "yellow", "orange", "green", "blue"]
console.log(removed); // 返回空

替换
用三只参数:起始位置、要去的项数和而插入的自由数量的项。

var colors = ["red", "green", "blue"];
var removed = colors.splice(1,1,"yellow", "orange");
console.log(colors);  // ["red", "yellow", "orange", "blue"]
console.log(removed); // ["green"]

 位置方法

indexOf()方法

lastIndexOf()方法

ECMAScript5也数组实例添加了个别独岗位方法:indexOf()和lastIndexOf()。这有限单点子都接受两独参数:要寻找的项和(可选的)表示找起点位置的目。其中indexOf()方法从数组开头(位置0)开始通往后查找,lastIndexOf()方法虽然从数组的末梢开始上查找。

立半只道还回去寻找的宗于三番五次组中的岗位,或者没有翻动找到的情况下返回-1。在可比第一个参数和数组中的各个一样码时,会用全等操作符;也就是说要求寻找的起必须严厉等(就如以===一样)。

var numbers = [1,2,3,4,5,4,3,2,1];
console.log(numbers.indexOf(4));//3
console.log(numbers.lastIndexOf(4));//5
console.log(numbers.indexOf(4,4)); //5
console.log(numbers.lastIndexOf(4,4));//3
var person = {name:'Niccholas'};
var people = [{name:'Niccholas'}];
var morePeople = [person];
console.log(people.indexOf(person));//-1
console.log(morePeople.indexOf(person)); //0

支持的浏览器IE9+,FireFox2+,Safari3+,Opera9.5+和Chrome。

迭代方

ECMAScript5吗数组定义了5独迭代方法。每个方法都吸纳两单参数:要在各国一样项上运行的函数和(可选的)运行该函数的作用域对象——影响this的价值。传入这些办法的函数会接收三独参数:数组项的价值、该项在屡组被之职与数组对象自我。根据使用的道不同,这个函数执行后的返回值可能会见也可能未见面影响看的回来值。

every():对数组中之各国一样桩运行为定函数,如果该函数对各国一样件都回true,则回true。

filter():对数组中的各国一样桩运行于定函数,返回该函数会回到true的起组成的数组。

forEach():对数组中之每一样桩运行为定函数,这个法无回到值。

map():对数组中的诸一样起运行于定函数,返回每次函数调用的结果成的数组。

some():对数组中之各一样起运行为定函数,如果该函数对某个一样桩返回true,则回true。

以上办法还不会见改数组被的带有的值。

于这些主意中不过相似的凡every()和some(),他们还用于查询数组中之有一样宗是不是满足某个条件。

var numbers = [1,2,3,4,5,4,3,2,1];
var everyResult = numbers.every(function(item,index,array){
    return (item > 2);
});
console.log(everyResult); //false

var someResult = numbers.some(function(item,index,array){
    return (item > 2);
});
console.log(someResult); //true

filter():

var numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(item,index,array){
    return (item > 2);
});
console.log(filterResult); //[3, 4, 5, 4, 3]

map():

var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item,index,array){
    return (item * 2);
});
console.log(mapResult);  //[2, 4, 6, 8, 10, 8, 6, 4, 2]

forEach():

此办法没有回到值,本质上同动for循环迭代数组一样。

支撑之浏览器IE9+,FireFox2+,Safari3+,Opera9.5+和Chrome。

压缩术

ECMAScript5尚新增了点儿独压缩数组的法门。reduce()和reduceRight()方法。这有限只措施还见面迭代数组的有着项,然后构建一个末回的价。其中reduce()方法从数组中之率先码开始,逐个遍历到最后。而reduceRight()则于数组的最后一码开始,向前遍历到第一宗。

当下简单独艺术还接到两个参数:一个在各个一样码上调用的函数和(可选)作为缩小基础之初始值。传被reduce()和reduceRight()的函数接收四只参数:前一个价值、当前价、项之装有、数组对象。这个函数返回的任何价值都见面当第一个参数自动传被下同样件。第一浅迭代放生在数组的亚起上,因此首先个参数是屡组的第一项,第二独参数是数组的老二码。

使reduce()方法可以实施求数组被所有值之同底操作,比如:

var values = [1,2,3,4,5];
var sum = values.reduce(function(pre,cur,index,array){
    return pre + cur;
});
console.log(sum); //15

reduceRight()方法一般,只是方式想法而已。

支撑之浏览器IE9+,FireFox2+,Safari3+,Opera9.5+和Chrome。

Date类型

要是创造一个日期对象,使用new操作符和Date构造函数即可:

var now = new Date();

 Date.parse()方法和Date.UTC()方法

里面Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据此字符串返回相应日期的毫秒数。ECAM-262没有概念Date.parse()应该支持啦种日期格式,因此这个点子的作为为实现而异,而且通常是坐地区而异。将地方安装也美国之浏览器通常都受下列日期格式:

“月/日/年”,如6/13/2004;

“英文月名 日,年”,如May 12,2004;

“英文星期几 英文月名 日 年 时:分:秒 时区”,如Tue May 25 2004 00:00:00
GMT+0800。

ISO 8601扩展格式YYYY-MM-DDTHH:mm:ss:sssZ(例如
2004-05-25T00::00:00)。只有兼容ECMAScript5之兑现支持这种格式。

例如,要啊2004年5月25日创造一个日子对象,可以使用下的代码:

var someDate = new Date(Date.parse('May 25,2004')); //Tue May 25 2004 00:00:00 GMT+0800 (中国标准时间)

而传入Data.parse()的办法的字符串
不克表示日期格式,会回来NAN。实际上,如果直白拿意味着日期的字符串传递给Date构造函数,也会见当后台调用Date.parse()方法,例如下面的代码和前面的凡等价格的。

var someDate = new Date('May 25,2004'); //Tue May 25 2004 00:00:00 GMT+0800 (中国标准时间)

 这行代码将见面赢得与前面一行同的日子对象。

Date.UTC()方法

Date.UTC()同样返回日期的毫秒数。但她同Date.parse()在构建值时采用的凡差之音讯。Date.UTC()的参数分别代表年、基于0的月数(一月是0,二月凡是1,依次类推)、月吃的哇一样龙(1交31)、小时数(0至23)、分钟、秒、毫秒数。在这些参数中只是发前少个参数是要的(年和月)。如果没有供月被的数,则使天数为1;如果省略其它参数,则净假设为0,如下例子:

//GMT时间2000年1月1日午夜零时
var y2k = new Date(Date.UTC(2000,0));
console.log(y2k); //Sat Jan 01 2000 08:00:00 GMT+0800 (中国标准时间)

//GMT时间2005年5月5日下午5:55:55
var allFives = new Date(Date.UTC(2005,4,5,17,55,55));
console.log(allFives);//Fri May 06 2005 01:55:55 GMT+0800 (中国标准时间)

说明下:

Greenwich Mean Time
(GMT)格林尼治标准日
英国、爱尔兰、冰岛和葡萄牙属于该时区。这个时区与华夏北京时间的时差是8独小时,也就是说比北京时间晚8单小时。

依照,如果是北京时间的下午3:00,也即是其一时区的上午7:00。

Date构造函数

Date构造函数会模仿Date.UTC(),但出一点
异的凡,日期与时还是冲本地时区而非GMT来创造。不过他们的参数跟Date.UTC()的参数一样。

例如:

//本地时间2000年1月1日午夜零时
var y2k = new Date(2000,0);
console.log(y2k); //Sat Jan 01 2000 00:00:00 GMT+0800 (中国标准时间)

//本地时间2005年5月5日下午5:55:55
var allFives = new Date(2005,4,5,17,55,55);
console.log(allFives);//Thu May 05 2005 17:55:55 GMT+0800 (中国标准时间)

Date.now()方法

ES5填补加了Date.now()方法,返回表示这个主意时之日子及时间之毫秒数。这个方式简化了下Date对象分析代码的工作,例如:

//取得开始时间
var start = Date.now();

//调用函数
dosomething();

//取得结束时间
var stop = Date.now(),
    result = stop - start;
console.log(start,stop,result); //1494292306763 1494292306768 5


function dosomething(){
    console.log('打印结果');
}

支撑Date.now()方法的浏览器包括IE9+,FireFox3+,Safari3+,Opera10.5+和Chrome。在非支持之旁浏览器,使用+操作符把Date对象转成字符串,也堪直达同等之目的。

//取得开始时间
var start = +new Date();

//调用函数
dosomething();

//取得结束时间
var stop = +new Date(),
    result = stop - start;
console.log(start,stop,result); //1494292306763 1494292306768 5


function dosomething(){
    console.log('打印结果');
}

 继承的计

暨外引用类型一样,Date类型也再写了toLocaleString()、toString()和valueOf()方法。

中toLocaleString()、toString()在展示日期以及岁月尚未什么价;而valueOf()方法无是回来的字符串,而是回到日期的毫秒表示。因此可方便使用比较操作符(大于或小于)来比日期值。如下面的事例:

var date1 = new Date(2007,0,1);
var date2 = new Date(2007,1,1);
console.log(date1 < date2); //true
console.log(date1 > date2); //false

日子格式化方法

Date类型还有一对专程用来将日期格式化为字符串的办法,如下:

toDateString()——以特定于贯彻之格式显示星期几、月、日与年;

toTimeString()——以一定于实现之格式显示时、分、秒和时区;

toLocaleDateString()——以一定与地区的格式显示星期几、月、日与年;

toLocaleTimeString()——以特定于贯彻的格式显示时、分、秒;

toUTCString()——以一定于实现的格式完整的UTC日期。

同toLocaleString()和toString()方法同样,以上这些字符串格式的办法输出为是坐浏览器而异的。因此未曾啊一个措施能够用来以用户界面上出示平的日子信息。

日子/时间组件方法

Date()
返回当日之日子和日。
getDate() 从 Date 对象回到一个月被之某平等天 (1 ~
31)。
getDay() 从 Date 对象回来一健全被的某某一样上 (0 ~
6)。
getMonth() 从 Date 对象回来月份 (0 ~
11)。
getFullYear() 从 Date
对象为四各项数字返回年份。
getYear()
请使用 getFullYear() 方法代替。
getHours() 返回 Date 对象的钟点 (0 ~
23)。
getMinutes() 返回 Date 对象的分钟 (0 ~
59)。
getSeconds() 返回 Date 对象的秒数 (0 ~
59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~
999)。
getTime() 返回 1970 年 1 月 1
日至今天之毫秒数。
getTimezoneOffset()
返回本地时间跟格林威治标准日 (GMT) 的分钟差。
getUTCDate()
根据世界时从 Date 对象归回月中的一样上 (1 ~ 31)。
getUTCDay()
根据世界时自 Date 对象回到周中的一模一样上 (0 ~ 6)。
getUTCMonth()
根据世界时自 Date 对象回到月份 (0 ~ 11)。
getUTCFullYear()
根据世界经常自 Date 对象归四个数之年。
getUTCHours()
根据世界时回来 Date 对象的小时 (0 ~ 23)。
getUTCMinutes()
根据世界经常回来 Date 对象的分钟 (0 ~ 59)。
getUTCSeconds()
根据世界经常返回 Date 对象的秒钟 (0 ~ 59)。
getUTCMilliseconds()
根据世界时返回 Date 对象的毫秒(0 ~ 999)。
setDate() 设置 Date 对象中月的某平龙 (1 ~
31)。
setMonth() 设置 Date 对象中月份 (0 ~
11)。
setFullYear() 设置 Date
对象吃之年份(四各类数字)。
setYear()
请使用 setFullYear() 方法代替。
setHours() 设置 Date 对象吃之钟点 (0 ~
23)。
setMinutes() 设置 Date 对象中之分钟 (0 ~
59)。
setSeconds() 设置 Date 对象吃之秒钟 (0 ~
59)。
setMilliseconds() 设置 Date 对象被之毫秒 (0 ~
999)。
setTime() 以毫秒设置 Date 对象。
setUTCDate()
根据世界经常设置 Date 对象中月份之等同天 (1 ~ 31)。
setUTCMonth()
根据世界时设置 Date 对象中之月 (0 ~ 11)。
setUTCFullYear()
根据世界经常设置 Date 对象中之年(四各项数字)。
setUTCHours()
根据世界时设置 Date 对象吃之钟点 (0 ~ 23)。
setUTCMinutes()
根据世界时设置 Date 对象被之分钟 (0 ~ 59)。
setUTCSeconds()
根据世界时设置 Date 对象被之秒钟 (0 ~ 59)。
setUTCMilliseconds()
根据世界经常设置 Date 对象吃之毫秒 (0 ~
999)。

 可查阅相应的行使与说明:

js中日new
Date()详解以及实例

日拍卖总结

RegExp类型

ECMAScript通过RegExp种类支持正则表达式,如下:

var expression = /pattern/flags;

中间的模式(pattern)一对足是其他简单或者复杂的正则表达式,可以分包字符类、限定符、分组、向前查找和反向引用。每个正则表达式可含蓄一个要多只号(flags),用以标明正则表达式的行为。有三个以下标志:

  • g:表示全局模式,即模式将让以及所有字符串,而休在发现第一只门当户对配项时马上停下。

  • i:表示未分轻重缓急写模式。

  • m:表示多实行模式,即以到达一行文本末尾时还于此起彼伏找下一行中是不是在叫模式匹配的项。

以字面量的形式来定义正则表达式

例如:匹配第一单bat或者cat,不分轻重缓急写

var pattern = /[bc]at/i;

利用RegExp构造函数

她接受两只参数:一个是只要配合的字符串模式,另一个凡可选的标志字符串。可以行使字面量定义的别样表达式,都得以用构造函数来定义,还是以上给之例证也例:

var pattern = new RegExp("[bc]at","i");

注意:RegExp构造函数模式参数时字符串,所以又某些情况下如对准字符进项双重转义。所有元字符都必须另行转义,如许面量模式也 style=”color: #ff0000;”>/\[bc\]at/,那么当价格的字符串为 style=”color: #ff0000;”>"/\\[bc\\]at/"

例子:

var re = null,
    i;
    for(i=0; i < 10; i++){
        re = /cat/g;
        console.log(re.test("catastrophe"));
    }
    for(i=0; i < 10; i++){
        re = new RegExp("cat","g");
        console.log(re.test("catastrophe"));
    }

打印结果尚且也10只true

RegExp实例方法

exec

 

exec接收一个参数,即如果使用模式之字符串,然后回包含第一独相当信息之数组。

var text = "cat, bat, sat, fat";
var pattern1 = /.at/;

var matches = pattern1.exec(text);
console.log(matches); // ["cat"]

match
match是字符串执行匹配正则表达式规则之办法,他的参数是刚则发挥

var text = "cat, bat, sat, fat";
var pattern1 = /.at/;

var matches2 = text.match(pattern1);
console.log(matches2); // ["cat"]

test
test()接收一个字符串参数

var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;

if (pattern.test(text)){
    console.log("The pattern was matched"); // The pattern was matched
}

详尽分解可查看《js正则表达式详解》

 Function类型

由于函数称作光是依靠为函数的指针。因此函数誉为和含对象指针的任何变量没有呀不同。换句话说,一个函数可能产生差不多个名字,如下例子:

function sum(num1,num2){
return num1 + num2;
}
console.log(sum(10,10)); //20

var anotherSum = sum;
console.log(anotherSum(10,10)); //20

sum = null;
console.log(anotherSum(10,10)); //20

专注:使用无带圆括号的函数名是访问函数指针,而非调用函数。

从不重载(深入明)

函数声明与函数表达式

作为价值的函数

函数内部属性

当函数内部生个别单例外的靶子:arguments和this。

将arguments转为数组

(function() {
    var slice = Array.prototype.slice,
        aArguments = slice.apply(arguments);

        console.log(aArguments);
})(10, 20, 30);

arguments.callee

拖欠属性是一个指针,指向拥有这arguments对象的函数。当函数在严厉模式下运作时,访问arguments.callee会导致错误。

this

window.color = "red";
var o = {color:"blue"};

function sayColor(){
    console.log(this.color);
}

sayColor(); // red

sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue

函数属性与方式

length

length属性表示函数希望接的命名参数的个数。

function sayName(name){
    alert(name);
}

function sum(num1,num2){
    return num1 + num2;
}

function sayHi(){
    alert("hi");
}

console.log(sayName.length); //1
console.log(sum.length); //2
console.log(sayHi.length); //0

prototype

当es5面临prototype属性是不可枚举的,因此采取for-in无法察觉。

每个函数都蕴含两独非继承而来之点子:call()和apply()。他们的别在接收的参数方式不同。

function sum(num1, num2){
    return num1 + num2;
}

function callSum1(num1,num2){
    return sum.apply(this,arguments);
}

function callSum2(num1, num2){
    return sum.apply(this, [num1, num2]); 
}

console.log(callSum1(10,10)); // 20
console.log(callSum2(10,10)); //20

传送参数并非apply()和call()的用武之地,它们的兵不血刃的处在当为扩充函数的作用域,如下例子:

window.color = "red";
var o = {color:"blue"};

function sayColor(){
console.log(this.color);
}

sayColor(); //red
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(){
console.log(this.color);
}

var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue

sayColor调用bind()并传入o对象,创建了objectSayColor()函数,objectSayColor()函数的this值等于o。

于是即使是在全局作用域中调用这个函数,结果为是blue。

 基本包装档次

var value = "25";
var number = Number(value);
console.log(typeof number);
console.log(number instanceof Number);// false

var obj = new Number(value);
console.log(typeof obj);
console.log(obj instanceof Number);// true

Boolean类型

var falseObject = new Boolean(false);
var result = falseObject && true; // true  

//布尔表达式中的所有对象都会被转换为true, 因此falseObject对象在布尔表达式中代表的是true

console.log(result); // true

var falseValue = false;
result = falseValue && true;
console.log(result); //false

console.log(typeof falseObject); //object
console.log(typeof falseValue); // Boolean
console.log(falseObject instanceof Boolean); //true
console.log(falseValue instanceof Boolean); // false

Number类型

var numberObject = new Number(10);
var numberValue = 10;
console.log(typeof numberObject); // Object
console.log(typoef numberValue); // number
console.log(numberObject instanceof Number); // true
console.log(numberValue instanceof Number); // false

String类型

字符方法

charAt() charCodeAt()

charAt()方法以只字符字符串的形式返回给定位置的万分字符串。

charCodeAt()返回的是字符编码。

var stringValue = "hello world";
console.log(stringValue.charAt(1)); // e
console.log(stringValue.charCodeAt(1)); // 101

字符串操作方法

concat()

concat()用于将同样或多单字符串拼接起来。

var stringValue = "hello ";
var result = stringValue.concat("world");
console.log(result); // hello world
console.log(stringValue); // hello

slice(start, end)
end 代表字符串到何了。
只要传入的凡负数,slice()方法会将盛传的负值与字符串长度相加。

var str="Hello happy world!";
console.log(str.slice(6)); // happy world!
console.log(str.slice(6,11));// happy
console.log(str.slice(-3)); // ld!
console.log(str.slice(3, -4)); //lo happy wo 

substring(start, end)
倘若传入的凡负数, substring()会将具备字符参数还易为0

var str="Hello happy world!";
console.log(str.substring(6)); // happy world!
console.log(str.substring(6,11));// happy
console.log(str.substring(-3)); // Hello happy world!
console.log(str.substring(3, -4)); //Hel

substr(start, length)
假使传入的是负数,substr()方法以依的率先个参数加上字符串的长度,而以负的次只参数转换为0

var str="Hello world!";
console.log(str.substr(3)); //lo world!
console.log(str.substr(3, 7)); //lo worl
console.log(str.substr(-3)); // ld!
console.log(str.substr(3, -3)); // 空字符串

字符串位置方法

indexOf() lastIndexOf()

var stringValue = "hello world";
console.log(stringValue.indexOf("o")); // 4
console.log(stringValue.lastIndexOf("o")); //7

当下有限单点子都可吸收可卜的亚独参数,表示于字符串中的哪位位置上马搜。

var stringValue = "hello world";
console.log(stringValue.indexOf("o", 6)); // 7
console.log(stringValue.lastIndexOf("o", 6)); //4

字符串的模式匹配方法

match()

var text = "cat, bat, sat, fat";
var pattern = /.at/;

var matches = text.match(pattern);
console.log(matches.index); //0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); //0

search()

var text = "cat, bat, sat, fat";
var pos = text.search(/at/);
console.log(pos); // 1

replace()

var text = "cat, bat, sat, fat";
var result = text.replace("at", "ond");
console.log(result); // cond, bat, sat, fat

var result = text.replace(/at/g, "ond");
console.log(result); // cond, bond, sond, fond

单体内置对象

Global对象

URI编码方法
Global对象的encodeURI()和encodeURIComponent()方法可以针对URI(Uniform
Resources Identifiers,通用资源标识符)进行编码,以便发送给浏览器。

var url = "http://www.baidu.com/";
console.log(encodeURI(url));
console.log(encodeURIComponent(url));

encodeURI()和encodeURIComponent()方法对象的有数单方式分别是decodeURI()和decodeURIComponent()

Math对象

random()方法

Math.random()方法返回介于0和1之内一个任意数,不保险含0和1。对于一些站点来说,这个办法充分实用,因为可以动用她来随便亮有名言和消息事件。套用下面的公式,就得下Math.random()从有整数范围外随机挑选一个价值。

值=Math.floor(Math.random()*或许价值的总和+第一个可能的价值)

像:如果想选一个1届10中的数值,可以像下就边编写代码:

var num = Math.floor(Math.random()*10+1);

function selectFrom(lowerValue,upperValue){
    var choice = upperValue - lowerValue + 1;
    return Math.floor(Math.random()*choice+lowerValue);
}

var num = selectFrom(2,10);
console.log(num);

var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length-1)];
console.log(color);