题目:将字符串“1234567”变为“1,234,567”,即每三位之间加上逗号分隔符。

本题需要使用新的“字符边界”知识点。正则表达式中有一个特殊字符“/B”,表示“非单词边界”,或者

“字母边界”。例如:

"i love javascript".replace(/\B/g , "★"); //将所有字母边界替换为★

再来认识一个新的“位置表示法”:(?=$),它特别像英语中的“地点状语从句”,描述了某个字符到字符

串结尾的情形。比如:

"ABCDE".replace(/.(?=...$)/g , "★") //将字符串结尾有 3 个字符的字符替换为★

这行程序表示将字符串结尾有 3 个字符的字符替换为“★”

使用新学习的两个知识点,我们可以写出数字加千分符的代码:

var a = "1234567";

var result = a.replace(/\B(?=(.{3})+$)/g , ",");

console.log(result);

正则表达式/\B(?=(.{3})+$)/表示匹配字符串中所有距离结尾有 1 或多个“3 个字符”的非单词边界,使

用 replace()函数将它们都替换为逗号。

本章作业

1. 字符串和数组如何相互转换?请总结本章中出现的所有案例,总结在什么情况下需要将字符串转变为数组。

2. 如何从字符串“abcdef”中提取“cde”?请用多种不同的方法实现。

3. 编写函数 repeat(str,n)将字符串 str 重复拼接 n 次。

4. 编写函数 reverseStr(str),将字符串 str 逆序。

5. 用户输入一个字符串,输出字符串中出现最多的字符。

6. 编写一个函数,将 I am from shanghai 倒置为 shanghai from am I。即将句子中的单词位置倒置,而不

改变单词内部结构。

7. 编写正则表达式,验证 E-mail 地址的正确性。

8. 某网站设定了一些设置密码的规则,请编写一个函数,检查某字符串是否是合法的密码。密码规则为:

密码必须至少有 8 位字符

密码只能是字母和数字

密码必须至少有 2 个数字

9. 编写函数 isAnagram(str1,str2)用来检查两个字符串是否互为变位词。变位词指的是不计顺序的情况下

两个单词包含完全相同的字母。比如“silent”和“listen”互为变位词。

10. 编写函数 template(str,obj)实现“模板引擎”的功能。所谓模板引擎是指在字符串模板 str 中用“占位

符”预留一些值的位置,而在对象 obj 中指定这些“占位符”的具体值,从而形成一个完整的字符串。“占

位符”用“<>”表示。

比如:

template(

"我喜欢<city>,它有美丽的<scenic>",

{

"city" : "北京",

"scenic" : "颐和园"

}

)

将返回“我喜欢北京,它有美丽的颐和园”。

DOM 初步

DOM 节点树

DOM 将任何一个 HTML 网页都看做一个 “节点树”。比如下面的 HTML 代码就能用如图 8-2 所示的节点树表

示。

<html>

<head>

<title>网页标题</title>

</head>

<body>

<h1>我是主标题</h1>

<div>

<a href="">超级链接</a>

<img src="" alt="">

</div>

</body>

</html>

这是一个“倒着长”的树。所有的 HTML 标签都是节点树中的一个“节点”。树的“根节点”是 document

对象,这是 DOM 提供给 JavaScript 的对象,表示整个文档。DOM 提供的所有方法都被封装在 document 对象内,

所以我们学习 DOM 其实就是在学习 document 对象。

将 HTML 文档看做为一个文档树的好处是:操作 HTML 的时候,不是在操作字符串,而是在操作节点。这极

大地降低了编程难度。比如题目:页面上有几个段落标签 p,请使用 JavaScript 更改第 3 个 p 标签的内部文字。

<p>普通段落</p>

<p>普通段落</p>

<p>普通段落</p>

<p>普通段落</p>

试想如果这些标签被看做是“文本”,那必须使用“正则表达式”结合一些字符串的方法解题,势必是非常

麻烦的。而 DOM 简化了对 HTML 的操作,我们可以非常方便地得到第 3 个 p 标签,并且也可以非常方便地更改里

面的文字。代码如下:

//得到所有的 p 标签

var ps = document.getElementsByTagName("p");

//让下标为 2 的 p 标签内部的文本改变

ps[2].innerHTML = "我的文本被改变了";

我们仅用两行代码就实现了题目要求的效果,并且没有用任何的字符串和正则

表达式。程序中,首先使用 DOM 提供的方法 document.getElementsByTagName("p")得到了页面上的所有 p

标签并存放在数组 ps 中。然后我们给 ps[2]这个标签的 innerHTML 属性重新赋值,因为数组下标从 0 计数,所以 ps[2]就是第 3 个 p 标签,这个 p 标签的内部文本被改变。innerHTML 就是“内部 HTML”的意思,更改标签

的这个属性即可改变它的内部文字。整个过程看起来非常简单,这就是 DOM 的魅力。