annotate core-javascript/objects.rst @ 213:0ea90a1819c2 default tip

Custom theming
author Radomir Dopieralski <radomir.dopieralski@allegro.pl>
date Wed, 27 Jun 2012 16:35:54 +0200
parents 92c876338c31
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
98
cd47db197ee4 Make a start on immuatables.
jf3243
parents:
diff changeset
1 Objects
cd47db197ee4 Make a start on immuatables.
jf3243
parents:
diff changeset
2 =======
cd47db197ee4 Make a start on immuatables.
jf3243
parents:
diff changeset
3
cd47db197ee4 Make a start on immuatables.
jf3243
parents:
diff changeset
4 JavaScript has objects and is object-oriented, but in an unusual way
cd47db197ee4 Make a start on immuatables.
jf3243
parents:
diff changeset
5 (more on that later).
100
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
6
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
7
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
8 Simple objects
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
9 --------------
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
10
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
11 Simple objects are like dictionaries or hashes in other languages.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
12 They support key-value storage and access to attributes. Here's how
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
13 to create a simple object.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
14
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
15 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
16
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
17 js> obj = {}
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
18 [object Object]
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
19
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
20 js> typeof obj
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
21 object
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
22
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
23 We can store attribute values in a simple object (or any object in the
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
24 doc:`object-tree`).
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
25
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
26 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
27
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
28 js> obj.s = 'hi'
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
29 hi
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
30 js> obj.i = 10
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
31 10
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
32
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
33 We can get these values back again.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
34
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
35 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
36
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
37 js> obj.s === 'hi'
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
38 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
39 js> obj.i == 10
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
40 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
41
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
42
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
43 Missing attributes
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
44 ------------------
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
45
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
46 It's not an error to ask for something that's not there. We get
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
47 undefined.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
48
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
49 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
50
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
51 js> obj.dne === undefined
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
52 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
53
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
54 We still get undefined if we set the value to undefined.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
55
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
56 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
57
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
58 js> obj.undef = undefined
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
59 undefined
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
60 js> obj.dne === undefined
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
61 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
62
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
63 You can use null to signal that there is a value, but that it is None.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
64
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
65 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
66
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
67 js> obj.none = null
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
68 null
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
69 js> obj.none === null
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
70 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
71
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
72
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
73 hasOwnProperty
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
74 --------------
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
75
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
76 You can use hasOwnProperty to help figure out why an object has an
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
77 undefined attribute. It's also useful when inspecting the
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
78 doc::`object-tree`. Often, however, it's better to write your code so
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
79 you don't need to do this (for example by using null).
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
80
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
81 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
82
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
83 js> obj.hasOwnProperty('dne')
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
84 false
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
85 js> obj.hasOwnProperty('undef')
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
86 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
87 js> obj.hasOwnProperty('none')
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
88 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
89
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
90
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
91 Object literals
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
92 ---------------
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
93
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
94 You can create a simple object by placing key-value pairs in the curly
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
95 braces.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
96
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
97 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
98
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
99 js> someone = {
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
100 > 'name': 'Joe Doe',
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
101 > 'age': 43
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
102 > }
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
103 [object Object]
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
104
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
105 js> someone.age
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
106 43
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
107
201
d4753a63211b semicolon -> comma in object literals
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 100
diff changeset
108 Take care *not* to put a trailing comma in the object literal. It
100
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
109 will work in Firefox but not in Internet Explorer.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
110
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
111
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
112 Arrays
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
113 ------
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
114
202
37b3b4948387 Remove spurious "is"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 201
diff changeset
115 An array is a list of items. You can put anything as a value for
100
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
116 the list. Use square brackets to create an array.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
117
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
118 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
119
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
120 js> array = []
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
121
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
122 Arrays expand to accomodate the data you store in them. You can even
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
123 leave gaps.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
124
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
125 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
126
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
127 js> array[0] = 'zero'
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
128 zero
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
129 js> array[3] = 'three'
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
130 three
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
131
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
132 An array turned into a string consists of the string on its entries
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
133 joined by commas.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
134
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
135 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
136
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
137 js> array
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
138 zero,,,three
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
139 js> array[1] === undefined
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
140 true
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
141
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
142
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
143 Array literals
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
144 --------------
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
145
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
146 As with simple objects, simply place the values between the square
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
147 brackets, separated by commas.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
148
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
149 .. code-block:: javascript
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
150
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
151 js> seasons = ['spring', 'summer', 'autumn', 'winter']
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
152 spring,summer,autumn,winter
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
153
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
154
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
155 As with simple objects, beware of trailing commas and missing entries.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
156 This will work in some browsers and not others.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
157
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
158
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
159 JSON
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
160 ----
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
161
203
92c876338c31 Remove the remark about YAML, as YAML is not JSON
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 202
diff changeset
162 `JSON <http://www.json.org/>`_ stands for JavaScript Simple Object
100
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
163 Notation. It is very much one of the best parts of JavaScript. It is
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
164 `the fat-free alternative to XML <http://www.json.org/xml.html>`_, and
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
165 is widely used in AJAX (instead of XML). JSON objects are object and
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
166 array literals constructed using only simple objects, arrays, strings,
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
167 true, false and null.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
168
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
169 If your code accepts JSON objects then it will be a lot easier to use
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
170 it with AJAX or otherwise integrate it with other systems.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
171
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
172 Many programming languages have JSON libraries. You don't have to use
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
173 JavaScript to use JSON.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
174
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
175 To provide standards, there are rules on how to write a JSON objects.
cff48ce99b1f Finished with objects.rst (at least for now).
jf3243
parents: 98
diff changeset
176 Many applications and programming languages will generate valid JSON
203
92c876338c31 Remove the remark about YAML, as YAML is not JSON
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents: 202
diff changeset
177 for you.