学编程,来源栈;先学习,再交钱
当前系列: 编程语言 修改讲义

这一章节我是硬着头皮讲的。因为:

  • 我怕说JavaScript的不好会被喷……
  • 我说的那些JavaScript的槽点初学者get不到


搬个大神出来镇楼

JavaScript语言精粹

JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,也证明了它其实是一门优秀的语言。PS:我一直记得这不是最初的版本,中文翻译是《Javascript语言的精粹和糟粕》

那多少精粹多少糟粕呢?


JavaScript的糟粕

我简单的总结一下(在同学们漫长的职业生涯中,一点一滴的体会):

埋雷

错误不是暴露出来,而是“想当然”的处理,埋下一颗一颗的地雷。比如,假设我们有这样一行代码:

var result = score - 10;

因为种种原因(用户输入错误,或者代码bug),score中存储的不是一个数值,而是一个文本值,比如空字符串(' '):

  1. 如果是C#或Java,首先在代码的开发过程中就要求指明score的类型,如果score的类型不是数值,编译都无法通过;(强类型编译时检查)
  2. 其他弱类型语言,即使是允许score装文本值,但在进行运算的时候,会发现将一个空字符串和10相减,是不合逻辑的,是不能自行处理,就会报错:通知开发人员检查
  3. 但JavaScript呢?默默的给出一个结果-10

@想一想@:哪一种处理方式最好?为什么?

记住:问题越早暴露越好,越早越好。

PS:初入职场的同学,千万不要犯JavaScript的错误!

  • 客户交代的需求,有不明白的,模糊的,提出来;
  • 执行领导安排的工作,没搞明白的,执行的过程中出现了问题,一定要及时报告。

自由和灵活

如果是其他语言,变量必须:

  • 先声明(并且赋值),后使用
  • 声明时使用var标注,赋值时不能带var
    var score = 98;
    alert(score);
    
    score = 100;

但是JavaScript呢?(演示

这就是很多开发人员说的JavaScript的自由灵活。但这就真的好么?

复习:Java对C++的删改

逻辑混乱

例子不胜枚举!JavaScript学到后面,有一堆让你头痛的东西:闭包、原型链、this……,但这不是你的问题,而是JavaScript本身的问题:缺乏逻辑自洽!

有哪些明明是 bug,却被说成是 feature 的例子?

JavaScript里一堆一堆的就像撒了一个谎,就要用无数的谎来圆一样,要把bug解释成特性,难度也不是一般的大呀!o(╥﹏╥)o

举个最简单的例子:

var result = "abc"-2;    //会将NaN(Not a Number)赋值给result,OK,将就吧,那么:
result == NaN;    //false?what?   
result != NaN;    //true,哪位大神给解释下为什么?
12 == NaN;    //无计可施……
'ABC' == NaN

好吧,JavaScript站出来说:不要用==和!=来判断一个变量是不是NaN,我们提供一个isNaN()的方法,如果true的话,就是不是一个数值(我没写错,翻译过来逻辑就这样的)……

isNaN(result)  //好像没问题
isNaN(12)  //false,转个弯还能理解
isNaN('12')  //你猜
isNaN('')    //你再猜

怎么定义/解释isNaN()的确切含义?判断能否用作数值计算的?要记得''-10=-10哟。但是:

isNaN({})    //true,{}不能做为数值运算
{}-10    //-10,直接疯掉了……


还有一些完全没法洗的小bug,比如年日都从1开始算,就月从0开始算……

最担心的事

入鲍鱼之肆,久闻而不知其臭。

或者,“没有对比,就没有伤害!”

为什么我一直强调不要只学前端?我很担心初学者一开始接触的就是JavaScript,然后就染上了这种稀里糊涂写代码的毛病,甚至认为:

“这样挺好的呀!(字符串和数值)C#/Java里面还要做类型转换才能运算,JavaScript直接就可以比较,灵活!赞一个……”

三观都坏了,就没救了。


历史

那为什么JavaScript这么一个鬼样子呢?

生于仓促

1995年,网景公司的Brendan Eich(甚至有人说那时候他是才进公司的实习生?)在两周之内设计出了JavaScript语言:所以JavaScript先天不足,缺陷很多。

JavaScript之父对JavaScript的评价:

与其说我爱Javascript,不如说我恨它。它是C语言和Self语言一夜情的产物……

和Java的关系?NO,NO,NO,就北大青鸟和北大的关系一样 —— 完全没有关系,就是蹭Java的热点。

但是,这个“娘不在(网景就被1998年11月,网景被AOL收购爹不爱”的孩子,最终成为前端霸主!为什么呢?

因为没得选:在Web世界里,只有JavaScript能跨平台、跨浏览器驱动网页,与用户交互。

兴于风口

说来话长,姑妄听之:

  • 首发优势:最开始是一头风口上飞上天的猪,但现在因为飞得太久太久,都已经进化出翅膀来了!
  • ECMAScript标准:浏览器大战,神仙打架,凡人遭殃。JavaScript本来就生于仓促,里面一大堆的bug和各种不友好,现在还要个个浏览器不兼容……疯了疯了!已经广泛流行的JavaScript亟待标准化。几大厂商同意,由ECMA(European Computer Manufacturers Association)组织定制了JavaScript语言的标准。
  • 微软一直zuo:只支持IE的JScript,VBScript,微软就一直干这种事……(复习:.NET core被迫开源跨平台)
  • 大厂力推:Google/Morizza,不断完善:Firebug(IDE)、V8引擎(使其能够直接操作 I/O)、 ChomeOS(用浏览器代替操作系统)
  • Ajax:一种局部页面刷新的技术,造就了富前端。
  • node.js:超越浏览器,进军后端!虽然惨淡收场,但却奠定了大前端的基础
  • 移动端时代:再一次站在风口

未来:

飞哥个人看好TypeScript(由C#之父领导),废除其弱类型特性,未来JavaScript最有可能的替代者!(美好愿望,^_^)


语言特性

JavaScript是主要运行在浏览器中的解释型的编程语言。(编译解释的区别详见后文)

JavaScript的解释器:一般就是浏览器(例外:V8和node.js)。

大杂烩

面向过程:C语言家族风格

函数是JavaScript的一等公民:回调和事件,把函数玩得贼溜!

弱弱的面向对象:装而不封、模拟继承、天然多态

小匕首

  • 单线程
  • 单薄的工程化支持(匕首锯大树)

缝缝补补

  • 1998年6月,ECMAScript 2.0版发布
  • 1999年12月,ECMAScript 3.0版发布
  • ECMAScript 4.0呢?没有,因为大家一直吵……吵到散伙,^_^
    由于会议的气氛,该版本的项目代号起名为Harmony(和谐)
  • 直到2009年12月,ECMAScript 5.0版才正式发布。
  • 2015年6月17日,ECMAScript 6发布正式版本,即ECMAScript 2015

其中,ES5和ES6是最具历史意义的两个版本。

  • ES5目前已经被现代浏览器普遍支持
  • ES6大量的修复/缓和之前的种种缺陷,试图让JavaScript承担起工程化、规模化开发的职责


课程设计

基于JavaScript的特点,我们将其分成两个部分:

基础段

JavaScript入门,包括最基本的:

  • 面向过程部分:变量/分支循环/函数
  • 常用内置对象
  • BOM
  • DOM:增删改查
  • 事件
  • Ajax
  • JQuery及其插件

以能使用JQuery及其相关插件为教学目标。

ES进阶

添加ES6模块化、工程化部分内容,以能熟练应用大前端框架vue.js为教学目标。

学习笔记
源栈学历
键盘敲烂,月薪过万作业不做,等于没学

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 编程语言 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码