换了几天将这本不厚的JavaScript介绍看了一遍,Douglas Crockford确实是js的大师,阅读目的主要是了解JavaScript的设计思想和一些主要的特性,事实看来不虚词读。
本文贴一些在阅读的时候记下的比较重要的JS语法和设计思想,闲暇时看一看可能会帮助自己更好地理解自己正在写的代码。原书中最后几章介绍的是js的一些不好的特性和需要避免使用的一些语法,我觉得也有必要读一读,虽然书名叫做js语言精粹。
JavaScript一些好的想法: 函数、弱类型、动态对象和一个富有表现力的对象字面量表示法、
* JS的函数是基于词法作用域的顶级对象
* 弱类型是自由的,无需简历复杂的类层次;
* 强大的对象字面量表示法,通过列出对象的组成部分,它们就能简单地被创建出来。 (JSON的灵感
* 原型继承,JS有一个class-free的对象系统,对象直接从其他对象继承属性
一个糟糕的选择:依赖于全局变量进行连接,所有便一单元的所有顶级变量被撮合到一个被称为全局对象的公共命名空间中。
Chapter 2 语法:
JS只有一个单一的数字类型,内部表示为一个16位的浮点数。
JS所有字符都是16位的,Unicode的字符集,没有字符类型,且字符串是不可变的。
不像许多其他语言,JS代码块不会创建一个新的作用域,因此变量应该被定义在函数顶端,而不是在代码块中。假:false; null; undefined; 空字符串; 数字0; 数字 NaN
字面量:是一种方便指定新对象的表示法,属性名可以使标识符或字符串,对象的属性在编译时才知道。
Chapter 3 对象:
JS中的对象是可变的键控集合,一切都是对象。
对象通过引用传递,永远不会被拷贝。
- 每个对象都被连接到一个原型对象,Object.prototype这个标准的对象。
- 反射: 检查对象并确定对象有什么属性;
typeof flight.number // 会检查原型链
hasOwnProperty // 不会检查原型链
减少全局对象污染:创建唯一的一个全局变量,把多个全局变量都整理在一个名称空间下。
Chapter 4 函数:
- 函数调用:
除了声明时定义的形式参数,每个函数接收两个附加参数 this 和 arguments。
JS中有四种调用模式:方法调用 构造器调用 函数调用 和 apply调用。 四种方式初始化this上存在差异。
*实际传递的参数个数与形式参数个数不匹配时不会产生运行时错误!! 传递参数时也没有类型检查。
方法调用:
当一个函数被保存为对象的一个属性时,我们称之为方法。 方法调用时,this被绑定到该对象。 即用. 或[] 调用时。 通过this可以获得所属对象上下文的方法称之为 公共方法。
var myObject = {
value: 0;
increment: function (inc){
this.value += typeof inc === ‘number’ ? inc : 1;
}
};函数调用:
函数并非一个对象的属性时,this被绑定到全局对象。
var sum = add(3,4);构造器调用:
var Quo = function (string){
this.status = string;
};
//构造一个新的Quo实例
var myQuo = new Quo(“confused”);
- Apply调用:
apply方法让我们构建一个参数数组并用其去调用函数,它也允许我们选择this的值。 apply接收两个参数,第一个被绑定给this,第二个是参数数组。
例:
var array = [3,4];
var sum = add.apply{null,array};
var statusObject = {
status: “A-ok”
}
//statusObject 并没有继承自Quo.prototype, 但我们可以再statusObject上调用get_status方法,尽管它没有一个名为get_status的方法。
var status = Quo.prototype.get_status.apply(statusObject);
* 函数被调用时会有免费赠送一个arguments数组,这使得编写一个无需指定参数个数的函数成为可能。 例如多个数相加,但不是特别有用,有其他方法实现。
给类型添加方法:
Function.prototype.method = function (name,func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
};
作用域: 内部函数可以访问定义它们的外部函数的参数和变量!
闭包: 在一个function的内部声明一个function就创造了一个闭包,闭包可以理解为一个指向内部函数的指针和一个指向函数上下文的指针。
理解JS:
函数是头等对象: 函数是有词法作用域的闭包。
基于原型继承的动态对象: 对象是无类别的,我们可以通过普通的赋值给任何对象增加一个新的成员元素。
对象字面量和数组字面量:
快捷键
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y
Markdown及扩展
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]
使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。
本编辑器支持 Markdown Extra , 扩展了很多好用的功能。具体请参考Github.
表格
Markdown Extra 表格语法:
项目 | 价格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒号来定义对齐方式:
项目 | 价格 | 数量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
定义列表
-
Markdown Extra 定义列表语法:
项目1
项目2
- 定义 A
- 定义 B 项目3
- 定义 C
-
定义 D
定义D内容
代码块
代码块语法遵循标准markdown代码,例如:
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
脚注
生成一个脚注1.
目录
用 [TOC]
来生成目录:
数学公式
使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.
- 行内公式,数学公式为: Γ(n)=(n−1)!∀n∈N 。
- 块级公式:
更多LaTex语法请参考 这儿.
UML 图:
可以渲染序列图:
或者流程图:
离线写博客
即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。
用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。
博客发表后,本地缓存将被删除。
用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。
注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱。
浏览器兼容
- 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下问题
- 不支持离线功能
- IE9不支持文件导入导出
- IE10不支持拖拽文件导入
- 这里是 脚注 的 内容. ↩