##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 用于转换到整数
首次赋值也不确定类型
赋值后的变量也没什么特别的
它可以存储某一个类型的值,但是其本身还是没有类型了,或者说不限定存储什么
也就是说第一次赋值一个字符,第二次赋值一个数完全不影响?
是的,改变类型也没关系的
都说了这次主要是整体认识,一些没见过的听不懂真的没什么
这并不是正式的语法交流啊……只是语言本身的讨论