建议41:正确使用正则表达式引用
正则表达式在执行匹配运算时会自动把每个分组(子表达式)匹配的文本都存储在一个特殊的地方以备将来使用。这些存储在分组中的特殊值被称为反向引用。反向引用将遵循从左到右的顺序,根据表达式中左括号字符的顺序进行创建和编号。var s = "abcdefghijklmn";
var r = /(a(b(c)))/;
var a = s.match(r); //["abc", "abc" , "bc" , "c"]
在这个分组匹配模式中,共产生了3个反向引用,第一个是“(a(b(c)))”,第二个是“(b(c))”,第三个是“(c)”。它们引用的匹配文本分别是字符串“abc”、“bc”和“c”。
反向引用在应用开发中主要有以下几种常规用法。
1)在正则表达式对象的test()方法,以及字符串对象的match()和search()等方法中使用。在这些方法中,反向引用的值可以从RegExp()构造函数中获得。例如:
var s = "abcdefghijklmn";
var r = /(\w)(\w)(\w)/;
r.test(s);
alert(RegExp.$1); //第1个子表达式匹配的字符a
alert(RegExp.$2); //第2个子表达式匹配的字符b
alert(RegExp.$3); //第3个子表达式匹配的字符c
在正则表达式执行匹配测试后,所有子表达式匹配的文本都被分组存储在RegExp()构造函数的属性内,通过前缀符号$与正则表达式中子表达式的编号来引用这些临时属性,其中属性$1标识符指向第一个值引用,属性$2标识符指向第二个值引用,依此类推。
2)可以直接在定义分组的表达式中包含反向引用。这可以通过使用特殊转义序列(如\l、\2等)来实现。例如:
var s = "abcbcacba";
var r = /(\w)(\w)(\w)\2\3\1\3\2\1/;
var b = r.test(s); // 验证正则表达式是否匹配该字符串
alert(b); //true
在上面的正则表达式中,“\1”表示对第一个反向引用(\w)所匹配的字符a 的引用,“\2”表示对第二个反向引用(\w)所匹配的字符b的引用,“\3”表示对第二个反向引用(\w)所匹配的字符c的引用。
3)可以在字符串对象的replace()方法中使用。通过使用特殊字符序列$1、$2、$3等来实现。例如,在下面的示例中将颠倒相邻字母和数字的位置。
var s = "aa11bb22c3d4e5f6";
var r = /(\w+?)(\d+)/g;
var b = s.replace(r,"$2$1");
alert(b); //"11aa22bb3c 4d5e6f"
在这个示例中,正则表达式包括两个分组,第一个分组匹配任意连续的字母,第二个分组匹配任意连续的数字。在replace()方法的第二个参数中,$1表示对正则表达式中第一个子表达式匹配文本的引用,而$2表示对正则表达式中第二个子表达式匹配文本的引用,通过颠倒$1和$2标识符的位置即可实现字符串的颠倒以替换原字符串。
建议42:用好正则表达式静态值
正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1。
表2.1 RegExp的静态属性
长名短名说明
input $_ 最后用于匹配的字符串,即传递给exec()或test()方法的字符串lastMatch $& 最后匹配的字符
lastParen $+ 最后匹配的分组
leftContext $` 在上次匹配之前的子字符串
multiline $* 用于指定是否所有表达式都使用多行模式的布尔值
rightContext $' 在上次匹配之后的子字符串
在下面的这个示例中借助正则表达式的静态属性,匹配字符串“Javascript”,不区分大小写:
var s = "Javascript,not Javascript";
var r = /(Java)Script/gi;
var a = r.exec(s);
alert(RegExp.input); //"Javascript,not Javascript"
alert(RegExp.leftContext); //空字符串,因为在第一次匹配操作时,左侧没有内容
alert(RegExp.rightContext); //",not Javascript"
alert(https://www.wendangku.net/doc/de169319.html,stMatch); //"Javascript "
alert(https://www.wendangku.net/doc/de169319.html,stParen); //"Java"
上面示例演示了正则表达式的几个静态属性的用法。
input属性实际上存储的是被执行匹配的字符串,即整个字符串“Javascript,not Javascript”。
leftContext属性存储的是执行第一次匹配之前的子字符串,这里为空,因为在第一次匹配时文本“Javascript”左侧为空,而rightContext属性存储的是执行第一次匹配之后的子字符串,即为“,not Javascript”。
lastMatch属性包含的是第一次匹配的子字符串,即为“Javascript”。
lastParen属性包含的是第一次匹配的分组,即为“Java”。如果模式中包含多个分组,则会显示最后一个分组所匹配的字符。例如:
var r = /(Java)(Script)/gi;
var a = r.exec(s); //执行匹配操作
alert(https://www.wendangku.net/doc/de169319.html,stParen); //返回"Script",而不再是"Java"
也可以使用短名来读取这些属性所包含的值,考虑到这些短名不符合JavaScript语法规范,因此必须使用中括号运算符来进行读取操作。不过对于$_属性来说,由于它符合JavaScript标识符语法规范,因此可以直接使用。例如,针对上面示例也可以这样设计:
var s = "Javascript,not Javascript";
var r = /(Java)(Script)/gi;
var a = r.exec(s);
alert(RegExp.$_); //"Javascript,not Javascript"
alert(RegExp["$`"]); //空字符串
alert(RegExp["$'"]); //",not Javascript"
alert(RegExp["$&"]); //"Javascript "
alert(RegExp["$+"]); //"Java"
这些属性的值都是动态的,每次执行exec()或test()方法时,所有属性值都会被重新设置。当在下面示例中执行第一次匹配和第二次匹配时,这些静态属性值
都会实时动态更新。
var s = "Javascript,not Javascript";
var r = /Scrip(t)/gi; // 第一次定义的匹配模式
var a = r.exec(s); // 执行第一次匹配
alert(RegExp.$_); //"Javascript,not Javascript"
alert(RegExp["$`"]); //"Java"
alert(RegExp["$'"]); //",not Javascript"
alert(RegExp["$&"]); //"Script"
alert(RegExp["$+"]); //"t"
var r = /Jav(a)/gi; // 第二次定义的匹配模式
var a = r.exec(s); // 执行第二次匹配
alert(RegExp.$_); //"Javascript,not Javascript"
alert(RegExp["$`"]); //空字符串
alert(RegExp["$'"]); //"Script,not Javascript"
alert(RegExp["$&"]); //"Java"
alert(RegExp["$+"]); //"a"
通过上面的示例可以看出,RegExp对象的静态属性是公共的,对于所有正则表达式来说是可以共享的,因此这些静态属性的值也是实时变化的。
multiline属性与上面几个属性不同,它不会根据每次执行的操作进行实时更新,并且还可以控制所有正则表达式的m标志项。例如:
var s = "a\nb\nc";
var r = /\w+$/g; // 定义匹配模式
var a = s.match(r); // 执行默认匹配,返回数组["c"]
RegExp.multiline = true; // 动态设置模式为多行匹配
var a = s.match(r); //["a", "b", "c"]
提示:IE和Opera浏览器不支持RegExp.multiline属性,考虑到浏览器的兼容性,不建议读者使用这种动态方式设置正则表达式的多行匹配模式。
建议43:使用exec增强正则表达式功能RegExp对象定义了两个用于执行模式匹配操作的方法,它们的行为与String 对象的正则表达式操作方法类似。例如,RegExp对象的exec方法与String对象的match方法相似,只不过exec是以字符串为参数的RegExp对象方法,而match方
法是以正则表达式为参数的String对象方法。在非全局模式下,它们的返回值是相同的。
在所有RegExp模式匹配方法和String模式匹配方法中,exec方法的功能最强大。作为正则表达式的通用匹配方法,exec方法比RegExp.test()、
String.search()、String.replace()和String.match()都复杂。该方法需要一个参数,用来执行要执行操作的字符串并返回一个数组,此数组中存放的是匹配结果。如果没有找到匹配的文本,返回值为null。例如:
var s = "javascript";
var r = /java/g;
var a = r.exec(s); //["java"]
exec方法的工作机制是这样的:当调用方法时,先检索字符串参数,从中获取与正则表达式相匹配的文本。如果找到了匹配的文本,就会返回一个数组;否则,返回null。对返回数组的元素的具体说明如下:
第0个元素,是与表达式相匹配的文本。
第1个元素,是与正则表达式的第1个子表达式相匹配的文本(如果存在)。
第2个元素,是与正则表达式的第2个子表达式相匹配的文本,依此类推。
返回数组还包含几个属性,具体说明如下:
length,该属性声明的是数组中的元素个数。
index,该属性声明的是匹配文本的第一个字符的位置。
input,该属性包含的是整个字符串。
当调用非全局模式的正则表达式对象的exec方法时,返回的数组与调用字符串对象的match方法返回的数组是完全相同的。
当执行全局匹配模式时,exec的行为就略有变化。这时它会定义lastIndex
属性,以指定下一次执行匹配时开始检索字符串的位置。在找到了与表达式相匹配的文本之后,exec方法将把正则表达式的lastIndex属性设置为下一次匹配执行的第一个字符的位置。也就是说,可以通过反复地调用exec方法来遍历字符串中的所有匹配文本。当exec再也找不到匹配的文本时,将返回null,并且把属性lastIndex 重置为0。
在下面的这个示例中,定义正则表达式直接量,用来匹配字符串s中每个字符。在循环结构的条件表达式中反复执行匹配模式,并将返回结果的值是否为null作为循环条件。当返回值为null时,说明字符串检测完毕。然后,读取返回数组a中包含的匹配子字符串,并调用该数组的属性index和lastIndex,其中index显示当前匹配子字符串的起始位置,而lastIndex属性显示下一次匹配操作的起始位置。例如:
var s = "javascript"; // 测试使用的字符串直接量
var r = /\w/g; // 匹配模式
while((a = r.exec(s)) != null){ // 循环执行匹配操作
alert(a[0] + "\n" + a.index + "\n" + https://www.wendangku.net/doc/de169319.html,stIndex); /* 显示每次匹配操作时返回的结果数组信息*/
}
实际上通过循环结构反复调用exec方法是唯一获得全局模式的完整模式匹配信息的方法。
无论正则表达式是否为全局模式,exec方法都会将完整的细节添加到返回数组中。字符串对象的match方法就不同,它在全局模式下返回的数组中不会包含这么多的细节信息。
建议44:正确使用原子组
正则表达式引擎支持一种称做原子组的属性。原子组写作(?>…),也称为“贪婪”子表达式,省略号表示任意正则表达式模板、非捕获组和一个特殊的扭曲。存在于原子组中的正则表达式组中的任何回溯点都将被丢弃。这就为HTML 正则表达式的回溯问题提供了一个更好的解决办法:如果将[\s\S]*?序列和它后面的HTML 标记一起放在一个原子组中,所需的HTML 标签被发现一次,这次匹配基本上就被锁定了。如果正则表达式的后续部分匹配失败,原子组中的量词没有记录回溯点,那么[\s\S]*?序列就不能扩展到已匹配的范围之外。
但是,JavaScript不支持原子组,也不提供其他方法消除不必要的回溯。不过,可以利用前瞻过程中一项鲜为人知的行为来模拟原子组:前瞻也是原子组。不同的是,前瞻在整个匹配过程中不消耗字符,前瞻只是检查自己包含的模板是否能在当前位置匹配。然而,可以避开这点,在捕获组中包装一个前瞻模板,在前瞻之外向它添加一个后向引用。
(?=(pattern to make atomic))\1
在任何使用原子组的模式中这个结构都是可重用的。只要记住,需要使用适当的后向引用次数,如果正则表达式包含多个捕获组。HTML 正则表达式在使用此技术后的修改如下:
/(?=([\s\S]*?
))\1(?=([\s\S]*?<\/title>))\3(?=([\s\S]*?<\/head>))\4(?=([\s\S]*?
(?=([\s\S]*?<\/body>))\6[\s\S]*?<\/html>/
如果没有尾随的,那么最后一个[\s\S]*?将扩展至字符串结束,正则表达式将立刻失败,因为没有回溯点可以返回。正则表达式每次找到一个中间标签就退出一个前瞻,它在前瞻过程中丢弃所有回溯位置。下一个后向引用简单地重新匹配前瞻过程中发现的字符,将它们作为实际匹配的一部分。
建议45:警惕嵌套量词和回溯失控
嵌套量词总是需要额外的关注和小心,以确保没有掩盖回溯失控问题。嵌套量词出现在一个自身被重复量词修饰的组中。
嵌套量词本身并不会造成性能危害,只是在尝试匹配字符串过程中,很容易不小心在内部量词和外部量词之间,产生一大堆分解文本的方法。例如,要匹配HTML 标签,使用了下面的正则表达式:
/<(?:[^>"']|"[^"]*"|'[^']*')*>/
这也许过于简单,因为它不能正确地处理所有情况的有效和无效标记,但在处理有效HTML 片段时应该没什么问题。与更加简单的/<[^>]*>/相比,它的优势在于涵盖了出现在属性值中的>符号。在非捕获组中它不使用第二和第三分支,仅匹配单引号和双引号包围的属性值,除特定的引号外允许所有字符出现。
虽然遇到了嵌套量词*,但目前还没有回溯失控的危险。在分组的每次重复过程中,由于第二和第三分支选项严格匹配一个带引号的字符串,所以潜在的回溯点数目随目标字符串长度而呈线性增长。
但是,查看非捕获组的第一分支:[^>"'],每次只匹配一个字符,效率似乎有些低。在字符类后面加一个量词会更好些,这样每次组重复过程就可以匹配多于一个的字符了。正则表达式可以在目标字符串的位置上发现一个匹配。通过每次匹配多个字符,正则表达式会在成功匹配的过程中跳过许多不必要的步骤。
如果正则表达式匹配一个“<”字符,但后面没有“>”,则可以令匹配成功完成,回溯失控就会进入“快车道”,因为内部量词和外部量词的排列组合产生了数
量巨大的分支路径(跟在非捕获组之后)用以匹配“<”之后的文本。正则表达式在最终放弃匹配之前必须尝试所有的排列组合。
关于嵌套量词导致回溯失控,一个更加极端的例子是,在一大串A 上应用正则表达式/(A+A+)+B/。虽然这个正则表达式写成/AA+B/更好,但为了讨论方便,设想一下两个A 能够匹配同一个字符串的多少种模板。
当应用在一个由10 个A 组成的字符串上(“AAAAAAAAAA”)时,正则表达式首先使用第一个A+匹配所有10 个字符,然后正则表达式回溯一个字符,让第二个A+匹配最后一个字符。这个分组试图重复,但没有更多的A ,而且分组中的+量词已经符合匹配所需的最少一次,因此正则表达式开始查找B。虽然正则表达式没有找到B,但是还不能放弃,因为还有许多路径没有被测试过。如果第一个A+匹配8 个字符,第二个A+匹配2 个字符会怎么样呢?或者第一个匹配3个,第二个匹配2个,分组重复两次,又会怎么样呢?如果在分组的第一遍重复中,第一个A+匹配2个字符,第二个A+匹配3 个字符,然后在第二遍重复中,第一个匹配1 个,第二个匹配4个,又怎么样呢?
正则表达式在最坏情况下的复杂性是惊人的O(2n),也就是2 的n 次方。n 表示字符串的长度。在由10 个A 构成的字符串中,正则表达式需要1024 次回溯才能确定匹配失败,如果是20 个A,回溯的数字剧增到一百万以上。25 个A足以挂起Chrome、IE、Firefox和Opera 浏览器至少10 分钟(如果还没死机)用以处理超过34 000 000次回溯以排除正则表达式的各种排列组合。唯一的例外是最新的Safari浏览器,它能够检测到正则表达式陷入了循环,并快速终止匹配(Safari 浏览器还限定了回溯的次数,超出则终止匹配尝试)。
预防此类问题的关键是确保正则表达式的两个部分不能对字符串的同一部分
进行匹配。这个正则表达式可重写为/AA+B/,但复杂的正则表达式可能难以避免此类问题。虽然还有其他解决办法,但是增加一个模拟原子组往往作为最后一招使用,如果可能,尽可能保持正则表达式简单易懂。如果这么做,此正则表达式将改成
/((?=(A+A+))\2)+B/,就可以彻底消除回溯问题。
建议46:提高正则表达式执行效率
(1)关注如何让匹配更快失败
正则表达式处理慢往往是因为匹配失败过程慢,而不是匹配成功过程慢。使用正则表达式匹配一个很大字符串的一小部分,情况更为严重,正则表达式匹配失败的位置比匹配成功的位置要多得多。一个修改使正则表达式匹配更快但失败更慢,
例如,通过增加所需的回溯次数尝试所有分支的排列组合,这通常是一个失败的修改。
(2)正则表达式以简单的、必需的字元开始
最理想的情况是,一个正则表达式的起始字元应当尽可能快速地测试并排除明显不匹配的位置。用于此目的好的起始字元通常是一个锚(^或$)、特定字符(如x 或\u363A)、字符类(如[a-z]或速记符、单词边界(\b))。如果可能,避免以分组或选择字元开头,避免顶级分支,如/one|two/,因为这样会强迫正则表达式识别多种起始字元。
Firefox浏览器对起始字元中使用的任何量词都很敏感,能够优化得更好。例如,以\s\s*替代\s+或\s{1,}。其他浏览器大多优化掉这些差异。
(3)编写量词模板,使它们后面的字元互相排斥
当字符与字元相邻或子表达式能够重叠匹配时,一个正则表达式尝试分解文本的路径数量将增加。为避免出现此现象,尽量具体化模板。当表达“[^"\r\n]*”时不要使用“.*?”(依赖回溯)。
(4)减少分支的数量,缩小它们的范围
当分支使用 | (竖线)时,可能要求在字符串的每一个位置上测试所有的分支选项。通常可通过使用字符类和选项组件减少对分支的需求,或者将分支在正则表达式上的位置推后(允许到达分支之前的一些匹配尝试失败)。
字符类比分支更快,因为它们使用位向量实现(或其他快速实现)而不是回溯。当分支必不可少时,在不影响正则表达式匹配的情况下,将常用分支放在最前面。分支选项从左向右依次尝试,一个选项被匹配上的机会越多,它被检测的速度就越快。
注意:由于Chrome 和Firefox 浏览器自动执行这些优化中的某些项目,因此较少受到手工调整的影响。
(5)使用非捕获组
捕获组花费时间和内存用于记录后向引用,并保持它们是最新的。如果不需要一个后向引用,可通过使用非捕获组避免这种开销,例如,(?:…)替代(…)。当需要一个完全匹配的后向引用时,有些人喜欢将正则表达式包装在一个捕获组中,这是不必要的,因为可以通过其他方法引用完全匹配。例如,使用regex.exec()返
回数组的第一个元素,或替换字符串中的$&。用非捕获组取代捕获组在Firefox 浏览器中影响很小,但在其他浏览器上处理长字符串时影响很大。
(6)捕获感兴趣的文字,减少后处理
如果要引用匹配的一部分,应当通过一切手段,捕获那些片断,再使用后向引用处理。例如,编写代码处理一个正则表达式所匹配的引号中的字符串内容,使用/"([^"]*)"/之后再使用一次后向引用,而不是使用/"[^"]*"/之后从结果中手工剥离引号。当在循环中使用时,减少这方面的工作可以节省大量时间。
(7)暴露所需的字元
为帮助正则表达式引擎在如何优化查询例程时做出明智的决策,应尽量简单地判断出那些必需的字元。当字元应用在子表达式或分支中时,正则表达式引擎很难判断它们是不是必需的,有些引擎并不做此方面的努力。例如,正则表达式
/^(ab|cd)/暴露它的字符串起始锚。IE 和Chrome浏览器会注意到这一点,并阻止正则表达式尝试查找字符串头端之后的匹配,从而使查找瞬间完成而不管字符串长度。但是,由于等价正则表达式/(^ab|^cd)/不暴露它的^锚,IE无法应用同样的优化,最终无意义地搜索字符串并在每一个位置上匹配。
(8)使用适当的量词
正如建议45所讨论过的那样,“贪婪”量词和“懒惰”量词即使匹配同样的字符串,其查找匹配过程也是不同的。在确保正确等价的前提下,使用更合适的量词类型(基于预期的回溯次数)可以显著提高性能,尤其在处理长字符串时。
(9)将正则表达式赋给变量,以重用它们
将正则表达式赋给变量以避免对它们重新编译。有人使用正则表达式缓存池,以避免对给定的模板和标记组合进行多次编译。不要过分担心,正则表达式编译得很快。重要的是避免在循环体中重复编译正则表达式。换句话说,不要这样做:while (/regex1/.test(str1)) {
/regex2/.exec(str2);
...
}
替代做法如下:
var regex1 = /regex1/,
regex2 = /regex2/;
while (regex1.test(str1)) {
regex2.exec(str2);
...
}
(10)将复杂的正则表达式拆分为简单的片断
尽量避免一个正则表达式做太多的工作。处理复杂的搜索问题需要将条件逻辑拆分为两个或多个正则表达式,这样更容易解决问题,通常也更高效,每个正则表达式只在最后的匹配结果中执行查找。在一个模板中完成所有工作的正则表达式很难维护,而且容易引起回溯相关的问题。
建议47:避免使用正则表达式的场景正则表达式匹配速度是非常快的。然而,当只搜索文字字符串时正则匹配经常会显得多余,尤其当事先知道了字符串的哪一部分将要被测试时。例如,要检查一个字符串是不是以分号结束,可以使用:
endsWithSemicolon = /;$/.test(str);
当前没有哪个浏览器“聪明”到这个程度,能够意识到这个正则表达式只能匹配字符串的末尾。最终它们所做的将是一个一个地测试整个字符串。每当发现了一个分号,正则表达式就前进到下一个字元($),检查它是否匹配字符串的末尾。如果不是这样,正则表达式就继续搜索匹配,直到搜索了整个字符串。字符串的长度越长(包含的分号越多),它占用的时间也就越长。
在这种情况下,更好的办法是跳过正则表达式所需的所有中间步骤,简单地检查最后一个字符是不是分号:
endsWithSemicolon = str.charAt(str.length – 1) == ";";
目标字符串很小时,这种方法只比正则表达式快一点,更重要的是,字符串的长度不再影响执行测试所需要的时间。
例如,使用charAt 函数在特定位置上读取字符。字符串函数slice、substr 和substring 可用于在特定位置上提取并检查字符串的值。此外,indexOf和lastIndexOf 函数非常适合查找特定字符串的位置,或者判断它们是否存在。所有这些字符串操作函数速度都很快,在搜索那些不依赖正则表达式复杂特性的文本字符串时,它们有助于减小正则表达式带来的性能开销。
建议48:慎用正则表达式修剪字符串
(1)使用两个子表达式修剪字符串
去除字符串首尾的空格是一个简单而常见的任务,但到目前为止JavaScript 还没有实现它。正则表达式允许用很少的代码实现一个修剪函数,最好的全面解决方案可能是使用两个子表达式:一个用于去除头部空格,另一个用于去除尾部空格。这样处理简单而快速,特别是处理长字符串时。
if(!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/, "");
}
}
var str = " \t\n test string ".trim();
alert(str == "test string"); // alerts "true"
使用if语句进行检测,如果已经存在trim原生函数,则不要覆盖trim原生函数,因为原生函数进行了优化后通常远远快于自定义函数。使用上面代码在Firefox浏览器中大约有35%的性能提升(或多或少依赖于目标字符串的长度和内容)。将/\s+$/(第二个正则表达式)替换成/\s\s*$/。虽然这两个正则表达式的功能完全相同,但是Firefox浏览器却为那些以非量词字元开头的正则表达式提供额外的优化。在其他浏览器上,差异不显著,或者优化完全不同。
然而,改变正则表达式,在字符串开头匹配/^\s\s*/不会产生明显差异,因为^锚需要“照顾”那些快速作废的非匹配位置(避免一个轻微的性能差异,因为在一个长字符串中可能产生上千次匹配尝试)。
(2)使用一个正则表达式修剪字符串
事实上,除这里列出的方法外还有许多其他方法,可以写一个正则表达式来修剪字符串,但在处理长字符串时,这种方法执行速度总比用两个简单的表达式要慢。String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, "");
}
这可能是最通常的解决方案。它通过分支功能合并了两个简单的正则表达式,并使用/g(全局)标记替换所有匹配,而不只是第一个匹配(当目标字符串首尾都有空格时将匹配两次)。这并不是一个“可怕”的方法,但在对长字符串操作时,它比使用两个简单的子表达式要慢,因为两个分支选项都要测试每个字符位置。
String.prototype.trim = function() {
return this.replace(/^\s*([\s\S]*?)\s*$/, "$1");
}
这个正则表达式的工作原理是匹配整个字符串,捕获从第一个到最后一个非空格字符之间的序列,记入后向引用1。然后使用后向引用1 替代整个字符串,就留下了这个字符串的修剪版本。
这个方法概念简单,但捕获组中的“懒惰”量词使正则表达式进行了许多额外操作(如回溯),因此在操作长目标字符串时很慢。在进入正则表达式捕获组时,[\s\S]类的“懒惰”量词*?要求捕获组尽可能地减少重复次数。因此,这个正则表达式每匹配一个字符,都要停下来尝试匹配余下的\s*$模板。如果由于字符串当前位置之后存在非空格字符而导致匹配失败,正则表达式将匹配一个或多个字符,更新后向引用,然后再次尝试匹配模板的剩余部分。
String.prototype.trim = function() {
return this.replace(/^\s*([\s\S]*\S)?\s*$/, "$1");
}
这个表达式与上一个很像,但出于性能原因以“贪婪”量词取代了“懒惰”量词。为确保捕获组只匹配到最后一个非空格字符,必须尾随一个\S。然而,由于正则表达式必须匹配全部由空格组成的字符串,整个捕获组通过尾随一个?量词而成为可选组。
在此,[\s\S]*中的“贪婪”量词“*”表示重复方括号中的任意字符模板直至字符串结束。然后,正则表达式每次回溯一个字符,直到它能够匹配后面的\S,或者直到回溯到第一个字符而匹配整个组(之后它跳过这个组)。
如果尾部空格不比其他字符串更多,通过一个表达修剪的方案通常比前面那些使用“懒惰”量词的方案更快。事实上,这个方案在IE、Safari、Chrome和Opera 浏览器上执行速度如此之快,甚至超过使用两个子表达式的方案,是因为这些浏览器包含特殊优化,专门服务于为字符类匹配任意字符的“贪婪”重复操作,正则表达式引擎直接跳到字符串末尾而不检查中间的字符(尽管回溯点必须被记下来),然后适当回溯。不幸的是,这种方法在Firefox 和Opera 9 浏览器上执行得非常慢,所以到目前为止,使用两个子表达式仍然是更好的跨浏览器方案。
String.prototype.trim = function() {
return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
}
这是一个相当普遍的方法,但没有很好的理由使用它,因为它在所有浏览器上都是这里所列出的所有方法中执行得最慢的一个。这类似于最后两个正则表达式,它匹配整个字符串然后用打算保留的部分替换这个字符串,因为内部组每次只匹配一个单词,正则表达式必须执行大量的离散步骤。修剪短字符串时性能冲击并不明显,但处理包含多个词的长字符串时,这个正则表达式可以成为影响性能的一个问题。
将内部组修改为一个非捕获组,例如,将(\s+\S+)修改为(?:\s+\S+),在Opera、IE和Chrome 浏览器上缩减了大约20%~45%的处理时间,在Safari 和Firefox 浏览器上也有轻微改善。尽管如此,一个非捕获组不能完全代换这个实现。注意,外部组不能转换为非捕获组,因为它在被替换的字符串中被引用了。
虽然正则表达式的执行速度很快,但是没有它们帮助时修剪字符串的性能还是值得考虑的。例如:
String.prototype.trim = function() {
var start = 0,
end = this.length - 1,
ws = " \n\r\t\f\x0b\xa0\u1680\u180e\u2000\u2001\u2002\u2003
\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f
\u205f\u3000\ufeff";
while (ws.indexOf(this.charAt(start)) > -1) {
start++;
}
while (end > start && ws.indexOf(this.charAt(end)) > -1) {
end--;
}
return this.slice(start, end + 1);
}
在上面代码中,ws变量包括在ECMAScript v5中定义的所有空白字符。出于效率方面的考虑,在得到修剪区的起始和终止位置之前避免复制字符串的任何部分。
当字符串末尾只有少量空格时,这种情况使正则表达式处于无序状态。原因是,尽管正则表达式很好地去除了字符串头部的空格,却不能同样快速地修剪长字符串的尾部。一个正则表达式不能跳到字符串的末尾而不考虑沿途字符。正因如此,在第二个while循环中从字符串末尾向前查找一个非空格字符。
虽然上面代码不受字符串总长度影响,但是它有自己的弱点—长的头尾空格,因为循环检查字符是不是空格在效率上不如正则表达式所使用的优化过的搜索代码。
(3)正则表达式与非正则表达式结合起来修剪字符串
最后一个办法是将正则表达式与非正则表达式两者结合起来,用正则表达式修剪头部空格,用非正则表达式方法修剪尾部字符。
String.prototype.trim = function() {
var str = this.replace(/^\s+/, ""),
end = str.length - 1,
ws = /\s/;
while (ws.test(str.charAt(end))) {
end--;
}
return str.slice(0, end + 1);
}
当只修剪一个空格时,此混合方法非常快,同时去除了性能上的风险,如以长空格开头的字符串,完全由空格组成的字符串(尽管它在处理尾部长空格的字符串时仍具有弱点)。
注意:此方案在循环中使用正则表达式检测字符串尾部的字符是否为空格,虽然使用正则表达式增加了一点性能负担,但是它允许根据浏览器定义空格字符列表,以保持简短和兼容性。
所有修剪方法总的趋势:在基于正则表达式的方案中,字符串总长比修剪掉的字符数量更影响性能;而非正则表达式方案从字符串末尾反向查找,不受字符串总长的影响,但明显受到修剪空格数量的影响。简单地使用两个子正则表达式在所有浏览器上处理不同内容和长度的字符串时,均表现出稳定的性能,因此可以说这种方案是最全面的解决方案。混合解决方案在处理长字符串时特别快,其代价是代码稍长,在某些浏览器上处理尾部长空格时存在弱点。
建议49:比较数组与对象同源特性
我们常常将对象和数组作为不同的数据类型来处理,这是一种有用且合理的简化,通过这种处理可以在大多数的JavaScript程序设计中将对象和数组作为单独的类型来处理。要完全掌握对象和数组的行为,还必须了解数组不过是一个具有额外功能层的对象。使用typeof运算符时就会发现这一点,因为将其作用于一个数组的值,返回值是字符串“object”。
数组是一段线性分配的内存,它通过整数去计算偏移并访问其中的元素。数组可以是访问速度很快的数据结构。不幸的是,JavaScript没有数组这样的数据结构。相反,JavaScript提供了一种拥有一些类数组(array-like)特性的对象,把数组的下标转变成字符串,将其作为属性。这类对象的访问速度明显比真正数组慢,但它使用更方便。属性的检索和更新方式与对象一模一样。数组有它自己的字面量格式,还有一套非常有用的内置方法。
(1)数组字面量
数组字面量提供了一种非常方便地创建新数组的表示法。一个数组字面量是在一对方括号中包围零个或多个用逗号分隔的值的表达式。数组字面量可以出现在任何表达式可以出现的地方。数组的第一个值将获得属性名“0”,第二个值将获得属性名“1”,依此类推。
var empty = [];
var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
empty[1] // undefined
numbers[1] // 'one'
empty.length // 0'
numbers.length //10
(2)对象字面量
var numbers_object = {
'0' : 'zero',
'1' : 'one',
'2' : 'two',
'3' : 'three',
'4' : 'four',
'5' : 'five',
'6' : 'six',
'7' : 'seven',
'8' : 'eight',
'9' : 'nine'
};
产生了一个与前面的方法相似的结果。numbers和numbers_object都是包含
10个属性的对象,并且这些属性刚好有相同的名字和值。但numbers和
numbers_object也有一些显著的不同,numbers继承自Array.prototype,而numbers_object继承自Object.prototype,所以numbers继承了大量有用的方法。同时,numbers有一个length属性,而numbers_object则没有。
在大多数语言中,一个数组的所有元素都要是相同的类型,而JavaScript允
许数组包含任意混合类型的值。
var misc = ['string', 98.6, true, false, null, undefined, ['nested', 'array'], {
object : true
}, NaN, Infinity];
misc.length
建议50:正确检测数组类型
由于数组和对象的数据同源性,导致在JavaScript编程中经常会出现:在必
须使用数组时使用了对象,或者在必须使用对象时使用了数组。
选用数组或对象的规则很简单:当属性名是小而连续的整数时,应该使用数组,或者当对属性的位置和排列顺序有要求时,应该使用数组。否则,使用对象。
JavaScript语言对数组和对象的区别是混乱的。typeof运算符检测数组的类
型是“object”,这没有什么意义,因此在正确检测数组和对象方面JavaScript
没有提供很多的机制。这时可以通过自定义is_ array函数来弥补这个缺陷。
var is_array = function(value) {
return value && typeof value === 'object' && value.constructor === Array; };
不过,上面函数在识别从不同的窗口(window)或帧(frame)中构造的数组
时会失败,要想准确地检测外部数组类型,还需要更进一步地完善该函数。
var is_array = function(value) {
return value &&
typeof value === 'object' &&
value.constructor === Array &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));
};
在完善后的函数中,首先要判断这个值是否为真,函数不接受null和其他值为假的值。其次,判断对这个值的typeof运算的结果是否是object。对于对象、数组和null来说,得到的都将是true。接着,判断这个值是否有一个值为数字的length属性,对于数组将总是得到true,而对于对象来说并非如此。接下来,判断这个值是否包含一个splice方法。对于所有数组来说,这又将得到true。最后,判断length属性是否是可枚举的,对于所有数组来说,将得到false,这是对数组最可靠的测试。
不过,使用下面的方法也能够很好地检测数组类型,并且这种方法显得更加简洁。
var is_array = function(value) {
return Object.prototype.toString.apply(value) === '[object Array]'; };
潍坊科技学院 JavaScript课程设计 报告书 设计题目基于javascript的电子商务网站开发 专业班级11软件一 学生姓名江京翔 学号201101080002 指导教师陈凤萍 日期2012.12.24~2012.1.11 成绩
课程设计任务书 院系:软件学院专业:软件技术班级:11软1 学号:201101080002 一、课程设计时间 2012年12月24日至2013年1月11日,共计3周。 二、课程设计内容 使用html+javascript+css 完成以下任务: 1、能够熟练使用css结合html实现网页布局。 2、熟练使用文档对象模型和事件驱动,能够很好的实现web表单的交互式操作。 3、熟练使用javascrip中的对象,实现网页的动态效果。 三、课程设计要求 1. 课程设计质量: ?贯彻事件驱动的程序设计思想,熟练使用javascript中的对象,实现网页特效。 ?网页设计布局合理,色彩搭配合理,网页操作方便。 ?设计过程中充分考虑浏览器兼容等问题,并做适当处理。 ?代码应适当缩进,并给出必要的注释,以增强程序的可读性。 2. 课程设计说明书: 课程结束后,上交课程设计报告书和相关的网页。课程设计报告书的格式和内容参见提供的模板。 四、指导教师和学生签字 指导教师:学生签名:江京翔 五、教师评语:
基于javascript的电子商务网站开发 摘要 JavaScript是开发WEB应用程序不可或缺的一种语言,无论是为web页面增加交互性还是创建整个应用程序,如果没有Javascript,今天的web就不是现在这个样子了。JavaScript是具有正式规范的基于标准语言;然而,正如任何一个web开发人员所告诉你的那样,几乎每个web浏览器对这个规范的解释都不同。 本网站充分的结合了HTML与CSS的结合充分显示了网站的动态效果,是客户与网站能够充分的结合,进行信息的交换信息不断的进行更新。 基于新闻管理网站,国外新闻页面更具有代表性,是网站最标准型之一,通过Javascript 脚本的交互式该页面更好与其他的页面相互结合。 同时通常页面的下载是按照代码的排列顺序,而表格布局代码的排列代表从上向下,从左到右,无法改变。而通过CSS控制,您可以任意改变代码的排列顺序,比如将重要的右边内容先加载出来。 关键字:节假日、日历、Javascript脚本
如何解决好课堂纪律管理问题 课堂纪律管理是课堂管理的又一项重要内容。在课堂教学中,难免出现各种课堂问题行为,干扰教学活动的正常进行。因此,加强课堂纪律管理,对于维持良好的教学环境具有重要意义。 一、什么是课堂纪律 一般来说,纪律有三种基本含义:(1)纪律是指惩罚;(2)纪律是指通过施加外来约束达到纠正行为目的的手段;(3)纪律是指对自身行为起作用的内在约束力。这三层意思概括出了纪律的基本内涵,同时也反映出良好纪律的形成过程是一个由外在的强迫纪律逐步过渡到内在自律的过程我们认为,所谓课堂纪律,主要是指对学生的课堂行为施加的外部控制与规则。良好课堂纪律的形成,不仅需要强制性的规则,更需要学生的自制与自律。因此,教师在提出课堂行为规范,进行外部控制时,要注意培养学生遵守纪律的自觉性,帮助学生自觉发展纪律。 研究表明,由于形成的原因不同,课堂纪律一般可分为四类: (一)教师促成的纪律 所谓教师促成的纪律,主要指在教师在帮助指导下形成的班级行为规范。这类纪律在不同年龄阶段所发挥的作用是有所不同的。刚入学的儿童需要较多的监督和指导,因为他们不知道如何在一个大的团体中学习和游戏,没有教师的适当帮助,很难形成适合于有组织集体活动的行为准则。年龄越小,学生对教师的依赖越强,教师促成的纪律所发挥的作用也越大。随着年龄的增长和自我意识的增强,学生一方面会反对教师的过多限制,另方面又需要教师对他们的行为提供一定指导和帮助。因此,这类纪律虽然在不同年龄阶段发挥作用的程度不同,但它始终是课堂纪律中的一个重要类型。 (二)集体促成的纪律 所谓集体促成的纪律,主要指在集体舆论和集体压力的作用下形成的群体行为规范。从儿童入学开始,同辈人的集体在使儿童社会化方面就开始发挥愈来愈重要的作用。随着学生年龄的增长,同伴群体对学生个体的影响会越来越大。当一个儿童从对成年人的依赖中逐渐解放出来时,他同时开始对他的同学和同辈人察言观色以便决定应该如何行事、如何思考和如何信仰。青少年学生常以“别人也都这么干”为理由而从事某件事情,在一定时期他们的信奉、见解、爱好、憎恶甚至偏见也都视集体而定。由于同辈集体的行为准则为青少年学生提供了价值判断和日常行为的新的参照点,结束了青少年学生在思想、情感和行为方面的不确定性、无决断力、内疚感和焦虑,所以他们往往过高地估计同伴集体行为准则的价值,并积极地认同和服从它。集体促成的纪律也有两类,一类是正规群体促成的纪律,如班集体的纪律、少先队的纪律等,另一类是非正规群体促成的纪律,如学生间的友伴群体等。教师应着重对非正规群体加以引导,帮助他们形成健康的价值观和行为准则,并使之融合到正规群体中来,使每个学生都认同班集体的行为规范。 (三)自我促成的纪律 所谓自我促成的纪律,简单说就是自律,它是在个体自觉努力下由外部纪律内化而成的个体
、单项选择题(本题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目要求的 ,请将其正确答案涂写在答题卡 上。 1. 以“s”为文件扩展名的文件是 _________ (A) html 文件 (B)网页文件 (C) Java 文件 (D) Javascript 文件 2. 以下合法的变量名是 ______ (A) new (B) _123 3. 以下正确的字符串是___ (A) xyz (B) xyz"' 4. 设有语句: var st1= test st1=st1+ 25; 贝U st1的值是 _____ 。 (A) test25 ' (B) 25 5. 123+ ”789 ”的值是 _____ _ (A) 123789 ' (B) 912 6. 表达式(a=2,b=5,a>b?a:b (A) 2 (B) 5 的值为 _______ 8. 设 var a=2,b=3; 则 a++==b?(a-1):b _ 的结果是 。_ A) 0 B) 1 C) 2 D) 3 9. 下面while 循环执行的次数为 __________ var i=5; while (i==0) i--; A)无限 B) 1 C) 5 D) 0 (C) null o (C) xyz ' (D) 2abc (D) xyz ' (C) test ' (D)语法错误 (C) 789 ” (D)语法错误 )的值是 。 (C) 1 (D) 0 7. 设有语句 var a=3,b=5,c=3,d=8,m=3,n=2; 则逻辑表达式(m=a>b)&&(n=c>d) 运算后,n (A) 0 (B) 1 (C) 2 (D) 3
长江职业学院Javascript语言程序设计实验指导书 专业: 学号: 姓名: 班级: 指导老师: 软件教研室编
实验一 JavaScript基本操作 一、实验目的 熟练掌握在HTML文件中编写JavaScript程序的基本操作,及在Microsoft Internet Explorer浏览器和Netscape的Nevigator浏览器中调试JavaScript的基本操作。 二、实验内容 1、用NotePad创建一个简单的.htm文件,在Microsoft Internet Explorer浏览器中浏览效果。 2、编写第1章中的实例源文件,并在Microsoft Internet Explorer浏览器中进行测试。 3、调试一段JavaScript程序,找出其中的错误。 三、实验步骤 1、通过windows的文件管理器,在c盘下新建一个文件夹jsp_ex,用于保 存实验中的文件,如图1-1所示。 2、在windows中打开“记事本”,(也可以用其他编辑html文件的工具软 件,如Microsoft frontpage,Macromedia Dreamweaver等,编写例1-1的程序,然后将文件保存在C:\jsp_ex文件夹中。 3、用下述任意一种方法,在浏览器中显示,如图1-2。
A.在图1-1中双击“”文件名。 B.在图1-1中用鼠标右键单击“”,在打开的菜单列表中,如果有所需浏览器名就可以直接点击浏览器名。 C.现在windows中打开所需浏览器,然后按【ctrl】+【o】,在打开的对话框中找到文件。 4、再次编辑文件,将第21行中的“”改写为“”然后按第3步的操作, 得到如图1-3的效果,不能显示“上一次网页更新日期”,这时,通过浏览器的调试工具查找出出错的位置,修改后再次测试。 5、按1-2的步骤,将例1-1改写为“”和“”两个文件即通过外部javascript 文件和html文件一起完成网页的制作。 四、思考练习 1.为什么“上一次网页更新日期”在每一次打开都是同一个时间 2.请写出你在程序编写中出现的错误和改正方法,并分析。
小学课堂纪律管理的有效方法 课堂纪律在整个教学过程中是十分重要的,良好的课堂纪律是教学得以顺利进行的前提,所以我们要重视课堂纪律的管理,找到一些行之有效且符合自己的教学管理方法。在小学的课堂上,纪律显得格外重要,小学生本身就是一群好动且基本没有自控能力的学生群体,这个时候老师的主导作用就显得格外重要。 小学课堂纪律管理的有效方法 一、把握原则分寸,增强课堂教学组织调控的预见性和针对性 首先,课堂组织调控必须以教师的权威作为基础。这里的教师权威指的并不是学生对教师的威严产生的惧怕心理,而是指作为一名教师,他必须得到学生的认可,也只有得到学生的认可,学生才会从心理上认可老师的行为与语言。教育社会学家发现,小学生,特别是低年级的小学生一般具有“向师性”的特点,即,一旦他们认可了一名老师,就很容易以教师的话为行动指南。 其次,要针对学生的心理及时调整教学内容,教学方法等。从学生的心理特点出发,是教学的一大原则,在课堂组织中也同样适用。比如,同样是小学生,一年级和五年级的学生对新的教学内容的关注时间绝对不一样,因此对一年级的学生不能长时间地讲同一个内容,应注意教学内容的切换,否则学生就会因厌烦而“暴动”,导致课堂纪律混乱。 再次,严格要求与尊重学生相结合。这指的是要把对学生的思想和行为的严格要求与对他们个人的尊重和信赖结合起来,
使教师对学生的影响与要求易于转化为学生的内在品质。课堂组织,很多程度上表现了老师对学生的严格要求,但是在严格要求基础上要体现教师对学生个体的尊重。 二、引入游戏,劳逸结合 有关研究发现,低年级孩子的注意力最多只能连续集中 15-20分钟,那么在40分钟的课堂中,孩子们不可能一直都 专心地听讲,所以作为低年级的老师也不要总是抱怨孩子们纪律差,因为这是他们的年龄特征所造成的,我们要做的是想办法使40分钟的课堂动静交替,让孩子们在一动一静中劳逸结合,这样孩子们学习起来才不会觉得厌烦。那么如何使课堂动静交替呢,最好的办法就是在教学环节中穿插一些游戏,而这些游戏又最好与本节课的教学内容相关,对本节教学内容起到一个补充或巩固的作用。 三、课堂纪律的调控,用节奏代替“喊” 这说的是当学生自己读书一段时间后,我怎样让生尽快地安静下来。以前,我只能扯着嗓子喊:“一、二、三,静下 来!”可效果越来越差,后来,得到别人的启发,我用有节奏 的拍手来代替。我要让他们停时就拍“哒哒”两下,学生听到后拍五下,一拍好就坐好。我发现这个方法十分奏效,既集中了他们的注意力,也使课堂显得张弛有序。 四、恰当有效的奖惩是维持注意力的保障 除了精心备好课,用好课堂调控口令外,我们还要适当地激励和规范孩子们的课堂行为。 1、口头表扬。在课堂上,教师要经常使用鼓励性的语言,如当孩子们表现得很好时,要及时表扬:、“你真了不 起”“你真聪明”“你说得真好”“老师真喜欢这样的你”等,也可以组织全班小朋友竖起大拇指夸他“棒,棒,你真棒”;
一、单项选择题(本题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其正确答案涂写在答题卡上。 1. 以“.js”为文件扩展名的文件是______。 (A) html文件(B) 网页文件(C) Java文件(D) Javascript文件 2.以下合法的变量名是______。 (A) new (B) _123 (C) null (D) 2abc 3.以下正确的字符串是______。 (A) xyz (B) ‘xyz” (C) “xyz’ (D) ‘xyz’ 4.设有语句: var st1=’test’; st1=st1+ 25; 则st1的值是______。 (A) ‘test25’ (B) 25 (C) ‘test’(D) 语法错误 5.123+”789”的值是______。 (A) ‘123789’ (B) 912 (C) “789”(D) 语法错误 6.表达式(a=2,b=5,a>b?a:b)的值是______。 (A) 2 (B) 5 (C) 1 (D) 0 7.设有语句var a=3,b=5,c=3,d=8,m=3,n=2; 则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为_______。 (A) 0 (B) 1 (C) 2 (D) 3 8.设var a=2,b=3; 则a++==b?(a-1):b的结果是___________。 A) 0 B) 1 C) 2 D) 3 9. 下面while循环执行的次数为________。 var i=5; while (i==0) i--; A)无限B) 1 C) 5 D) 0 10. 以下数组的定义中____________是错误的。 A) var a=new Array(); B) var a=new Array(10); C) var a[10]={ 1,2,3}; D) var a=["1",2,"3"]; 11.设var x=3,y=4; 下列表达式中y的值为9的是________。 A)y*=x-3 B)y/=x*9 C)y-=x+10 D)y+=x+2 12. 在程序中有多个相关联的选项,若要默认选择某一项,应在该项中增加_________属性。 A) checked B) default C) selected D) defaultValue 13.结果为NaN的表达式是______。 (A) "80"+"19" (B) "十九"+"八十" (C) "八十"*"十九" (D) "80"*"19" 14.执行下面语句后c的值是_______。 var a=2,b=1,c=3; if(aJavascript期中测试卷
Javascript程序设计期中考试试卷班级:姓名:总分: 一、选择题(本大题60分,每小题2分) 1.以下哪个选项是Javascript技术特征( D ) A.解释型脚本语言 B.跨平台 C.基于对象和事件驱动 D.具有以上各种功能 2.JavaScript是(B )。 A. 一种Java 编程语言,不同的是它可以用于网页开发 B. 一种解释性的、用于客户端的、基于对象的程序开发语言 C. 一种用于Firefox浏览器和Internet Explorer浏览器的网页开发语言 D. 一种用于制作网页动画效果的程序开发语言 3.以下哪个单词不属于javascript保留字:( B ) A. var B. parent C. function D. for 4.编辑Javascript程序时(C ) A.只能使用记事本 B.只能使用FrontPage编辑软件 C.可以使用任何一种文本编辑器 D.只能使用Dreamweaver编辑工具 5.在程序开发过程中,用户输入内容的校验常分为功能性校验和(A ) A.格式性校验 B..内容性校验 C.事件性校验 D.方法性校验 6.使用外部JavaScript程序文件的正确格式是(A ) A.
(2)利用全局变量和函数,设计模拟幸运数字机游戏。设幸运数字为8,每次由计算机
随机生成3个1~9之间的随机数,当这3个随机数中有一个数字为8时,就算赢了一次。 Ex050309.html
二.事件与对象 1.设计一个表单,放入两个按钮,单击它们时将显示不同问候语。 S07_02.HTM
1、选择题:9题 1、要求用JavaScript实现下面的功能:在一个文本框中内容发生改变后,单击页面的其他部分将弹出一个消息框显示文本框中的内容,下面语句正确的是() A. B. C. D. 正确答案是: B 2、在HTML页面中,下面关于Window对象的说法不正确的是()。 A.Window对象表示浏览器的窗口,可用于检索有关窗口状态的信息 B.Window对象是浏览器所有内容的主容器 C.如果文档定义了多个框架,浏览器只为原始文档创建一个Window对象,无须为每个框架创建Window对象 D.浏览器打开HTML文档时,通常会创建一个Window对象 正确答案是: C 3、window的哪个方法可以显示输入对话框?() A.confirm() B.alert() C.prompt() D.open() 正确答案是: C 4、open()方法的哪个外观参数可以设置是否显示滚动条?() A.location B.menubar C.scrollbars D.toolbar 正确答案是: C 5、在Javascript语言中,当元素失去了焦点时激发的事件是( ) A.Focus B.UnLoad C.MouseOver D.Blur 正确答案是: D 6、DHTML不具备的优点是() A.动态样式 B.动态语法 C.动态内容 D.动态定位
《Javascript程序设计》实验指导书 一、课程性质和教学目的 JavaScrip是一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。 学习Javascript必须理论联系实际,多做上机练习。只有在上机实验过程中才能真正学会程序设计。本实验报告主要包括学期内各个实验的实验目的、实验内容、实验记录、实验总结等,供学生学习记录,以提高学习效率。参加实验的学生应参照本报告手册的要求,认真实验,如实填写实验数据,并对实验结果进行分析,阐述实验中所遇到的问题,提出解决问题的方法。 二、实验目的 上机实验的目的不仅是为了验证教材和讲课的内容,或者验证自己所编写的程序正确与否。学习程序设计上机实验的目的是: 1.加深对讲授内容的理解,尤其是一些语法规定,课堂讲授既枯燥无味又难以记忆,但它们都很重要。能过多次上机就能自然地、熟练地掌握。通过上机掌握语法是行之有效的方法。 2.学会上机调试程序。即善于发现程序中的错误,并且能很快排除这些错误,使程序能正确运行。要真正掌握这门课程,不仅应当了解和熟悉有关理论和方法,还要求自己动手实现即会编程并上机调试通过。故应给予充分重视。调试程序固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积经验,而且有些经验是只能意会难以言传。调试程序的能力是每个程序设计人员应当掌握的一项基本功。 3.做实验时不要在程序通过后就认为搞定、完成任务了,而应当在己通过的程序甚而上作一些改动(例如修改一些参数、增加程序一些功能、改变输入数据的方法等),以观察和分析所出现的情况。 三、上机实验前的准备工作 实验前应做好准备工作,以充分利用有限的上机时间。准备工作至少包括: 1.复习和掌握本实验有关的教学内容。 2.准备好上机所需的程序。初学者切忌不编写程序或抄别人的程序去上机,应从一开始就养成严谨的科学作风。 3.对运行上可能出现的问题应事先作出估计;对程序中自己有疑问的地方,应作上记号,以便在上机时给予注意。 4.根据实验内容认真准备实验程序及调试时所需的输入数据。 5.在上实验课之前必须写好预习报告(编程题源程序用纸写好或画好程序流程图) 6.填空与改错题等题要预先做好,上机时的工作只能是输入源程序和调试修改。
课堂纪律管理的13大策略 课堂纪律管理的13大策略(上) 1.聚焦在你开始上课之前,一定把教室里所有人的注意力都集中在你的身上,如果有人在私下聊天,你不要讲课。 没有经验的教师或许会认为,只要开始上课了,学生自然就会安静下来,以为学生会看到课堂已经开始,该进入学习状态了。有时这会起作用,但学生并不一定总会这么想,他们会认为你能接受他们的行为,不在意你讲课时有人说话。 聚焦这个技能意味着,你应该在开始上课之前要求学生集中注意力,即只要还有人没安静下来,你就一直等下去。有经验的教师的做法是,在所有学生都完全安静下来之
后,再停顿三五秒钟,然后才开始用低于平时的音调讲课。 讲课语气温和的教师,通常比嗓门大的教师课堂更加安静。学生为了听到他的声音会保持安静。 2.给学生交底 如果学生对这节课的安排心中无数,这就会增加他们在课堂上的不安定感。因此,教师应该在每节课的一开始就明确地告诉 学生这节课要做什么,以及每个环节大约需要多少分钟。 为了使学生积极配合教师完成教学任务,教师可以让学生的心中有一个“盼头”,告诉他们在这节课的结尾阶段他们可以做
的事情。比如,在向他们说明了本节课的教学安排后,可以说:“如果进行顺利,我可以让你们在这个小时的最后阶段跟朋友聊天,或到图书馆去,也可以赶做其他科的作业。”这样的安排也会让那些喜欢上课讲话的学生有所收敛。 3.实时监控 实施这一条的关键是在教室里四处走动。当学生在做作业时,在教室里巡回走动,检查他们做的情况。 有经验的教师会在学生开始做作业两 分钟后对教室进行巡视,看是不是所有学生都开始做了,都在做该做的事情。延迟两分钟是很重要的,因为学生已经做出了一两道
2019年信息技术模拟测试二 1、下列属于ZigBee技术特点的是( ) A、近距离、低功耗 B、远距离、低功耗 C、近距离、高功耗 D、远距离、高功耗 2、下列不属于物联网关键技术的是( ) A、传感网技术 B、虚拟现实技术 C、RFID技术 D、M2M技术 3、物联网中的RFID主要用于( ) A、感知识别 B、信息传输 C、智能计算 D、数据存储 4、某Access数据表打开后如下图所示, 下列叙述中,错误的是( ) A、数据表名称是books B、数据表中共有61条记录 C、数据表中共有3个字段 D、author字段的数据类型应为文本 5、下列不属于操作系统软件的是() A、WinRAR B、Linux C、iOS D、Android 6、下列不能用于完成多媒体信息集成的软件是( ) A、Authorware B、Powerpoint C、Photoshop D、Flash 7、我们可以通过调制解调器、路由器、电话线、网线等设备或设施实现家庭多台电脑同时上网。下列连接图中正确的是( )
8、下列对动态网页技术--ASP的理解,错误的是( ) A、ASP是指Active Server Pages,即动态服务器页面技术 B、采用ASP可以设计出论坛、留言板等交互性网页 C、ASP与JavaScript都可以实现客户端交互技术 D、ASP是一个网络服务器端的开发环境 9、下列选项中,不属于表格相关HTML标签的是( ) A、
B、
JavaScript测试题 一、选择题(共30题,每小题1分,共30分。把每小题的正确答案写在后面的答题卡中。 1、以下哪个单词不属于javascript保留字:() A、 for B、 if C、 function D、 dim 2、以下哪个运算符不属于逻辑运算符?() A、&& B、|| C、^ D、! 3、下列程序设计语言与Javascript不属于同种语言的是()。 A、 VBscript B、 Jscript C、 C++ D、ECMAScript 4、组成JavaScript程序的基本单元是()。 A、语句 B、表达式 C、变量 D、函数 5、下面定义变量中错误的是()。 A、 eee B、 _abc C、box_1 D、 2point 6、下面不是常量的是()。 A、 false B、 undefined C、 100 D、 null 7、下面语句var x= -10, y; x=2*x; y=x+15;计算后y的结果是()。 A、 -15 B、 10 C、 -5 D、 5 8、下列表达式运算结果为真的是()。 A、1<2 && “5”! =5 B、2>2*1 || “5”= =5 C、2>2*1 && 5= =5 D、 1<2 && “5”= =5 9、下面不是用于创建一个新的对象的语句是()。 A、 var d = new Date(); B、 function f(){ var x=5; x++;} C、 var o = new Object(); D、 var o = {title: “hello”, author: “Tom”}; 10、以下程序段,执行的结果是()。 var x=-1;
JavaScript上机作业 作业1: 使用循环语句,计算从1到100个数相加的结果并将其输出在Web页面上。
习题2: 让用户输入一个名字的列表,并将名字保存在数组中。在程序中循环地提示用户输入一个名字,直到用户输入为空。然后按升序顺序排列名字,并把名字输出在页面上,每个名字占一行。