Sharp variables in JavaScript

sharp变量允许我们用一行赋值语句创建一个拥有循环引用或多重引用的对象.

Warning: Sharp 变量是Mozilla的SpiderMonkey JS引擎独有的用来创建或序列化循环引用对象的非标准的语法.不要在非mozilla平台的环境使用该语法, 即使在mozilla平台的环境里,考虑到代码的整洁等其他因素,该特性已经被删除(bug 566700, Firefox 12).

语法形式

Sharp变量有这样的语法形式:一个sharp符号(#),后面紧跟一个数字.这个数字就是该sharp变量的唯一标识符,并且数字开头的0将会被忽略.

作用域

Sharp 变量只存活在定义它的语句的作用域内.

用法

要创建一个sharp变量,只需要使用一行简单的赋值语句将一个对象赋值给它,你不能用原始值(包括字符串)来给sharp变量赋值,而且要确保在赋值语句的等号左边没有任何空白.

引用一个sharp变量,只需要简单的在sharp变量名后在再加一个sharp(#)符号,形成 #1#.该变量和#1指向同一个对象.通常使用sharp变量可以用一行语句完成其他多行语句完成的相同功能.

#1={0:#1#}      // 无意义,sharp变量在该语句运行结束后立即销毁.
a = #1={0:#1#}  // 有意义,因为使用一个变量保存了等号右边新建对象的引用.

例子

多重引用

var a = { foo:#1=[], bar:#1# };

a.foo.push("Hello");
a.bar.push("there!");

alert(a.foo[1]);      // "there!"

除了使用Sharp变量,你也可以使用下面的两行语句达到同样的效果.

var a = { foo:[], bar:undefined };

a.bar = a.foo;

a.foo.push("Hello");
a.bar.push("there!");

alert(a.foo[1]);      // "there!"

循环引用

使用 Sharp 变量可以用一行代码创建一个循环链表.

var a = #1 = { val:1, next:{val:2, next:#1#} };

a.val;                 // 1
a.next.val;            // 2
a.next.next.val;       // 1

a.next.next == a;      // true

同样,你可以使用下面的两句赋值语句来完成上面Sharp 变量的功能.

var a = {val:1, next:{val:2, next:undefined} };

a.next.next = a;

a.val;                 // 1
a.next.val;            // 2
a.next.next.val;       // 1

a.next.next == a;      // true

同时使用多个 sharp 变量

var a = #1 = { val:#2=[], next:{val:[], next:{val:#02#, next:#1#}} };  // Leading 0s don't matter

a.val.push(1);
a.next.val.push(2);

a.val[0];                 // 1
a.next.val[0];            // 2
a.next.next.val[0];       // 1
a.next.next.next.val[0];  // 1

a == a.next.next;         // false
a == a.next.next.next;    // true

相关链接

Document Tags and Contributors

Contributors to this page: ziyunfei
最后编辑者: ziyunfei,