重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
能直接向操作系统申请内存的MS只有汇编,C,C++这类语言才能做到;其他语言,包括脚本都是间接申请内存!关于浏览器方面的书嘛!我建议你看一下firefox的源码,这是最好的教材!:lol:
成都创新互联专注于企业营销型网站、网站重做改版、莱州网站定制设计、自适应品牌网站建设、成都h5网站建设、成都商城网站开发、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为莱州等各大城市提供网站开发制作服务。
亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣。
想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准。
关于正则表达式的教程,网上也有很多,相信你也看了一些。
与之不同的是,本文的目的是希望所有认真读完的童鞋们,都有实质性的提高。
本文内容共有七章,用JavaScript语言完整地讨论了正则表达式的方方面面。
如果觉得文章某块儿没有说明白清楚,欢迎留言,能力范围之内,老姚必做详细解答。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
1、字符串的创建
创建一个字符串有几种方法。最简单的是用引号将一组字符包含起来,可以将其赋值给一个字符串变量。
var myStr = "Hello, String!";
我们在上面脚本创建了字符串,但本质上,它们并不是真正的字符串对象,准确地说,它们是字符串类型的值。要创建一个字符串对象,可使用如下语句:var strObj = new String("Hello, String!");
使用typeof运算符查看会发现,上面的myStr类型为string,而strObj类型为object。
如果想知道字符串的长度,使用其length属性:string.length。
得到字符串的指定位置的字符使用方法:string.charAt(index);
2、字符串的拼接
非常简单,就用一个"+"将两个字符串"相加":
var longString = "One piece " + "plus one more piece.";
要将多个字符串累积为一个字符串,还可以使用"+="操作符:
var result = "";
result += "My name is Anders"
result += " and my age is 25";
要在字符串中添加换行符,需要使用转义字符"/n":
var confirmString = "You did not enter a response to the last " +
"question./n/nSubmit form anyway?";
var confirmValue = confirm(confirmString);
但这种方法只能用在像警告、确认对话框之类的情况下,如果将这段文本作为HTML内容呈现,就无效了,此时用"br"代替它:
var htmlString = "First line of string.brSecond line of string.";
document.write(htmlString);
String对象还提供了方法concat(),它完成与"+"相同的功能:
string.concat(value1, value2, ...)
不过concat()方法显然不如"+"来得直观简洁。
3、访问字符串的子串
使用substring()或slice()方法(NN4+, IE4+),下面说明它们的具体用法。
substring()的原型为: string.substring(from, to)
第一个参数from指定了子字符串在原字符串中的起始位置(基于0的索引);第二个参数to是可选的,它指定了子字符串在原字符串的结束位置(基于0的索引),一般情况下,它应比from大,如果它被省略,那么子字符串将一直到原字符串的结尾处。
如果参数from不小心比参数to大了会怎样?JavaScript会自动调解子字符串的起止位置,也就是说,substring()总是从两个参数中较小的那个开始,到较大的那个结束。不过要注意,它包含起始位置的那个字符,但不包含结束位置的那个字符。
var fullString = "Every dog has his day.";
var section = fullString.substring(0, 4); // section is "Ever".
slice()的原型为: string.slice(start, end)
参数start表示子串的起始位置,如果为负数,那么可以理解为倒数第几个开始,例如-3表示从倒数第三个开始;参数end表示结束位置,与start一样,它也可以为负数,其含义也表示到倒数第几个结束。slice()的参数可以为负数,所以要比substring()更加灵活,但没那么宽容了,如果start比end要大,它将返回一个空字符串(示例略)。
还有一个方法是substr(),其原型为: string.substr(start, length)
从原型可以看出它的参数的含义,start表示起始位置,length则表示子字符串的长度。JavaScript标准不提倡使用该方法。
4、字符串的大小写转换
使用toLowerCase()和toUpperCase()方法:
var city = "ShanGHai";
city = city.toLowerCase(); // city is "shanghai" now.
5、判断两个字符串是否相等
先将用户的输入值全部转换为大写(或小写),然后再行比较:
var name = document.form1.txtUserName.value.toLowerCase();
if(name == "urname")
{
// statements go here.
}
JavaScript有两种相等运算符。一种是完全向后兼容的,标准的"==",如果两个操作数类型不一致,它会在某些时候自动对操作数进行类型转换,考虑下面的赋值语句:
var strA = "i love you!";
var strB = new String("i love you!");
这两个变量含有相同的字符序列,但数据类型却不同,前者为string,后者为object,在使用"=="操作符时,JavaScript会尝试各种求值,以检测两者是否会在某种情况下相等。所以下面的表达式结果为true: strA == strB。
第二种操作符是"严格"的"===",它在求值时不会这么宽容,不会进行类型转换。所以表达式strA === strB的值为false,虽然两个变量持有的值相同。
有时代码的逻辑要求你判断两个值是否不相等,这里也有两个选择:"!="和严格的"!==",它们的关系就类似于"=="和"==="。
讨论:
"=="和"!="在求值时会尽可能地寻找值的匹配性,但你可能还是想在比较前进行显式的类型转换,以"帮助"它们完成工作。比如,如果想判断一个用户的输入值(字符串)是否等于一个数字,你可以让"=="帮你完成类型转换:
if(document.form1.txtAge.value == someNumericVar) { ... }
也可以提前转换:
if(parseInt(document.form1.txtAge.value) == someNumericVar) { ... }
如果你比较习惯于强类型的编程语言(比如C#,Java等),那么这里你可以延续你的习惯(类型转换),这样也会增强程序的可读性。
有一种情况需要注意,就是计算机的区域设置。如果用""和""来比较字符串,那么JavaScript把它们作为Unicode来比较,但显然,人们在浏览网页时不会把文本当作Unicode来阅读:) 比如在西班牙语中,按照传统的排序,"ch"将作为一个字符排在"c"和"d"之间。localeCompare()提供了一种方式,可以帮助你使用默认区域设置下的字符排序规则。
var strings; // 要排序的字符串数组,假设已经得到初始化
strings.sort(function(a,b) { return a.localeCompare(b) }); // 调用sort()方法进行排序
6、字符串的查找
使用string的indexOf()方法:
strObj.indexOf(subString[, startIndex])
strObj为要进行判断的字符串,subString为要在strObj查找的子字符串,startIndex是可选的,表示查找的开始位置(基于0的索引),如果startIndex省略,则从strObj开始处查找,如果startIndex小于0,则从0开始,如果startIndex大于最大索引,则从最大索引处开始。
indexOf()返回strObj中subString的开始位置,如果没有找到,则返回-1。在脚本中,可以这么使用:
if(largeString.indexOf(shortString) != -1)
{
// 如果包含,进行相应处理;
}
也许一个字符串会包含另一字符串不止一次,这时第二个参数startIndex也许会派上用场,下面这个函数演示如何求得一个字符串包含另外一个字符串的次数:
function countInstances(mainStr, subStr)
{
var count = 0;
var offset = 0;
do
{
offset = mainStr.indexOf(subStr, offset);
if(offset != -1)
{
count++;
offset += subStr.length;
}
}while(offset != -1)
return count;
}
String对象有一个与indexOf()对应的方法,lastIndexOf():
strObj.lastIndexOf(substring[, startindex])
strObj为要进行判断的字符串,subString为要在strObj查找的子字符串,startIndex是可选的,表示查找的开始位置(基于0的索引),如果startIndex省略,则从strObj末尾处查找,如果startIndex小于0,则从0开始,如果startIndex大于最大索引,则从最大索引处开始。该方法自右向左查找,返回subString在strObj中最后出现的位置,如果没有找到,返回-1。
没有所谓的关联数组与索引数组的这种分别。在js当中所有要素都是继承自Object对象的,任何对象都能通过obj["name"]=something的形式来添加属性.
其它语言中有区分关联数组与索引数组。
任何语言都是解决问题的,单纯的javascript是没有意义的。你如果不了解其它前端技术,如CSS,XHTML,XML,只知道Javascript,进步就会很慢的。当你了解了这些以后,你会想用Javascript实现更多的效果。这样你才能进步。还有就是多看别人的代码。
1. JavaScript DOM 编程艺术
这本书作为被大家推荐的最多的前端入门书籍是有道理的。
他能真正让大家了解dom脚本编程,或是说前端编程技术背后的思路和原则。
对于初学者来说,这本书没有任何门槛,按部就班跟着书籍实例编写代码即可。
我们会知晓如何对浏览器元素操作和掌控,会学会如何实现简单的页面效果。
这种简单易得的成就感是一个编程语言入门时最难能可贵的体验。
阅读建议:
这本书虽然简单,但是能让人快速对前端产生兴趣和成就感。
不过后续学习jquery的时候可能会产生挫败感。原生js dom操作的成就感会被jquery便捷的API所彻底打败。所以一定要恰当的调整心态,转换思维方式,正确认识到jquery和原生js分别的优劣之处。
在熟练使用jquery后还能想起来翻看这本书,找到之前未曾发现的闪光点,就是入门成功了。
2. JavsScript高级程序设计(第三版)
无论何时,这都是学习js最好的书。
如果说其他的书都是在合适的阶段会有不一般的体验。
这本书就是无论什么阶段,都够你感悟一番的。
当你看完了市场上js相关(不包括框架类库的最佳实践类)的所有书籍。你再回去看这本书,也会发现其实95%的内容早就写在这本书里了,只不过你当时等级不够,根本没有意识到。
这本书排版舒服,翻译得体,内容丰富,语言流畅。涵盖了js语法(面向对象,闭包作用域等),js使用(dom,bom,html5API),编程实践(高阶函数,编码规范)等程序员使用javascript时会遇到的大部分问题。
(今天在上海面试了一天。大部分很顺利,只是有几个比较偏的问题没回答好。晚上回去之后一翻高程三,果然在里面都写得明明白白的。不得不服。)
阅读建议:
人们喜欢把他和犀牛书拿一起推荐,不过就我看来,他们完全不是一个可读性上的。
一个是课本一个是字典。而且还是佶屈聱牙的字典。
所以无论何时我都会把高程三排在js推荐书籍的第一位。
3. 锋利的jQuery
图忘了拍了,就不补了。
这本书如果紧接着dom编程看,会如我我说的那样瞬间摧毁你的小小的成就感。
因为这本工具书级别的书简单暴力到不给你思考什么“平稳退化”,“js动画计时器”这些dom编程中提及的问题,就直接就甩出一大片简单有效的jqueryAPI颠覆你的世界观。
这本书是如此的易懂以至于看完之后瞬间就觉得自己能把web玩出一片花来了。
作为工具书级别的书,或是说学习jqueryAPI的书,这是首选。
阅读建议:
熟悉jquery是每个前端必须要会的事。
只是不要被Jquery的便捷迷惑,而抛离原生js,把原生js贬得一文不值,否则后面会付出昂贵的代价。
4. 学习Javascript数据结构与算法
这本书相对是一本冷门书。
为什么我会推荐他,是因为他能解决每个半路出家的js程序员都曾思考过的一些问题:
1. 我们的数组Array这么强大,要栈Stack,队列Queue这些功能少,半半拉拉的东西干什么呢?
2. 我们学的数据结构搞来搞去好像也就那些玩意,为什么被大家这么推崇,还要分门别类讨论呢?
所以这本书只是为何告诉你上面这些问题的答案:
1. 栈和队列本来就没有Array功能强。没有Stack和Queue类只是因为ES5不去实现它而已。作为一种相互之间存在一种或多种特定关系的数据集合,其存在意义是不应该被其功能强大与否来决定的。
2. 数据结构和编程语言无关。语言死了,他们会在下一门语言里重生。哪怕计算机死了,他们都会在下一个概念体里重生。
阅读建议:
跟着书本把这里面的结构全部敲一遍,快的话一天就能搞定。
从此你便再不怕惧怕js相关的简单数据结构问题。
但是,遇上高级的树,图等问题该跪还是要跪。因为这本书虎头蛇尾,后面的高级点的数据结构介绍的不够深。
适合经常反思“它从哪里来,要到哪里去?”的js程序员,或后悔以前数据结构没好好学的前端同学。
5. JavaScript设计模式与开发实践
我认为腾讯AlloyTeam的这本书对我帮助媲美高程三。
那时候我恰好换公司,从原来的开发方式切换成另一种完全不同的开发方式,让我很不适应。
这本书及时的蹦出来,他拿实际的应用场景举例,告诉你不同js项目里如何共通设计模式,还极其详细的介绍了函数的高级用法,能让你对js高阶函数的认知上升一个台阶。
难能可贵的是他还拿java作为静态语言的类比。从语言统一高度来给你分析这些问题。
和上本介绍数据结构的书一样,这本书有的放矢,能完美的解决对js设计模式有疑问的同学的实际问题。
他比上本书更深刻,更易读,也更贴近实践。
阅读建议:
这是本适合反复阅读的书籍。
如果你的思路能根据应用场景自动切换到最适合的设计模式,说明你已吃透这本书了。
6. 高性能JavaScript
作为Orelly唯一一本我确实认可的javascript相关的书。作为Orelly唯一一本我确实认可的javascript相关的书。
他摒弃了Orelly系列所有我不喜欢的特点:
老外的聊天说教式阅读体验,样例不够丰富,排版单一,破事水等。
他的优点如下:
1. 情景丰富,基本涉及所有js性能优化的场景。还会给出不同场景的实际测试数据,真实可信。我们在阅读这些场景实例的同时也丰富了自己js的使用经验。
2. 给出了很多看似"旁门左道"的解决方案,而这些冷门的解决方案恰恰是有些人死活百度不到的真正能解决问题的最优解。
3. 在说问题的同时说原理,深入浅出,游刃有余。所以这本书不仅仅是一本介绍js性能相关的书,而是一本涉及浏览器原理,js解析原理,用户体验等知识的javascript最佳注解。
阅读建议:
建议和高程三一起看,可以算是高程三阅读的最佳伴侣。
高程三告诉你“他叫什么,他什么样”,
这本书就告诉你“他为什么”,“他该怎样”。
所以,当别人还在为某些问题绞尽脑汁的时候,你已经从起点上干翻他们了。
7. 你不知道的JavaScript(YOU DONT KNOW JAVASCRIPT)
大名鼎鼎的Github开源的书籍。大名鼎鼎的Github开源的书籍。
为了他的名气我也得买一本实体书来拜读下。
这本是上卷,只涉及作用域和闭包,this和对象原型两部分。
不过其深入程度是其他js书籍难以企及的。
可以说,这已经是大部分前端程序员对js语法可以深入了解的最底层了,再往下就直面编译原理了。