内建对象
内建对象是指由ECMAScript事先提供的、不依赖于宿主环境的对象,这些对象在程序运行之前就已经存在了。可以直接在程序中任何地方任何时候拿来使用。
1. 内建全局单例对象 Global、Math、JSON。
在整个执行环境中只有一个对象实例,这些对象没有内部属性[[Construct]]和[[Call]],所以不能使用new来创建,也不能作为函数来调用,而是直接使用对象名称来引用其属性和方法(对于全局对象,则可以直接使用属性和方法名)。
1.1 常用内建全局单例对象方法
Global对象下的内建方法:
类别 | 方法 | 说明 |
全局解析方法 | eval(x) 解析Javascript字符串 | eval中定义的变量不会提升,在严格模式下,外部不能访问eval内定义的变量,不推荐使用 |
String解析 | parseInt(str,radix) | 将字符串解析为整数,可以传入一个进制,会忽略前导空格 |
parseFloat(str) | 将字符串解析为浮点数,会忽略前导的空格和前导0,会自动识别第一个小数点 | |
Number判断 | isNaN(num) | 判断是否不为数字,如果不是则为true,如果是则为false |
isFinite(num) | 判断数字范围是否为有限数,即是否在js预定范围内 | |
URL处理办法 |
encodeURI() |
对URI编码,用于整个URI,用特殊的UTF-8编码替换所有无效字符,如冒号,正斜杠,问号,井号等 |
decodeURI() |
使用ecnodeURI()编码的字符串解码 |
|
encodeURIComponent() |
对URI编码,用于URI中的某一段,会对发现的任何非标准字符进行解码 |
|
decodeURIComponent() |
对使用ecnodeURIComponent()编码的字符串解码 |
Math对象下的内建方法:
类别 | 方法 | 说明 |
取整系列 | ceil() | 向上取整 |
round() | 四舍五入 | |
abs() | 绝对值 | |
floor() | 向下取整 | |
随机方法 | random() | 介于0和1之间的随机数,不包括0和1,可封装方法返回指定位数,指定范围的随机数 |
最值方法 | max[value1,value2..] | 返回最大值 |
min[value1,value2..] | 返回最小值 |
JSON对象下的内建方法:
类别 | 方法 | 说明 |
解析 | parse(text) | 把JSON字符串解析为Javascript类型数据 |
stringify(obj,[replacer,[space]]) | 把Javascript对象序列为JSON字符串, 默认情况下不包括空格和缩进,所有函数、原型成员以及值为undefined的属性会被忽略 |
JSON.stringify()可以接受二个可选参数:
1、第一个可选参数是个过滤器,可以是一个数组,也可以是一个函数。如果是一个数组,那么结果中只保留这个数组中列出的属性;
如果是一个函数,这个函数被称为替换函数,接受两个参数:一个键和一个值。替换函数返回undefined时会忽略这个键,否则就将返回值作为这个键的值插入到相应位置。
2、第二个可选参数是个选项,表示是否在JSON字符串中保留缩进。如果这个参数是数字,表示每个级别缩进的空格数(最大不能超过10,超过10时自动设置为10),如果这个参数是字符串,则将作为缩进字符处理。
在调用JSON.stringify(obj)时,如果obj中有toJSON()方法并返回一个有效值时,会首先调用这个方法。
2. 内建对象
常见内建对象有以下,都可以直接通过new调用构造函数创建对象实例:
Object、Function、Array、String、Number、Boolean、Date、RegExp
Error(EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError)
2.1 Object和Function之前有详细说明
2.2 Array和String 内建对象属性和方法比较,有较多相似之处
对数组中每一项运行执行函数,返回每次调用的结果组成的数组
Array |
String |
|
长度属性 | length | length |
数组项的个数,可修改长度来添加或移除数组项的功能 |
字符串中字符的个数 | |
添加 | unshift(new1,new2…) | |
接受任意个参数,并添加到数组前面,返回新数组的长度 | ||
push(new1,new2…) | ||
接受任意个参数,把它们逐个添加到数组末尾,并返回新数组的长度 | ||
删除 | shift() | trim() |
移除数组第一项并返回,修改数组长度 | 去掉字符串前后的空格 | |
pop() | ||
移除数组最后一项,修改数组长度,返回被移除的项 | ||
查找 | indexOf() / lastIndexOf() | indexOf()/lastIndexOf() |
从数组中查找指定项,返回所在数组的位置,没有找到返回-1,indexOf()从开头向后查找,lastIndexOf()则从末尾向前查找. 第二个可选参数表示从哪个位置开始搜索 ,[可选参数] |
从字符串中查找子字符串,返回子字符串的位置,没有找到返回-1,indexOf()从前往后查找,lastIndexOf()从后往前找 第二个可选参数表示从哪个位置开始搜索 ,[可选参数] |
|
连接 | join() | + |
传入一个参数作为分隔符,将数组每一项连接起来,默认为逗号 | 多个字符串之间连接 | |
concat() | concat() | |
创建一个原数组的副本,将传入的参数压入新数组并返 | 多个字符串之间连接,更多情况是直接使用“+”拼接 | |
截取 | slice() | slice() |
接受1至2个参数,即要返回项的起始和结束位置 1、只有一个参数时,返回该参数位置开始到末尾的所有项 2、参数为负数时,加上数组长度使其变为正数 |
接受1至2个参数,即要返回项的起始和最后一个字符后面的位置 1、只有一个参数时,返回该参数位置开始到末尾的所有项 2、参数为负数时,加上数组长度使其变为正数 |
|
splice() | substr() 参数:开始位置,字符个数 | |
1、删除:指定2个参数,要删除的第一项的位置和要删除的项数 2、插入:提供3个参数,起始位置,0,要插入的项 3、替换:提供3个参数,起始位置,删除的项数,要插入的项 |
substring() 参数:开始位置,最后一个字符后面的位置 | |
转换 | toLocaleString() | toLocaleString() |
调用数组每一项的toLocaleString(),然后用逗号连接起来 | 返回对象表示的字符串 | |
toString() | toString() | |
调用数组每一项的toString(),然后用逗号连接起来 | 返回对象表示的字符串 | |
valueOf() | valueOf() | |
返回数组本身,即有array === array.valueOf() | 返回对象表示的字符串 | |
toLowerCase() | ||
转小写 | ||
toUpperCase() | ||
转大写 | ||
比较排序 | reverse() | localeCompare() |
反转数组项的顺序 |
对象在参数前返回负数,相等返回0,后面返回正数 |
|
sort() | ||
默认按升序排序,可以接受一个比较函数 | ||
字符 | charAt() / charCodeAt() | |
1个参数:基于0的字符位置charAt()返回单字符字符串,charCodeAt()返回字符编码 |
||
fromCharCode() | ||
将接受到的一或多个字符编码转变为字符串 | ||
匹配 | match() | |
与RegExp的exec()方法相同,接受一个参数, 要么是一个正则表达式,要么是一个RegExp对象 |
||
search() | ||
接受一个参数,和match()相同,返回字符串中第一个匹配项的索引,没有找到匹配项时返回-1, search()始终从字符串开头向后查找 |
||
replace() | ||
接受两个参数:一个RegExp对象或字符串和一个字符串或函数,若第一个参数为字符串,则只会替换第一个字符串,若想替换所有子字符串,第一个参数必须为指定了全局标志(g)的正则表达式 | ||
split() | ||
基于指定的分隔符将一个字符串分割成多个字符串,并将结果放在一个数组中返回,分隔符可以是字符串,也可以是正则表达式。可选的第二个参数用于指定数组的最大长度 | ||
迭代 | every() | |
对数组中每一项运行执行函数,每一项都返回true时返回true | ||
some() | ||
对数组中每一项运行执行函数,如果有其中一项执行函数返回true就返回true | ||
forEach() | ||
对数组中每一项运行执行函数,没有返回值 | ||
map() | ||
对数组中每一项运行执行函数,返回每次调用的结果组成的数组 | ||
filter() | ||
对数组中的每一项运行执行函数,返回执行函数返回true的项组成的数组 |
判断一个对象是否为数组时,在ES5中可以直接使用Array.isArray(obj), 在不支持isArray方法的环境中时,可以使用obj instanceof Array来判断只有一个作用域的情况,
最佳判断方法是利用Array对象的内部属性[[Class]]来判断:
function isArray(obj){
return Object.prototype.toString.call(obj) == '[object Array]';
}
关于String的slice()、sbustr()、substring(),如果只传入了第一个参数,则截取从第一个参数至末尾。当传入负参数时:
1、slice()会将负参数加上字符串长度,使参数为正
2、substr()会将负的第一个参数加上字符串的长度,将负的第二个参数转换为0
3、substring()会将所有负参数转换为0,如果第2个参数小于第1个参数,会互换两个参数
3. 内建包装对象 String、Number和Boolean
String、Number和Boolean对象是相应简单数据类型的包装对象,
共同的特征:作为构造函数调用时是创建一个对象,作为一般函数调用时则是类型转换。
由于所有对象相应的Boolean类型值都是true,所以需要特别注意的是new Boolean(false)在布尔运算中会作为true去处理,(永远不要使用Boolean对象)
String、Number和Boolean类型的变量可以直接调用相应包装对象的方法。
实际上在后台会自动转换为相应包装对象,然后调用方法。String和Boolean类型的字面量也可以直接调用包装对象的方法,
但是Number类型的字面量不能直接调用Number对象的方法。
console.info(5.toFixed(2)); //异常
Number对象属性和方法
属性或方法 | 名称 | 说明 |
属性 | Number.NaN | 非数字,但属于number类型 |
Number.MAX_VALUE |
Number类型能够表示的最大值 |
|
Number.MIN_VALUE |
Number类型能够表示的最小值 |
|
Number.NEGAIVE_INFINITY | 负无穷 | |
Number.POSITIVE_INFINITY | 正无穷 | |
方法 |
valueOf() |
返回对象表示的基本类型的数值 |
toLocaleString() |
返回对象表示的数值的字符串形式 |
|
toString() |
返回对象表示的数值的字符串形式,可以接受一个表示进制的参数 |
|
toFixed() |
按照指定的小数位返回数值的字符串表示,如果数值比指定的小数位多,会进行四舍五入处理 |
|
toExponential() |
返回以指数表示法表示的数值的字符串形式,接受一个表示小数个数的参数 |
|
toPrecision() |
接受一个表示数值的所有数字的位数(不包括指数部分),可能返回固定大小格式,也可能返回指数形式 |
|
ECMAScript中toFiexd问题
在ES中四舍五入的函数 toFixed(n) , n为要保留的小数位数。 n为0~20,当n超过20的时候,JS会出错。
如果小数点前和要截取的前一位都是0时,将会出现精度问题。而且FF与IE的规则也不同,有些是四舍五入,有些是四舍六入。会根据不同的情况而不同。
var num = 0.056; alert (num.toFixed(1)); //会弹出0.0 或者0.1
可以试着重写tofixed方法。
Number.prototype.toFixed=function(len){ var add = 0; var s,temp; var s1 = this + ""; var start = s1.indexOf("."); if(s1.substr(start+len+1,1)>=5)add=1; var temp = Math.pow(10,len); s = Math.floor(this * temp) + add; return s/temp; }
这样,0,056就都可以直接转为0.1了。
4. Date对象
ECMAScript中的Date对象采用UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。
4.1 创建Date对象方法
方法 | 说明 |
new Date() | 构造函数创建对象自动获取当前日期和时间,也可以传入表示日期的毫秒数来创建日期, |
Date.parse() | 接受一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数,日期格式和具体的实现及地区有关。如果传入的字符串不能表示日期,返回NaN。 |
Date.UTC() | 返回表示日期的毫秒数,参数分别是年份、基于0的月份、月中的哪一天(1~31)、小时(0~23)、分钟、秒以及毫秒数,这些参数中,前面两个参数(年月)是必须的,没有提供天数时默认为1,其它参数没有提供时默认为0。 |
Date.now() | 在ES5中新增,返回表示调用这个方法的日期和时间的毫秒数。这可以用来分析代码执行的时间 |
//支持Date.now()时 //不支持Date.now()的情况下 var start = Date.now(); var start = +new Date(); //doSomething(); //doSomething(); var end = Date.now(); var end = +new Date(); var time = end -start; var time = end - start;
获取并转化系统时间
获取系统时间 var myTime = new Date(); var iYear = myTime.getFullYear(); var iMonth = myTime.getMonth()+1; //注意月份需要加1,因为系统从0开始计数,实际从1开始计数 var iDate = myTime.getDate(); var iWeek = myTime.getDay(); var iHours = myTime.getHours(); var iMin = myTime.getMinutes(); var iSec = myTime.getSeconds(); var str = ''; if( iWeek === 0 ) iWeek = '星期日'; //也可用swich语句 if( iWeek === 1 ) iWeek = '星期一'; if( iWeek === 2 ) iWeek = '星期二'; if( iWeek === 3 ) iWeek = '星期三'; if( iWeek === 4 ) iWeek = '星期四'; if( iWeek === 5 ) iWeek = '星期五'; if( iWeek === 6 ) iWeek = '星期六'; str = iYear+ '年' +iMonth+'月'+iDate+'日 '+iWeek+' '+ toTwo(iHours)+' : '+ toTwo(iMin)+' : '+ toTwo(iSec); console.info(str); //2014年11月4日 星期日 11 : 55 : 00
5. RegExp对象后面单独提出总结
6. Error对象
常见内建错误对象,异常捕获语句中try/catch捕获的错误类型
错误类型 | 说明 |
Error |
Error是所有错误类型的父类,因此所有错误类型共享了一组相同的属性和方法,这个基类型的主要作用是供开发人员抛出自定义错误 |
URIError |
在使用encodeURI()或decodeURI(),URI格式不正确时抛出 |
TypeError |
在变量中保存着意外的类型,或者访问不存在的方法时,会导致这种错误 |
SyntaxError |
把语法错误的字符串传入eval()时抛出 |
ReferenceError |
找不到对象的情况下抛出 |
RangeError |
在数值超出范围时抛出,如定义数组时传入负参数就会抛出RangeError |
EvalError |
在使用eval()函数而发生异常时抛出,简单的说,如果没有把eval()当成函数调用,就会抛出错误 |