skip to main |skip to sidebar

2007-11-25

[JavaScript]奇迹!JavaScript居然可以使用Java的类!

今天,编程时无意发现JavaScript可以使用Java的类。但他虽然可以使用,但无法继承。这是从JavaScript 1.1开始支持的。

比如以下代码:

var str = new java.lang.String("Hello world.");//字符串
alert(str);
var sr = java.io.StringReader(str);
alert(sr.read());
var arr = str.getBytes();//数组
alert(arr[0]);
var vector = new java.util.Vector();
vector.add(1);
alert(vector.elementAt(0));

这个功能的支持如下:

  • IE7 - 不行
  • FF2 - 可以
  • Opera9 - 可以

因为安全性的问题,只可以使用部分类,比如java.lang.Thread就无法使用。也就是说无法开多线程。

2007-11-18

[AS3]高级图形处理(2)——老照片滤镜

照片的时间久了,就会出现褪色、模糊、杂色

实现方法

褪色
使用ColorTransform。参数为new ColorTransform(0.7, 0.7, 0.7, 0x44, 0x33, 0x22)
模糊
使用BlurFilter。参数为new BlurFilter(0.2, 0.2)
添加杂色
使用BitmapData.noise($randomSeed, 0xee, 0xff, 7, true)

核心代码

//Color Transform
outputBitmapData.colorTransform( sourceRect, new ColorTransform(0.7, 0.7, 0.7, 0x44, 0x33, 0x22) );
//Blur
outputBitmapData.applyFilter( outputBitmapData, sourceRect, destPoint, new BlurFilter(0.2, 0.2) );
//Noise
var noise:BitmapData = new BitmapData($width, $height, false);
noise.noise(0, 0xee, 0xff, 7, true);
outputBitmapData.draw(
noise,
new Matrix(1, 0, 0, 1, destPoint.x, destPoint.y),
null,
BlendMode.MULTIPLY
);

完整代码下载

2007-11-06

悲哀!谷歌的新版主页

网址:http://www.google.cn/hp?sp=china

实在是悲哀!Google到了中国怎么就变了味?难道这就是国情吗?

本地化并不一定表示要庸俗化吧,与其这样还不如坚持走高端路线。

中国的网络何时才能成熟?

昨天又遭遇了spam广告评论

实在是愤怒!

前几天,我的Blog的PR上升到了6以后,又有人发布广告评论。

发布广告评论的人注意了,当你发了评论时,我将会收到有评论的消息,也就是说你的评论的生命超不过一天!打验证码不累吗?我删除你的评论只需要1秒,你这样做值得吗?

2007-11-03

ECMAScript4 草案的新标准解读

概要

ECMAScript4的新标准可以分为

  • 从 ActionScript 3.0 继承的新标准
  • 从 JavaScript1.7 继承的新标准
  • 其他的新标准

从 ActionScript 3.0 继承的新标准

与OOP和类型相关的标准与ActionScript 3.0几乎一样。

  • class,interface
  • 属性,const
  • 继承
  • 命名空间,package
  • int,double类型
  • ...args
  • is,as运算符
  • try-catch的类型匹配
  • 末尾的逗号(Trailing commas),比如{a : 10,}

从 JavaScript1.7 继承的新标准

  • 作用域(let)
  • 多值代入([a, b] = [1, 2])
  • 迭代(Iterator)
  • yield
  • 数组闭包

FireFox 2使用的是 JavaScript 1.7。

其他的新标准

重载函数(generic functions)

使用Overload可能更恰当。

generic function intersect(s1, s2); // No body here

generic function intersect(s1: Shape, s2: Shape) {
    // general intersection method 
}

generic function intersect(s1: Rect, s2: Rect) {
    // fast intersection for rectangles 
}

模板类 (parameterized class)

类似于 Java 5.0 新添加的Generics。可以避免运行时的类型检查,提高运行速度。

class Pair.<T> {
var first: T, second: T;
}

new Pair.<int>(3, 4);
type Box.<T> = {
 value: T
}
var v: Box.<boolean> = new Box.<boolean>(true);

function f.<T>( x:T ): T {
    //Do sth...
}

f.<int>(37)

Vector与Map

Vector为Array的严密版;Map为使用Object的HashTable,相当于 ActionScript3.0 的 Dictionary类的严密版。它们都支持迭代与模板。并且在编译时做了类型检查,所以速度很快。

var xs = new Vector.<double>;
var map = new Map.<*,int>;

记录与数组类型(Record and array types)

记录类型(Record type)就像{x:int, y:string}的样子,好像受了Scheme等函数型语言的影响。Object的模板?

var samplevar = new { x:int, y:string }( 3, "foo" );
var samplevar = { x:10, y:"foo" } : { x:int, y:string }; 

但是属性可以进行添加与删除,也就是说并非制定严密的类型。如果想严密,必须定义Class!

就我看来,这种语法不大好,有点罗嗦。我认为以下似乎更好:

var samplevar = new {x:int = 3, y:String = "foo"};

数组类型使用[int]的方式来定义。

var intarray = new [int](7);
var intarray = [1, 2, 3]:[int];

以上两种类型均可以与新添加的关键字 likewarp 组合起来使用。

function func1( pt: like { x: int, y: int } ) {...}
function func2( pt: * ) {
     if( pt is like {x : int, y : int} ) { ... }
}
function func3( pt: wrap { x: int, y: int } ) {...}

有趣的是使用 like 可以匹配特定种类的class,而不必非要在继承树下面的。比如ActionScript3.0的 PointSprite 的超类虽然不一样(除 Object 以外),但都有xy属性。使用记录类型的话,就可以匹配以上两种类型,增加了柔软性。

每次都写 { x:int, y:int } 太麻烦了,多次使用时可以使用新的关键字 type 来定义。

type Position = { x:Number, y:Number };

其他,数组类型与变长参数可以一起使用。

function (int, ...[string]): void {...}

运算符的重载(Operator overloading)

运算符均为全局函数,在 intrinsic 的命名空间里面定义。

class Complex {...}
generic intrinsic function +( a: Complex, b: Complex ) {
     new Complex( a.real + b.real, a.imag + b.imag )
}
generic intrinsic function +( a: Complex, b: Number ) {
     a + Complex(b)
}
generic intrinsic function +( a: Number, b: Complex ) {
     Complex(a) + b;
}

禁止null值(Nullability)

在类型后面添加!来禁止null值的代入。

var v:C! = ...
function (v:Object!) {...}
class Complex! {...}

末尾调用(Tail calls)

在函数的末尾调用函数或返回调用函数的值时,不进行压栈、调用,而直接使用 goto 来编译。特别在递归调用时,调用过程变为了循环,对速度有显著的提高。

元层次挂钩(Meta-level hooks)

管理函数的调用,值的代入等,可以使用meta::invokemeta::getmeta::setmeta::hasmeta::delete。类似于 ActionScript 3.0 的 Proxy,只能在动态类里使用。

Array与Vector也使用了Meta-level hooks。在之前无法自己写Arra(因为无法同时继承 ArrayProxy),但通过使用Meta-level hooks,这一切将成为历史。

结合类型(Union type)

创建可以匹配多个类型的类型比如 (int,String) 可以匹配 intString 类型。

type AnyNumber = (byte,int,uint,double,decimal,Number);//匹配任何数字的类型

特别地,常量 any 等于 (null,undefined,Object),可以匹配任何类型。

选择类型(switch type)

以前,switch只匹配较值,需要匹配类型时只能使用 if(v is String){...}else if(v is Number) {...}... 但现在可以使用switch type。

switch type (v) {
    case (s:string) { ... }
    case (d:Date) { ... }
}

截取(Slicing)

截取子集,可以在 StringArrayVector 里使用。

"ecmascript"[5:2:-1]// => "sam"

正则表现(Regular Expressions)的多行与注释

正则表现支持多行与以#开头的注释。复杂的正则表现的阅读性大大提高!

/# The protocol is an alpha name followed by colon and double slash
 (?P<protocol> [a-z]+)
 :
 \/\/
 # The host is two or more dot-separated alpha names
 (?P<host> [a-z]+ (?: \. [a-z]+ )+)
 # The path is optionally present
 (?P<path> (?: \/ [a-z]+ )* \/? )
/x

支持JSON

toJSONStringString.parseJSON

还有很多新标准,详细请看 Proposed ECMAScript 4th Edition – Language Overview

Blog改版二期工程基本完毕!

本次改版,对SEO与用户体验做了改动。比如:

  • 以前在Google上搜索的结果的简略信息都是一样的,而现在可以搜索到真正的内容了。
  • 添加了相关链接,使用了Ajax技术以防止页面出现停顿(表示相关链接的网络开销有点大)
  • 把以前的标签改成了标签云。
  • 让从手机上也能正常阅读。