Compare Revisions

Sharp variables in JavaScript

Revision 42771:

Revision 42771 by Sheppy on

Revision 42772:

Revision 42772 by Andrew Weintraub on

Title:
Sharp variables in JavaScript
Sharp variables in JavaScript
Slug:
JavaScript/Sharp_variables_in_JavaScript
JavaScript/Sharp_variables_in_JavaScript
Tags:
JavaScript
JavaScript
Content:

Revision 42771
Revision 42772
nn14      Form
15    </h2>
16    <p>
17      Sharp variables have the form of a sharp sign (#) immediate
 >ly followed by one or more digits.&nbsp; The number represented b
 >y the digits serves as the variable's unique identifier, but lead
 >ing 0s are ignored.
18    </p>
19    <h2>
20      Scope
21    </h2>
22    <p>
23      Sharp variables are only in scope in the statement in which
 > they are defined.
24    </p>
25    <h2>
26      Usage
27    </h2>
28    <p>
29      To create a sharp variable, simply assign an object to it i
 >n a line of code using an equal sign.&nbsp; You cannot assign pri
 >mitives (including strings) to sharp variables.&nbsp; Make sure y
 >ou don't put in any spaces before the equal sign though.
30    </p>
31    <pre>
32#1={}       // This doesn't do much since the sharp variable is o
 >ut of scope immediately after
33a = #2= {}  // Slightly more useful since we retain a reference t
 >o the new object
34</pre>
35    <p>
36      To reference the sharp variable, simply append another shar
 >p (#) to the end of the variable name.&nbsp; This acts as a refer
 >ence to initial variable.&nbsp; You can use this to create object
 >s in a single line of code that would otherwise take multiple lin
 >es of code.
37    </p>
38    <h2>
n20var a = {};n45var a = {foo:#1=[], bar:#1#}
21var b = {};46a.foo.push("Hello")
22b.a1 = a;47a.bar.push("there!")
23b.a2 = a;48print(a.foo[1])      // "there!"
24print(b.toSource());
n27      This outputs:n51      You can avoid using sharp variables by breaking the declara
 >tion up into multiple lines.
n29    <pre class="eval">n53    <pre>
30({a1:#1={}, a2:#1#})54var a = {foo:[], bar:undefined}
55a.bar = a.foo
56 
57a.foo.push("Hello")
58a.bar.push("there!")
59print(a.foo[1])      // "there!"
nn64    <p>
65      Sharp variables can be used to create a circularly linked l
 >ist in one line of code.
66    </p>
n36var a = {};n68var a = #1={val:1, next:{val:2, next:{val:3, next:#1#}}}
37var b = {a0:123};69 
38b.a1 = a;70a.val                 // 1
39b.a2 = a;71a.next.val            // 2
40b.a3 = 'test';72a.next.next.val       // 1
41print(b.toSource());73 
74a.next.next == a      // true
n44      This outputs:n77      Again, you can eliminate the need for sharp variables by us
 >ing two lines instead of one for the declaration.
t46    <pre class="eval">t79    <pre>
47({a0:123, a1:#1={}, a2:#1#, a3:"test"})80var a = {val:1, next{val:2, next:undefined}}
81a.next.next = a;
82 
83a.val                 // 1
84a.next.val            // 2
85a.next.next.val       // 1
86 
87a.next.next == a      // true
88</pre>
89    <h2>
90      Multiple sharp variables
91    </h2>
92    <pre>
93var a = #1={val:#2=[], next:{val:[], next:{val:#02#, next:#1#}}} 
 > // Leading 0s don't matter
94 
95a.val.push(1)
96a.next.val.push(2)
97 
98a.val[0]                 // 1
99a.next.val[0]            // 2
100a.next.next.val[0]       // 1
101a.next.next.next.val[0]  // 1
102 
103a == a.next.next         // false
104a == a.next.next.next    // true

Back to History