javascript总结感悟(javascript数据类型分类)
大家好,今天小编来为大家解答javascript总结感悟这个问题,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语法可以深入了解的最底层了,再往下就直面编译原理了。
如何提升JavaScriptWeb性能的技巧总结
Javascript性能优化绝不是一种书面的技术,Nicholas的技术演进列出了10条建议,帮助你写出高效的 JS代码
1.定义局部变量
当一个变量被引用的时候,JavaScript将在作用域链中的不同成员中查找这个变量。作用域链指的是当前作用于下可用变量的集合,它在各种主流浏览器中至少包含两个部分:局部变量的集合和全局变量的集合。
简单地说,如果JavaScript引擎在作用域链中搜索的深度越大,那么操作也就会消耗更多的时间。引擎首先从 this开始查找局部变量,然后是函数参数、本地定义的变量,最后遍历所有的全局变量。
因为局部变量在这条链的起端,所以查找局部变量总是比查找全局变量要块。所以当你想要不止一次地使用一个全局变量的时候,你应该将它定义成局部变量,就像这样:
改写成
2.不要使用 with()语句
这是因为 with()语句将会在作用域链的开始添加额外的变量。额外的变量意味着,当任何变量需要被访问的时候,JavaScript引擎都需要先扫描with()语句产生的变量,然后才是局部变量,最后是全局变量。
So with() essentially gives local variables all the performance drawbacks of global ones, and in turn derails Javascript optimization.因此with()语句同时给局部变量和全局变量的性能带来负面影响,最终使我们优化JavaScript性能的计划破产。
3.小心使用闭包
虽然你可能还不知道“闭包”,但你可能在不经意间经常使用这项技术。闭包基本上被认为是JavaScript中的new,当我们定义一个即时函数的时候,我们就使用了闭包,比如:
document.getElementById('foo').onclick= function(ev){};闭包的问题在于:根据定义,在它们的作用域链中至少有三个对象:闭包变量、局部变量和全局变量。这些额外的对象将会导致第1和第2个建议中提到的性能问题。
但是我认为Nicholas并不是要我们因噎废食,闭包对于提高代码可读性等方面还是非常有用的,只是不要滥用它们(尤其在循环中)。
4.对象属性和数组元素的速度都比变量慢
谈到JavaScript的数据,一般来说有4种访问方式:数值、变量、对象属性和数组元素。在考虑优化时,数值和变量的性能差不多,并且速度显著优于对象属性和数组元素。
因此当你多次引用一个对象属性或者数组元素的时候,你可以通过定义一个变量来获得性能提升。(这一条在读、写数据时都有效)
虽然这条规则在绝大多数情况下是正确的,但是Firefox在优化数组索引上做了一些有意思的工作,能够让它的实际性能优于变量。但是考虑到数组元素在其他浏览器上的性能弊端,还是应该尽量避免数组查找,除非你真的只针对于火狐浏览器的性能而进行开发。
5.不要在数组中挖得太深
另外,程序员应该避免在数组中挖得太深,因为进入的层数越多,操作速度就越慢。
简单地说,在嵌套很多层的数组中操作很慢是因为数组元素的查找速度很慢。试想如果操作嵌套三层的数组元素,就要执行三次数组元素查找,而不是一次。
因此如果你不断地引用 foo.bar,你可以通过定义 var bar= foo.bar来提高性能。
6.避免 for-in循环(和基于函数的迭代)
这是另一条非常教条的建议:不要使用for-in循环。
这背后的逻辑非常直接:要遍历一个集合内的元素,你可以使用诸如for循环、或者do-while循环来替代for-in循环,for-in循环不仅仅可能需要遍历额外的数组项,还需要更多的时间。
为了遍历这些元素,JavaScript需要为每一个元素建立一个函数,这种基于函数的迭代带来了一系列性能问题:额外的函数引入了函数对象被创建和销毁的上下文,将会在作用域链的顶端增加额外的元素。
7.在循环时将控制条件和控制变量合并起来
提到性能,在循环中需要避免的工作一直是个热门话题,因为循环会被重复执行很多次。所以如果有性能优化的需求,先对循环开刀有可能会获得最明显的性能提升。
一种优化循环的方法是在定义循环的时候,将控制条件和控制变量合并起来,下面是一个没有将他们合并起来的例子:
for( var x= 0; x< 10; x++){
};当我们要添加什么东西到这个循环之前,我们发现有几个操作在每次迭代都会出现。JavaScript引擎需要:
#1:检查 x是否存在
#2:检查 x是否小于 0(译者注:我猜这里是作者的笔误)
#3:使 x增加 1
然而如果你只是迭代元素中的一些元素,那么你可以使用while循环进行轮转来替代上面这种操作:
如果你想更深入地了解循环的性能,Zakas提供了一种高级的循环优化技巧,使用异步进行循环(碉堡了!)
8.为HTML集合对象定义数组
JavaScript使用了大量的HTML集合对象,比如 document.forms,document.images等等。通常他们被诸如 getElementsByTagName、getElementByClassName等方法调用。
由于大量的DOM selection操作,HTML集合对象相当的慢,而且还会带来很多额外的问题。正如DOM标准中所定义的那样:“HTML集合是一个虚拟存在,意味着当底层文档被改变时,它们将自动更新。”这太可怕了!
尽管集合对象看起来跟数组很像,他们在某些地方却区别很大,比如对于特定查询的结果。当对象被访问进行读写时,查询需要重新执行来更新所有与对象相关的组分,比如 length。
HTML集合对象也非常的慢,Nicholas说好像在看球的时候对一个小动作进行60倍速慢放。另外,集合对象也有可能造成死循环,比如下面的例子:
这段代码造成了死循环,因为 ps表示一个实时的HTML集合,并不是你所期望的数组。这种实时的集合在添加<p>标签时被更新,所以i< p.length永远都不会结束。
解决这个问题的方法是将这些元素定义成数组,相比只设置 var ps= document.getElementsByTagName(‘p')稍微有点麻烦,下面是Zakas提供的强制使用数组的代码:
9.不要碰DOM!
不使用DOM是JavaScript优化中另一个很大的话题。经典的例子是添加一系列的列表项:如果你把每个列表项分别加到DOM中,肯定会比一次性加入所有列表项到DOM中要慢。这是因为DOM操作开销很大。
Zakas对这个进行了细致的讲解,解释了由于回流(reflow)的存在,DOM操作是非常消耗资源的。回流通常被理解为浏览器重新选渲染DOM树的处理过程。比如说,如果你用JavaScript语句改变了一个p的宽度,浏览器需要重绘页面来适应变化。
任何时候只要有元素被添加到DOM树或者从DOM树移除,都会引发回流。使用一个非常方便的JavaScript对象可以解决这个问题——documentFragment,我并没有使用过,但是在Steve Souders也表示同意这种做法之后我感觉更加肯定了。
DocumentFragment基本上是一种浏览器以非可视方式实现的类似文档的片段,非可视化的表现形式带来了很多优点,最主要的是你可以在 documentFragment中添加任何结点而不会引起浏览器回流。
10.修改CSS类,而不是样式
你也许听说过:修改CSS类必直接修改样式会更高效。这归结于回流带来的另一个问题:当布局样式发生改变时,会引发回流。
布局样式意味着任何影响改变布局的变化都会强制引起浏览器回流。比如宽度、高度、字号、浮动等。
但是别误会我的意思,CSS类并不会避免回流,但是可以将它的影响最小化。相比每次修改样式都会引起回流,使用CSS类一次修改多个样式,只需要承担一次回流带来的消耗。
因此在修改多个布局样式的时候,使用CSS类来优化性能是明智的选择。另外如果你需要在运行时定义很多歌CSS类,在DOM上添加样式结点也是不错的选择。
javascript中几个容易混淆的概念总结_javascript技巧
1.
这里的getName()方法只简单地返回this.name的值。以下是几种调用object.getName()的
方式以及各自的结果。
object.getName();//"My Object"
(object.getName)();//"My Object"
(object.getName= object.getName)();//"The Window",在非严格模式下
第三种情况下(object.getName=object.getName);等价于var fn=(object.getName=object.getName);fn();
2.
JavaScript从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不
见(不过,它会执行后续声明中的变量初始化)。匿名函数可以用来模仿块级作用域并避免这个问题。
3.
这段代码会导致语法错误,是因为JavaScript将function关键字当作一个函数声明的开始,而函
数声明后面不能跟圆括号。然而,函数表达式的后面可以跟圆括号。要将函数声明转换成函数表达式,
只要像下面这样给它加上一对圆括号即可。
4.
在这个重写后的outputNumbers()函数中,我们在for循环外部插入了一个私有作用域。在匿名
函数中定义的任何变量,都会在执行结束时被销毁。因此,变量i只能在循环中使用,使用后即被销毁。
而在私有作用域中能够访问变量count,是因为这个匿名函数是一个闭包,它能够访问包含作用域中的
所有变量。
这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。
一般来说,我们都应该尽量少向全局作用域中添加变量和函数。在一个由很多开发人员共同参与的大型
应用程序中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员既可
以使用自己的变量,又不必担心搞乱全局作用域。例如:
把上面这段代码放在全局作用域中,可以用来确定哪一天是1月1日;如果到了这一天,就会向用
户显示一条祝贺新年的消息。其中的变量now现在是匿名函数中的局部变量,而我们不必在全局作用域
中创建它。
好了,文章到这里就结束啦,如果本次分享的javascript总结感悟和javascript数据类型分类问题对您有所帮助,还望关注下本站哦!