题目:将字符串“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 的魅力。