美文网首页js高级程序设计第三版小记
2019-12-23:第五章:基本包装类型和单体内置对象(Glo

2019-12-23:第五章:基本包装类型和单体内置对象(Glo

作者: Lau17 | 来源:发表于2019-12-23 23:42 被阅读0次

6.基本包装类型

基本包装类型的概念可以这样理解:js为了统一基本类型和引用类型的行为,在读取一个基本类型的变量时,会同时为其创造一个对应类型的对象实例,他们与本章所提到的其他引用类型大致相似,但是同时还具有属于自己基本类型相对应的特殊行为(方法)。从而让我们可以调用一些方法来操作数据:

基本包装类型

在这个例子中,我们首先创建了一个字符串的基本类型:a1,而在第二行,我们调用了a1的方法substring(),并且将结果保存于a2。

但是我们知道,基本类型不是对象,因此他们在逻辑上不应该拥有方法。因此实际上,在运行第二行代码时,后台自动为我们做了三件事:

1.创建一个String类型的实例   // var s1 = new String('aa aa')

2.在实例上调用指定的方法   // var s2 = s1.substring(2)

3.销毁这个实例   // a1 = null

因此,我们可以发现,基本包装类型其实和我们之前提到的引用类型并没有太大的差异,他们最大的不同在于生命周期的长短:

使用new 操作符创建的应用对象,在执行流离开当前作用域之前都会一直保存在内存中。

复习一下执行流的环境栈

而自动创建的基本包装类型的对象,只存在于某一行代码使用某个基本类型变量,并执行方法的一瞬,然后立刻就会被销毁。因此我们无法在运行时为基本类型添加属性和方法。这个例子我们在之前讨论基本类型与引用类型变量时已经举过:

实际上这个属性被赋予给了基本包装类型的对象A,但是在被赋值的那一瞬间,A也被摧毁了。第三行其实是创建了新的基本包装类型的对象B。

当然了,我们也可以通过显式的调用new String(),new Number(),new Boolean(),的方法来创建基本包装类型对象,但是我们并不推荐这么做,因为这很容易使人混淆自己到底是在处理基本类型还是引用类型的变量。

对于任何基本包装类型的实例使用typeof都会返回object,而所有基本包装类型都是对象,因此他们如同所有对象一样,在boolean转换时都会被转为true。

很令人疑惑吧,C的基本类型明明时false,但是在boolean专函时竟然是true,无他,就是因为c不是基本变量,c是基本包装类型的对象

搞清楚了基本类型和基本包装类型的关系,我们来详细讲一讲Boolean类型,String类型,Number类型的一些操作方法。

6.1Boolean类型

Boolean类型是与布尔值对应的引用类型。创建方法如上图所示,没啥可说的。

Boolean类型对象重写了valueOf方法,使得自身返回基本值true或false。

Boolean类型对象重写了toString方法,使得自身返回字符串'true'或者'false'。

根据官方的建议,大家最好永远不要使用Boolean类型对象。

6.2Number类型

Number类型是与数字值对应的引用类型。创建方法如上图所示,没啥可说的。

Number类型对象重写了valueOf,使得自身返回基本值所代表的数值。

Number类型对象重写了toString,toLcaleString方法,使得自身返回基本值所代表的字符串值。

toFixed(n)方法表示以自身返回一个保留n位小数的数值字符串。

toExponential(n)方法返回当前Number类型的指数表示法的,保留n位小数的数字字符串。

5被进位了

但是如同boolean类型一样,我们也不建议用户直接实例化Number对象,因为Number对象和Number在使用typeof和instanceof时结果完全不同:

new过都按对象处理,没new过都按数字处理。

6.2String类型

String类型是与字符串值对应的引用类型。创建方法如6.1上图所示,没啥可说的。

字符串对象的常用方法较多,以下一一列举:

1.字符方法

    ①.String.charAt(n)和String.charCodeAt(n):返回字符串中位于第n个位置的字符或字符编码。

    ②.String[n]:返回字符串中位于第n个位置的字符。

2.字符串操作方法

    ①.String1.concat(String2,String3):将String1和String2,String3拼接起来。

    ②.String.slice(n):按照字符n将String切割成一个字符串数组。

    ③.String.subStr()和String.substring():切割字符串,详细用法请百度。

3.字符串位置方法

    ①.String.indexOf(n)和String.lastIndexOf(n):返回字符串n在字符串String中所在的位置,二者一个从字符串头开始,一个从字符串尾开始。

4.trim方法

    ①String.trim()会返回当前字符串删除前置与后置的所有空格后的结果。

5.字符串大小写转换方法

    ①String.toLowerCase(),String.toLocaleLowerCase()会返回当前字符串的小写形式。

    ②.String.toUpperCase(),String.toLocaleUpperCase()会返回当前字符串的大写形式。

    这里需要注意的是,Locale方法是针对特定地区的实现,对有些地区来说,针对地区的方法与通用方法不一致,因此在不知道自己的代码会在哪种语言环境下运行的前提下,建议使用针对地区的方法更稳妥一些。

6.字符串匹配模式

    ①.String.search(n)会返回字符串n在字符串String中出现的位置,根据传入的参数不同,可能查询一次,也可能查询多次。具体使用方式请百度。

    ②.String.replace(n,m)会将字符串n在字符串String中出现的位置换成字符串m,根据传入的参数不同,可能替换一次,也可能替换多次。具体使用方式请百度。

    ③.String.split(n)会将字符串String按照字符串n出现的位置切割成若干个字符串,以数组返回。

7.localeCompare方法

    ①.String.localeCompare()将比较两个字符串,并返回下列值中的一个:

顺次比较

8.fromCharCode方法

    ①.String.fromCharCode(n)接受n个数字,并返回由这n个数字对应的ascii码值的字符串,与fromCharCode()互为反操作。

返回defg

9.HML方法

    ①.时代余晖,一些专门用域简化常见HTML格式化任务的方法。

尽量不用

以上方法均不会改变原有的字符串值,只会返回一个新的字符串或字符串数组。

7.单体内置对象

ECMA内置对象的定义是:由ECMAScript实现提供的,不依赖于宿主环境的对象,这些对象在程序执行前就已经存在了。他们不需要被显式的实例化,因为他们已经实例化了。

常见的内置对象有Object,Arrary,String,以及Global和Math

1.Global对象

Global对象是一个非常特别的对象。他在某种意义上是ECMAScript的兜底对象。

换句话说:

任何不属于其他对象的属性和方法,都是他的属性和方法。

任何全局作用域中定义的函数和属性,都是Global对象的属性。

下面介绍一些他的方法和属性。

1.URL编码方法

    ①encodeURI()和encodeURIComponent()可以对URL进行编码,以便发送给浏览器,有效的URI中不能包含某个字符,例如空格等,这两个方法会用特殊的UFT-8编码替代所有无效字符,使得浏览器可以接受和理解任何URL。

    encodeURI主要用于整个URL编码,他不会对本身属于URL的特殊字符进行编码,例如URL中原本就固有的冒号,正斜杠,问号和百分号。

只是将空格变成了'%20'

    而encodeURIComponent主要用于部分URL编码,他会编码字符串中任何他认为的非法字符。

可以发现任何非法字符都被编译了

    与二者相对应还有两个解码方法decodeURI()和decodeURIComponent(),其中decodeURI()只能解码encodeURI处理的字符串。decodeURIComponent只能解码encodeURIComponent处理的字符串。

可以理解为encodeURI和encodeURIComponent二者的区别是处理范围的大小,encodeURIComponent可以处理的字符更多。

    书上在这里的解释太迷糊,网上找了一个写的很好的答案贴在这:

只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不经过编码直接用于 URL。

***例如:搜索的中文关键字,复制网址之后再粘贴就会发现该URL已经被转码。

1)escape 和 unescape

原理:对除ASCII字母、数字、标点符号 @ * _ + - . / 以外的其他字符进行编码。

编码:

eg:escape('http://www.baidu.com?name=zhang@xiao@jie&order=你好')

res:"http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D%u4F60%u597D"

解码:

eg:unescape("http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D%u4F60%u597D")

res:"http://www.baidu.com?name=zhang@xiao@jie&order=你好"

2)encodeURI 和 decodeURI

原理:返回编码为有效的统一资源标识符 (URI) 的字符串,不会被编码的字符:! @ # $ & * ( ) = : / ; ? + '

   encodeURI()是Javascript中真正用来对URL编码的函数。

编码:

eg:encodeURI('http://www.baidu.com?name=zhang@xiao@jie&order=你好')

    res:"http://www.baidu.com?name=zhang@xiao@jie&order=%E4%BD%A0%E5%A5%BD"

解码:

eg:decodeURI("http://www.baidu.com?name=zhang@xiao@jie&order=%E4%BD%A0%E5%A5%BD")

    res:"http://www.baidu.com?name=zhang@xiao@jie&order=你好"

3)encodeURIComponent 和 decodeURIComponent

原理:对URL的组成部分进行个别编码,而不用于对整个URL进行编码

编码:

eg:encodeURIComponent('http://www.baidu.com?name=zhang@xiao@jie&order=1')

   res:"http%3A%2F%2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1"

解码:

eg:decodeURIComponent("http%3A%2F%2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1")

   res:"http://www.baidu.com?name=zhang@xiao@jie&order=1"

2.eval方法

    eval()方法可以理解为一个完整的ECMAScript解析器,他接受一个字符串作为参数,他将将这个字符串解析为代码,并且运行。

    当解析器发现代码中调用eval方法时,它会将传入的参数作为实际的语句来解析,然后把执行结果插入到eval原位置。

    关于eval,最重要的是作用域链!!!!!

    通过eval执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链,这也就是说通过eval执行的代码可以引用在包含环境中定义的变量

    可以理解为:将eval中的字符串拿出来放在eval所在的位置成为语句,则这个语句所在的环境就是它的执行环境:

    另外需要注意!在eval中创建的任何变量或者函数都不会被提升,因为他们被包裹在一个字符串中。他们只会在eval执行时被创建。

没有变量或函数提升

3.Global对象的属性

简单的东西直接抄书

4.window对象

    在Web浏览器中,ECMAScript将Global作为window对象的一部分加以实现。因此在Web浏览器宿主环境下:

    所有在全局变量中声明的变量和函数 ∈ Global对象 ∈ window对象

    但是要注意,在浏览器环境下,window对象除了扮演Global对象,还有很多其他职能,这会在第八章介绍BOM对象模型时再详细介绍。因此不能粗略地将window = global。

可以发现全局变量和函数都是window的属性和方法

相关文章

网友评论

    本文标题:2019-12-23:第五章:基本包装类型和单体内置对象(Glo

    本文链接:https://www.haomeiwen.com/subject/lvvtoctx.html