正确理解JavaScript

过去几年我注意到技术圈一个很奇怪的现象,有太多程序员将那些他们只是有过非常浅显的了解, 但其实根本就不懂的技术写到他们的简历中,这个现象几乎每种语言都有,但这其中最严重的就要数javascript了。

你不知道你不懂

出现这种状况的一个很大的原因就是现如今几乎每个开发者的工作都或多或少要依赖于javascript, 但大多数人并不真的理解这门语言,他们常用的学习方式是复制粘贴,使用这种方式, 你永远不会真正学会这门语言,而只能得到一个你已经懂了的假象。

根据我过去几年学习和使用javascript的经验,在你了解之前,你不会知道你其实不懂, 这听起来有点绕,你真正需要的就是有个人来告诉你你其实不懂,你需要全面系统的学习。 我经常面试一些自豪的将javascript列在他们简历中的家伙,但他们通常也就只能做个简单的onClick处理或是表单验证。 使用jQuery或者Dojo这样的框架当然没什么问题,但是除非你能了解隐藏在这些框架之后的javascript技术, 否则你不可能真正的掌握这些工具包的能量所在,下面就是我划分的从低到高的javascript知识点, 分为基础,中级和高级3个部分,看看你知道多少:

javascript的基础知识

  • 知道基本的编程语法,比如循环,判断,try/catch等等 * 理解包括多种函数定义以及赋值的方式,包括匿名函数
  • 理解基本的命名空间,全局(window)空间以及对象空间(不包括闭包)
  • 理解上下文的角色以及this变量的使用 * 理解各种对象以及函数的初始化和声明方式
  • 理解javascript比较操作符,如<, >, ==, ===,以及对象和字符串比较的原理和对象映射 * 理解对象属性和函数的数组索引,以及这和真实的数组之间的区别。

javascript中级知识

* 理解定时器,以及它的工作原理,包括何时以及如何使用定时器来异步执行方法调用

  • 关于回调的深度支持,以及如何通过call和apply方法来控制上下文和函数参数传递
  • 理解JSON标记以及eval函数 * 理解闭包以及他们如何影响你的代码效率
  • AJAX以及对象序列化

javascript高级知识点

  • 理解方法的”arguments’变量,包括如何使用它来通过arguments.length重载函数,以及通过arguments.callee来进行递归调用,需要注意使用这个特性有一定的危险性,因为ECMAScript 5 的Strict模式不支持此功能,但jQuery和Dojo都用到了它。
  • 高级闭包比如 self-memoizing函数,partially applied函数,以及最可爱的 (function(){})()调用。
  • 函数以及HTML prototype,prototype chain,以及如何使用基本的javascript对象和函数(比如Array)来简化代码。
  • 对象类型以及instanceof的使用 * 正则表达式和表达式编译
  • With语句以及为什么不要使用它们 * 最困难的部分,知道如果利用所有这些工具,并产生处干净,整洁,健壮,快速,可维护以及兼容不同浏览器的代码。

这里的最后一点特别重要并且也是最难实现的,因为javascript天生不够严格的语法, 你的程序很容易就会变成意大利面条式的难以维护的灾难代码,一旦你开始学习javascript语言本身, 你只能通过在大型的Web程序中不断实践才能真正掌握它,这可能要花好几年的时间, 并且你没法从书本上学到这些,我自己每天使用javascript好几小时,已经好几年了, 但我还是在不断寻找更好的方式来编写和重构我的代码,出于这个原因,一开始就使用jQuery这样的框架会很危险, 它会很容易让你的代码变得不可维护,Dojo的Class和Package系统则多少会帮上点忙。

考虑到javascript现在已经通过Node.js这样的项目渗透到了后端,我决定将和Web相关的部分单独拉出来讲讲, 也就是说,如果你想要在Web开发中使用javascript,那么下面这些就是每一个优秀程序员都应该了解的:

  • 如何高效的操作Dom(添加,删除以及更新),还有如何通过使用document fragments这样的工具来最小化浏览器的re-flows。
  • 夸浏览器的DOM元素属性提取(比如,style,position等等),jQuery和Dojo都可以很好的完成这些工作,尽管如此,理解从CSS和style标签中提取属性的差异,以及如何计算position和size还是很重要的。
  • 夸浏览器的事件处理,绑定,反绑定,冒泡,以及如何取得期望的回调上下文。在一次,现成的框架也可以很好的处理这些事情,但是你应该对IE浏览器和W3C标准浏览器之间的不同有所了解。
  • 正则表达式选取DOM节点 * 浏览器功能检测以及智能降级

就像你从上面的列表中看到的,对于javascript,除了alert(myval)或者myBtn.οnclick=…, 你还需要了解更多东西,这些都是粘贴复制无法学到的,只有通过阅读和练习, 你才能成为一名真正的javascript程序员。

这里推荐两本关于javascript的好书,”the good parts”和”javascript忍者的秘密”, 如果你只是为了装饰简历,我建议你至少也要搞懂基础阶段的那些知识点,并且至少尝试过中极阶段的那些技术。 一旦你发现当你开始自己开发你想要的功能,而不是从其他人那里拷贝粘贴时,你就可以宣称自己懂javascript了, 在那之前,请先别这样说。

如果我错过了什么关于javascript的概念,欢迎给我留言,同时也别忘了分享任何你关于JS或者其它语言的经验。

需要说明的是我并不是一个前端开发者,我实际上是一个后台开发者,但是因为形势需要, 渐渐变成了一个全协议栈的开发者,现如今,几乎每个后端开发者都需要了解javascript, 这也是我写这篇文章的目的,我并不是想表达我对javascript有多了解, 我只是想说javascript是一门非常强大和庞杂的语言,它远比你第一眼看到的要复杂

本文翻译自”You Don’t Know javascript”(http://www.w2lessons.com/2011/04/you-dont-know-javascript.html), 作者:Michael Woloszynowicz(http://twitter.com/mwbiz)。

转载于:https://www.cnblogs.com/HHJ-XX/archive/2013/04/28/3048841.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医疗机构远程视频监控集中管理,贝锐蒲公英提供一站式解决方案

上海某企业专业致力于医疗软件、家居智能化研发、设计、销售、集成及实施&#xff0c;企业主营业务之一为医疗软件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系统等方面的医院信息化建设。 在实际应用、部署过程中&#xff0c;需要实现各地区分院与总院间的数据库互相访问、视频数…

JAVA_Collection容器

因为项目的需要&#xff0c;今天抽时间把JAVA中的容器复习了一下&#xff0c;为了以后的不时之需&#xff0c;现在把它记下来。 容器有其名&#xff0c;知其意&#xff0c;用来盛放数据的集合&#xff0c;JAVA中为我们提供了三种容器类&#xff1a;set、list、map&#xff0c;三…

控制器中获取Field值

在ASP.NET MVC程序中&#xff0c;我们需要POST Data到制器中&#xff0c;是有很多方法。但是我们想在控制器中&#xff0c;获取Feild值呢&#xff1f;怎样获取&#xff1f;你可以留意到有一个类FormCollection。它能帮助到我们解决这个问题。 举个简单的例子。在ASP.NET MVC应用…

私有RTP协议和标准流媒体协议

先介绍下RTP协议&#xff1a; 实时传输协议RTP&#xff08;Real-time Transport Protocol&#xff09;是一个网络传输协议 &#xff0c;该协议详细说明了在互联网上传递音频和视频的标准数据包格式 。 RTP标准定义了两个子协议 &#xff0c;RTP和RTCP 数据传输协议RTP&#xff…

从WebRtc学习RTP协议

文章目录TCP为何不适用于实时音视频UDP->RTPRTP协议结构JittbufferRTP扩展头RTP填充数据参考TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的。按照TCP原理&#xff0c;当出现极端网络情况时&#xff0c;理论上每个包的时延可达到秒级以上&#xff0c;而且这种时延…

解决ListView异步加载数据之后不能点击的问题

在ListView的onScroll事件中执行异步加载数据&#xff0c;然后使用notifyDataSetChange()函数更新适配器&#xff0c;之后发现listView不能点击了&#xff0c;这问题苦恼了我半天。最后在一篇博文中发现调用listView的requestFocusFromTouch()函数终于解决了这问题。 Java代码…

从WebRtc学习RTCP协议

文章目录RTCP支持的消息类型RTCP协议头WebRTC的反馈报文RTPFB支持的报文类型&#xff1a;PSFB支持的报文类型&#xff1a;参考RTCP是RTP的控制协议.那么RTCP能对RTP做哪些控制呢&#xff1f;其中最为大家熟知的就是 丢包控制。发送端发送数据后&#xff0c;接收端如果发现有RTP…

无锁队列设计思路以及简要代码

文章目录非并发的一写一读环形队列多读多写环形队列非并发的一写一读环形队列 读指针&#xff1a; 1、先判断是否有数据 2、读取数据 3、操作指针 写指针&#xff1a; 1、先判断空间是否足够 2、写入数据 3、操作指针 所以代码也十分简单&#xff1a; bool putqueue(void* pDa…

CPU Cache对于并发编程的影响

文章目录引子CPU Cache对于并发的影响读写顺序对性能的影响字节对齐对Cache的影响小结引子 下面给出两个极其相似的代码&#xff0c;运行出的时间却是有很大差别&#xff1a; 代码一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

软工之初识

我们之前已经在完全不懂软件工程的情况下&#xff0c;已经做完了两个小系统&#xff0c;虽然能够运行&#xff0c;但其中有很多的问题&#xff0c;学习软工就是让我们在工程学原理的指导之下去开发和设计软件。 软件工程同大多数书讲的都是一样的&#xff0c;首先对软件工程有一…

perf +火焰图使用

以mysqld进程为例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

在一个字符串中找到第一个只出现一次的字符

题目&#xff1a;在一个字符串中找到第一个只出现一次的字符&#xff0c;如输入abaccdeff&#xff0c;则输出b&#xff1b;具体实现如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

零拷贝机制在文件传输中的使用手法

文章目录文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换零拷贝技术sendfilesendfile SG-DMAmmap writespliceDirect I/O经典应用文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换 如果服务端要提供文件传输的功能&#xff0c;最简单的方式…

POJ 3233 Matrix Power Series 矩阵快速幂 + 二分

题意&#xff1a;求矩阵的次方和 解题思路&#xff1a;最容易想到方法就是两次二分因为 我们可以把一段 A^1 A^2 .......A^K 变成 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) 当k 为奇数的时候 或者 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) A^K 当K 为偶数的时候…

时间序列进行分析的一些手法以及代码实现(移动平均、指数平滑、SARIMA模型、时间序列的(非)线性模型)

文章目录1、移动平均moving average方法weighted average方法2、指数平滑单指数平滑 exponential_smoothing双指数平滑三指数平滑 Triple exponential smoothing3、平稳性以及时间序列建模SARIMA模型4、时间序列的&#xff08;非&#xff09;线性模型时间序列的滞后值使用线性回…

三大平衡树(Treap + Splay + SBT)总结+模板

Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板&#xff1a; #include <cstdio> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath…

mysqld进程 ut_delay 占用率过高

采用性能分析工具perf top -p mysqld进程 在测试mysql数据库时&#xff0c;用perf top如果看到热点函数是ut_delay或者_raw_spin_lock的话&#xff0c;说明锁争用比较严重。 ut_delay这是innodb的一个自旋琐。也就是说&#xff0c;在这里由于锁等待&#xff0c;innodb不停地在…

滑动窗口在重构数据集的作用

step1&#xff1a;使用滑动窗口重构数据集 给定时间序列数据集的数字序列&#xff0c;我们可以将数据重构为看起来像监督学习问题。 我们可以通过使用以前的时间步作为输入变量并使用下一个时间步作为输出变量来做到这一点。 通过观察重构后的数据集与原本的时间序列&…

sliverlight - Unhandled Error in Silverlight Application错误

使用firebug控制台输出错误&#xff1a; Unhandled Error in Silverlight Application 查询“GetFlow_Process”的 Load 操作失败。远程服务器返回了错误: NotFound。 位于 System.ServiceModel.DomainServices.Client.OperationBase.Complete(Exception error) 位于 System.S…