Skip to content

Instantly share code, notes, and snippets.

@eccstartup
Last active August 29, 2015 14:02
Show Gist options
  • Save eccstartup/af821383664c0be26d98 to your computer and use it in GitHub Desktop.
Save eccstartup/af821383664c0be26d98 to your computer and use it in GitHub Desktop.

##Javascript

###记录

首先,之前有人提到JS语言适合不适合入门?

其实……这个问题并不是太关键,毕竟这里已经接触过编程的人还是很多的

那么,大家的意见如何呢?

好了,总之静琴个人觉得JS语言入门不如 Python ,因为 Python 坑比较少

但是呢,确实学JS可以让大家一开始就能在很多地方用得上

比如说,之后可以做NodeJS服务端,或者写网页

JS 这一点既是优点也是缺点啦……缺点就是大家很可能会急于求成,还没有学习好语言本身就想要学习太多的东西,甚至把jQuery当JS学

jQuery 是JS操作网页的一个库,语法比较简便,但与经常用的JS交集比较少啦。从jQuery 入门会错过很多JS 的基础概念和语法

嗯,之前也有人提到JS的面向对象,说JS的面向对象与其他语言有很大的不同

不过并不是说JS的面向对象不好,只是比较特殊,各有特点吧

学习JS不会影响大家对于面向对象的理解的,请放心

很多人认为JS的语言不如其他语言,这种想法还是误解比较多……

JS语言很成熟,很有表现力,虽然有不少坑但是还是能绕开的

套用我们常见的语言分类模式来说,JS是脚本语言、面向对象、命令式和函数式的

脚本语言的意思是什么呢?是指JS是基于语言的解释器吗?

应该是说不是像C一样的编译语言吧……

面向对象是说JS中存在对象的概念,而对象是数据(各种类型)和行为(代码)的组合

JS的对象并不是基于类的,而是更偏向于基于原型的,这是和 C++ Java 等语言不同的地方

之后的交流中我们也会专门花时间来认识JS的原型

另外JS也是动态类型的,其变量类型可变,是那样的吧

JS和Python一样是属于 duck-typing 的模式。也就是说访问一个对象并不需要确定对象的类型,而是只要对象拥有合适的方法和属性就能访问

这里可能讲的深奥了一点,没有懂的请直接跳过上面这句话吧

JS的应用领域包括网页(浏览器)、服务器(NodeJS)等

在有些需要允许执行脚本的环境(比如用户自定义行为)也能有很好的应用

当然,JS能做什么事情取决于环境

JS语言本身规定的内容,对于系统库的要求很少,只有几个基本类型和内置对象

那些浏览器相关的API,都是由其他的标准制定

JS的规范文档写的非常难懂……

不过还好规范很清晰明确,很少存在因为理解或者实现而产生的差异

就连JS最坑的类型转换和相等,也全部都是有规范可参考的

在ES5规范中,JS添加了不少特性,目前语言本身的功能不比主流语言弱

但是呢,它还是受限于环境,比如无法操作硬件之类的,因此并不是所有地方都能用

JavaScript 语言的内存是由执行环境负责。因为该语言不提供指针,所以不能操作具体的存储

需要用到外部资源的时候,系统可以提供一些JS对象用来管理和操作外部资源

能操作文件吗?这取决于执行环境

NodeJS环境可以操作任意文件。而浏览器环境下只能操作用户上传的文件,和提供文件下载,不能读写磁盘

NodeJS是一个执行环境,浏览器是另一个执行环境

上次还遇到了一个Minecraft插件允许用户写自己的脚本来自定义行为,但是那个执行环境很受限制,所以只能做一点简单的计算

为JS提供执行、系统库等的称为一个环境

这只是个大概的说法

不同内核下,如果都是Chrome的网页,执行环境可以认为是相同的

因为没有大的差异

环境一般都是C/C++等编译语言提供的……而且C/C++和系统联系紧密,可以用于实现文件操作等底层功能,然后提供给JS使用

对象,就是指两个一组的大象。是两个生命体

一般公象和母象合成为对象

不愿意多讲对象,先谈谈别的吧……

好吧,JS中一个很重要的概念就是函数,函数很有用,当做很多东西来用

比如当做其他语言的类、方法或者什么的

总之就是函数万能……JS一个函数能当其他语言的几个概念来用,不过这都是后话了

JS语言的本质是单线程的,但也可以将一部分代码在其他线程执行

在一个JS线程中,用户编写的任何代码都是按线性运作的,但同时系统可以把一些系统操作在其他线程执行

比如说,可以先让系统去抓取某网站内容,但同时JS本身还在计算一些比较复杂的数学计算

但是,同一个JS线程中的两段JS代码不可能同步执行

为了实现这个目标,系统需要在网页抓取完毕后再通知JS,具体方式略

通知全部都是排队的,只有当用户的一段JS代码执行完毕,把控制权还给环境时,才能再收到通知

收到的这个通知当然应对方式是执行另一段JS代码,来处理结果

当然也有人称这个为异步执行

不,环聊卡只是谷歌技术差

异步执行的效率还是很不错的,一个线程可以当做其他语言的很多个来用,以NodeJS为例

在JS代码处理请求的同时,NodeJS环境可以执行其他的系统调用什么的

这好比一个业务员,在处理完一个顾客的请求以后,就交给上级审批,然后再处理下一个顾客的请求,而等审批结束后,再等忙好手头的事情,再处理审批的结果

结果就是,一直在忙,而不是在等

而其他语言经常出现的一个现象就是,在进行系统操作的时候,语言本身的执行暂停,来等那个操作处理完毕再继续

嗯,称为同步

所以一个简单的ASP.NET C#服务器可能需要对每一个请求建立一个线程,然后让系统来调度线程

从而同时处理多个请求

总之静琴觉得JS的异步更加适合人类啦,毕竟人要吃饭喝水,不能总在等一件事

但是同步更容易写,因为不需要考虑先后问题,只要等着就好

不,JS是不能一边刷牙一边吃饭的……

它只能在你把事情拜托别人的时候,自己去做点别的

比如在等考试分数出来的时候,自己先去玩

等分数出来了再参加补习班

总之,这就是JS语言的特点了啦

总结来说JS语言的设计还是很不错的,希望将来能够大有作为

那么,大家对JS还有什么印象吗?正确的或者错误的都可以,一起来探讨吧

JS的原型是比较难的……

首先,静琴先声明这里是JS环境,只能单线程讨论

提出多个问题的场合,只能先讨论第一个

禁止同时讨论多个问题

JS的原型继承比类好用,更适合JS

原型继承的概念是很简单的,一个对象是在另一个对象的基础上修改而来的,不修改的内容,就和原对象完全相同

而类继承的概念则是,一类对象是从另一类对象上修改而来的,而一个对象是属于某一类

也就是说,继承的是具体的对象,还是抽象的一类对象这样的区别

JS因为没有类,所以当然偏爱原型继承

哦对了,澄清一下JS和Java没任何关系,只是名字长得像

好了,原型继承的概念确实是比较独特的,其他语言类继承多一点

哦,对了“物件导向”是“面向对象”的另一种说法

嗯……举一个简单的例子?那一定不是格式刷的例子

比如说类继承的概念是人是一种动物,也就是说人类继承动物类,而具体的某个人属于人类,单个人的所有行为来自人类,而人类的行为来自动物类,并做一定修改,从而实现人是动物

原型继承的概念不同于复制

而比如说,我填写了一个表格,其中姓名等信息填写了,其他的留空,再注明未填写的与某份别的表格相同

JS语言在处理的时候,会先看有没有填写,如果没填写,则去找那份作为参考的表格

可以添加和修改,但是删除就相当于留空,所以会寻找到原先的那份原型

是的, JS 的原型查找需要一层一层查找上去,效率真的比较低

没找到某个属性,就要沿着原型、原型的原型一直上去

但是找到的话,就马上终止

嗯……那么不多说了,就是这样了,原型的话题结束吧

下面的话题是,JS调试痛苦

这显然是错觉,你们都被步进调试器毒害了,已经学不会 console.log 那么高级的方法了

当然,想要步进调试可以用 Chrome 那个开发者工具,不仅是网页,也能用于调试 NodeJS

以静琴的开发经验来说,JS真心比C好调试太多太多

如果没有反对的话就下一个话题吧?

C一出错就崩,想要调试需要编译调试符号,有时候还需要gdb

JS 的 console.log 比 printf 好用,什么都能输出

包括复杂类型和HTML元素

那些喜欢设置断点的各位,在JS里加一行 debugger; 就是断点了

Chrome 开发者工具进入断点的时候,那个 Console 控制台可以在当前环境下执行任何代码,包括查询变量值或者函数调用

就像直接写进去一样

但是加了断点怎么让浏览器重新运行呢?(我觉得我说得好模糊……

刷新就是了……

想要在运行时添加断点,用 Chrome 那个 Sources 地方按一下行号就添加了

Chrome 插件最近把所有地方的 console.log 放一起了

这是题外话了

好了, Firebug 当然是可以的

或者说Chrome 的 F12 抄 Firebug

但是 Firebug 有一个问题,想要启用调试器必须刷新一次页面

而 Chrome 可以直接开调试器

其他还有什么对于JS的见解或者误解吗?

一个一个来,先是类似的语言

浏览器争论的问题不用说了……

Firebug 卡是 Firefox 的一个 bug ,估计已经修了

能编译成JS的语言很多

Coffee 只是其中之一

Dart 算一个

如果排除能编译成JS的语言的话,那么和JS语言类似的也不好

但没有一个有JS这么广阔的应用

这也就是为什么很多语言还是选择编译成JS

ECMAScript 是 JS 的规范化,而 JS 可以指 ECMAScript ,也可以指一种方言

也可以指带有浏览器支持的环境

这个问题带过吧……没必要多讨论了

Python 别讨论了,够了

ActionScript 是 ECMAScript 的方言

广义上来说这些都是JS

Dart 和 JS 的比较嘛……可以谈一下

Dart 的面向对象传统一点,但是不那么传统的一点是可选类型吧

其他和JS差不多……和JS 的 interop 太差,不喜欢

语言没用,重要的是别的

静琴语文不好,说不出是什么

这里预定是JS语言的讨论,不过竟然变成工资了,有点吃惊

还有任何关于JS语言的看法吗?

一些常见的JS的说法,比如JS适合什么不适合什么,能做什么不能做什么,也可以来讨论

环聊的JS卡,是因为谷歌的技术差

因为谷歌根本不会写JS,只能用Java编译成JS

总体来说,谷歌的技术急需提高

首先谈嵌套吧

JS就这样的,不爱用就别用

另外推荐大家用2格缩进,否则看起来确实太累

压缩的 JS代码应该配合 source map 使用

如果没有,只能格式化了,但变量名还是没有回来

Chrome 的 Sources 左下角有一个 {} 的图标,点一下就好

静琴用 vim ,但是这并不是推荐

JS 的缩进,其主要问题在于不仅是语句块会缩进

主要问题是任何匿名函数,都会增加缩进

而JS里面回调那么多,所以当然会越写越向右

解决方法是把匿名函数赋值给变量

但这不解决本质问题

真正能称为解决方案的,只有 promise 和 continuation

promise ,是指一个函数不要接受匿名回调函数,而是返回一个可以用于跟踪状态的对象,在那个对象上再使用回调

比如 var request = get("http://www.google.com/");

然后 request.then(function (data) { ... });

continuation 是指看上去像是同步,而其实是回调的写法

比如 wind.js ,大家可以课后了解

嗯,那么就这样吧,缩进太多的问题就这么解决吧

下一个问题啦

只要是和JS语言有关的哲学或者认识都可以啦

关于回调问题,看不懂请无视,不影响

今天的目标就是让大家在学习JS之前,对JS有一个大概的认识

闭包还是再……晚一点吧

今天说这个太早了

再扯数学上的概念就别了……只是名字相同

英文词汇量那么少,所以大家都是反反复复用那么几个词

习惯就好

另外有一个误会是 JS 不区分类型

其实不是那样的,就算是说弱类型或者动态类型,也不等于没有类型或者类型随意转换

JS 的类型转换其实很少发生的……

JS不区分整数和浮点数,之前说过的

嗯…… !!foo 用于转换到bool类型吧(还没讲到)

~~bar 用于转换到整数

首次赋值也不确定类型

赋值后的变量也没什么特别的

它可以存储某一个类型的值,但是其本身还是没有类型了,或者说不限定存储什么

也就是说第一次赋值一个字符,第二次赋值一个数完全不影响?

是的,改变类型也没关系的

都说了这次主要是整体认识,一些没见过的听不懂真的没什么

这并不是正式的语法交流啊……只是语言本身的讨论

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment