一.原生对象、内置对象、宿主对象
名词参考:
原生对象
:也叫内部对象、本地对象、native object
内置对象
:Build-in object
宿主对象:host object
ECMA-262 定义:
原生对象:
独立于宿主环境的ECMAScript实现提供的对象。与宿主无关,在javascript(远景浏览器)、nodejs(node平台)、jscript(ie浏览器)、typescript(微软平台)等等中均有这些对象。简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。在运行过程中动态创建的对象,需要new
内置对象:
由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现,即在引擎初始化阶段就被创建好的对象。这意味着开发者不必明确实例化内置对象,它已被实例化了
同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。如此就可以理解了。内置对象是本地对象的一种。
宿主对象:
何为“宿主对象”?主要在这个“宿主”的概念上,ECMAScript中的“宿主”当然就是我们网页的运行环境,即“操作系统”和“浏览器”。
所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象,包含两大类,一个是宿主提供,一个是自定义类对象,ECMAScript官方未定义的对象都属于宿主对象,所有非本地对象都是宿主对象。宿主提供对象原理--->由宿主框架通过某种机制注册到ECscript引擎中的对象,如宿主浏览器(以远景为参考)会向ECscript注入window对象,构建其实现javascript。所有的BOM和DOM都是宿主对象。说白了就是,ECMAScript官方未定义的对象都属于宿主对象,因为其未定义的对象大多数是自己通过ECMAScript程序创建的对象。
内容
原生对象:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError、Global
内置对象:Global(全局对象)、Math
宿主对象:有宿主提供的对象,在浏览器中window对象以及其下边所有的子对象(如bom、dom等等),在node中是globla及其子对象,也包含自定义的类对象。【何为“宿主对象”? 在web中,ECMAScript中的“宿主”当然就是我们网页的运行环境,即“操作系统”和“浏览器”。所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。】
var oPerson =new Object;
oPerson.name='simaopig';
oPerson.age='26';
这里我自己定义的对象oPerson就是宿主对象。因为ECMAScript中未定义此对象,而此对象又只存在于我所运行的页面中。
全局对象
一般全局对象会有两个,一个是ecma提供的Global对象,一个是宿主提供。如在浏览器中是window、在nodejs中是global。【所以啊,在浏览器中全局对象是Global+window】
通常情况下ecma提供的Global对象对是不存在的,没有具体的对象,
它们之间的关系
本地对象与内置对象:原生包含内置,内置是原生的一个子集。
宿主对象:内置对象的Global和宿主提供的一个全局对象,
本地对象为array obj regexp等可以new实例化
内置对象为 Global Math 等不可以实例化的
宿主为宿主注入到全局的对象,如浏览器的window 等
宿主为浏览器自带的document,window 等
二.为什么扩展JS内置对象不是好的做法
因为你不知道哪一天浏览器或javascript本身就会实现这个方法,而且和你扩展的实现有不一致的表现。到时候你的javascript代码可能已经在无数个页面中执行了数年,而浏览器的实现导致所有使用扩展原型的代码都崩溃了。。。
三.有哪些内置对象和内置函数
JS内置对象:
String对象:字符串对象,提供了对字符串进行操作的属性和方法。
Array对象:数组对象,提供了数组操作方面的属性和方法。
Date对象:日期时间对象,可以获取系统的日期时间信息。
Boolean对象:布尔对象,一个布尔变量就是一个布尔对象。(没有可用的属性和方法)
Number对象:数值对象。一个数值变量就是一个数值对象。
Math对象:数学对象,提供了数学运算方面的属性和方法。
RegExp:正则。
1)String对象的属性和方法:
length:获取字符串的长度。如:var len = strObj.length
valueOf(): 返回字符串对象的原始值
toLowerCase():将字符串中的字母转成全小写。如:strObj.toLowerCase()
toUpperCase():将字符串中的字母转成全大写。如:strObj.toUpperCase()
charAt(index):返回指定下标位置的一个字符。如果没有找到,则返回空字符串。
charCodeAt(index): 返回一个整数,该整数表示String对象中指定位置处的字符的Unicode编码
concat(string2): 连接两条或多条字符串
indexOf(searchString, startIndex): 返回一个子字符串在原始字符串中的索引值(查找顺序从左往右查找)。如果没有找到,则返回-1。
lastlndexOf(searchString, startIndex): 返回字符串中最后一个出现指定字符串的位置
match(regex) : 在字符串中查找指定值
replace(regex, newString):
将字符串中的某些字符替换成其它字符
search(regex):
针对某执行值对字符串进行查找
slice(startIndex, endIndex):
将部分字符抽出并在新的字符串中返回剩余部分
split(delimiter):
将字符串分配为数组
substr(startIndex, length) :
从startIndex取,取length个字符
substring(startIndex, endIndex):
从startIndex和endIndex之间的字符,不包括endIndex
2)Array对象:
length属性:动态获取数组长度。如:var len = arrObj.length
join(string) 将数组中元素合并为字符串,string为分隔符.如省略参数则直接合并,不再分隔
concat(array1,arrayn)将两个或两个以上的数组值连接起来,合并后返回结果
reverse():将数组中各元素颠倒顺序,语法:arrObj.reverse()。
delete 运算符:只能删除数组元素的值,而所占空间还在,总长度没变(arr.length)。
shift():删除数组中第一个元素,返回删除的那个值,并将长度减1。
pop():删除数组中最后一个元素,返回删除的那个值,并将长度减1。
unshift():往数组前面添加一个或多个数组元素,长度要改变。arrObj.unshift(“a” , “b” , “c”)
push():往数组结尾添加一个或多个数组元素,长度要改变。arrObj.push(“a” , “b” , “c”)
slice(start, deleteCount, [item1[, item2[,…[,itemN]]]])
返从一个数组中移除一个或多个元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素
splice() 为数组删除并添加新的元素
toString() 将数组所有元素返回一个字符串,其间用逗号分隔
3)Date对象:
其实就是一个String对象,就可以直接调用属性和方法。
Date对象的使用,必须使用new关键字来创建,否则,无法调用Date对象的属性和方法
getDay() 返回一周中的第几天(0-6)
getYear() 返回年份.2000年以前为2位,2000(包含)以后为4位
getFullYear() 返回完整的4位年份数
getMonth() 返回月份数(0-11)
getDate() 返回日(1-31)
getHours() 返回小时数(0-23)
getMinutes() 返回分钟(0-59)
getSeconds() 返回秒数(0-59)
setYear(yearInt) 设置年份.2位数或4位数
setFullYear(yearInt)设置年份.4位数
setMonth(monthInt) 设置月份(0-11)
setDate(dateInt) 设置日(1-31)
setHours(hourInt) 设置小时数(0-23)
setMinutes(minInt) 设置分钟数(0-59)
setSeconds(secInt) 设置秒数(0-59) ......
4)Math数学对象:
Math对象是一个静态对象,换句话说:在使用Math对象,不需要创建实例。
Math.PI:圆周率。
Math.abs():绝对值。如:Math.abs(-9) = 9
Math.ceil():向上取整(整数加1,小数去掉)。如:Math.ceil(10.2) = 11
Math.floor():向下取整(直接去掉小数)。如:Math.floor(9.888) = 9
Math.round():四舍五入。如:Math.round(4.5) = 5; Math.round(4.1) = 4
Math.pow(x,y):求x的y次方。如:Math.pow(2,3) = 8
Math.sqrt():求平方根。如:Math.sqrt(121) = 11
Math.min(): 返回最小值
5)Number数值对象:
一个数值变量,就是一个数值对象(Number对象)。
toFixed():将一个数值转成字符串,并进行四舍五入,保留指定位数的小数。语法:numObj.toFixed(n)
6)RegExp:
exec()
test ()
lastIndex()
ignorCase
global
multiline
js内置函数
js内置函数是浏览器内核自带的,不用任何函数库引入就可以直接使用的函数。
(1)alert函数:显示一个警告对话框,包括一个OK按钮。
(2)confirm函数:显示一个确认对话框,包括OK、Cancel按钮。
(3)escape函数:将字符转换成Unicode码。
(4)eval函数:计算表达式的结果。
(5)isNaN函数:测试是(true)否(false)不是一个数字。
(6)parseFloat函数:将字符串转换成符点数字形式。
(7)parseInt函数:将符串转换成整数数字形式(可指定几进制)。
(8)prompt函数:显示一个输入对话框,提示等待用户输入。