指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?

一.原生对象、内置对象宿主对象


名词参考:

原生对象 :也叫内部对象、本地对象、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(): 返回最小值
Math.max():  返回最大值


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函数:显示一个输入对话框,提示等待用户输入。


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值