Javascript 学习心得

这几天做 Ajax,顺便研究了一下 Javascript,发现以前对 Javascript 是完全不了解=.=

总结如下(以下简称 Js):

1、Js 中没有 Class,只有 Function,一个 Function 可以看成一个类的构造函数,new Function 即 new Class。每个 Function 有一个对象prototype,new Function 的时候,自动把这个 Function 的 prototype 复制到新的对象中。

2、Function 中可以使用 this 关键字,指代的是包含这个 Function 的类,不过 this 是动态绑定的,比如

运行结果是 y。这种模式在 Lua 中见过,如果要让运行结果是 x,要对 x.a 做一个 Binder,显示指定 this 为 x,并调用 a.x.apply(obj, ...)。

3、Js 中没有继承,要实现继承的功能,有 N 种比较猥琐的方法。一种是在新的对象中放一个 base 指针,指向它的父类。还有一种是复制 prototype。不过看上去都很恶心。以前看过 Lua 中有一种继承的方法是做一个索引表,调用函数的时候查找它父类的函数,不过 Js 不支持运算符重载=.=

4、Js 中唯一的网络组件是 XMLHttpRequest,在 IE 7 和 Firefox 中可用,IE 6 要用 new ActiveXObject("Msxml2.XMLHTTP")。XMLHttpRequest 可以产生一个异步通讯的线程,是 Ajax 的主要工具之一。线程的管理依赖于浏览器,具体的说明可以看 Ray 的一篇文章

5、Js 中数值 0 等价于 false,也就是 if (0) {} 等价于 if (false) {},在写 Array.Contains 的时候总算明白了为什么 Lua 中 0 不等价于 false,因为 Array.Contains 可以返回 null 表示没有找到,而调用的时候可以写 If (obj.Contains(val)) {},而不用写 if (obj.Contains(val) != null){},但是 Js 中就只有写后一种了 =.=

6、Js 中有 delete 关键字,但不是用来进行垃圾回收的,只能用来在类中删除一个元素。垃圾回收是自动的。

7、Js 中有很多保留字(因为 ECMA 规范的缘故),比如 class,IE 7 会认为 var class = 0 是错误而停止执行。

8、Firefox 中的 String 重载了 [] 运算符,等价于 charAt,但这不是标准。

9、Js 和 Java 同宗,N 多相似的地方,比如 Date 中月份从 0 开始,0 表示一月;String 是不可变类;函数的命名和 Java 几乎完全相同。

10、Firefox 下不允许修改 Object.prototype,而 IE 下可以。

先写到这,以后再补……

WoW登录过程简介

登录过程采用SRP协议,具体版本细节不清楚,反正不是最新版。

相关记号:
    H ---- 单向Hash函数,WoW中用的是Sha1,Sha1生成的结果定长20字节
    N ---- 大素数,32字节
    g ---- N%(一个N的质因子),1字节
    C ---- 明文用户名
    P ---- 明文密码
    CP ---- C + ":" + P,+表示字符串连接
    s ---- 随机数
    x ---- 临时变量,x = H(s, H(CP))
    v ---- v = g ^ x
    a ---- 随机数,保存在客户端,不公开
    b ---- 随机数,保存在服务器,不公开
    A ---- A = g ^ a
    B ---- B = 3 * v + g ^ b
    u ---- u = H(A, B)
    S ---- 客户端:S = (B - 3 * g ^ x) ^ (a + u * x),服务器:S = (A * v ^ u) ^ b,都为32字节
    Key ---- 40字节,偶数字节为H(S的偶数字节),奇数字节为H(S的奇数字节),Key将用于以后的通讯加密
    M1 ---- M1 = H( H(N) xor H(g), H(C), s, A, B, Key )
    M2 ---- M2 = H( A, M1, Key)
    ^ ---- 幂运算
    xor ---- 异或运算
    % ---- 模运算
    所有运算结果都%N
   

登录过程(只包含正常的流程,错误检测忽略):
    0、服务器预先保存着N和g。
    1、客户端向服务器发送C。
    2、服务器根据C查找P。生成s、v、b、B,将B、g、N、s发送给客户端。
    3、客户端生成a、x、v、A、u、S、M1、M2,将A、M1发送给服务器。
    4、服务器生成S、Key、M1、M2,将M2发送给客户端。
    5、如果两边的M1和M2都一致,则登录成功。

Pick's Theorem

今天做到某题(POJ 2954),题意是求一个顶点坐标均为整数的三角型内整数点的个数,不含三角型边上的整数点。

Pick's Theorem,大意是:任何平面上顶点坐标均为整数的简单多边形,满足以下公式:

A = I + B / 2 - 1

A是多边形的面积,I是多边形内的整数点的个数,B是多边形边上整数点的个数。

Pick's Theorem可以推广到多维的情况,见:Ehrhart polynomials

理论和题目配合得相当完美……汗啊……