hlp 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +704 -0
- package/_js/_build/script.js +2846 -0
- package/hlp.js +1 -0
- package/package.json +113 -0
package/README.md
ADDED
|
@@ -0,0 +1,704 @@
|
|
|
1
|
+
## motivation
|
|
2
|
+
tired of writing
|
|
3
|
+
|
|
4
|
+
```js
|
|
5
|
+
if( Object.keys(obj).length === 0 && obj.constructor === Object )
|
|
6
|
+
{
|
|
7
|
+
|
|
8
|
+
}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
or
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
if (typeof arr !== 'undefined' && arr.length > 0)
|
|
15
|
+
{
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
or
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
for(const [obj__key, obj__value] of Object.entries(obj))
|
|
24
|
+
{
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
?
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## installation
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
npm init -y
|
|
36
|
+
npm install hlp
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
now embed it directly:
|
|
40
|
+
```html
|
|
41
|
+
<script src="hlp.js"></script>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
or use it as a module:
|
|
45
|
+
```js
|
|
46
|
+
import hlp from 'hlp';
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## usage
|
|
51
|
+
|
|
52
|
+
### existence
|
|
53
|
+
```js
|
|
54
|
+
// check existence
|
|
55
|
+
if( hlp.x(vrbl) )
|
|
56
|
+
{
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// check non-existence
|
|
61
|
+
if( hlp.nx(vrbl) )
|
|
62
|
+
{
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### equality
|
|
68
|
+
```js
|
|
69
|
+
// js has a lot of pitfalls, when comparing loosely
|
|
70
|
+
if( '' == [] ) // true
|
|
71
|
+
if( '' == [''] ) // true
|
|
72
|
+
if( '' == 0 ) // true
|
|
73
|
+
if( ' ' == false ) // true
|
|
74
|
+
if( [0] == false ) // true
|
|
75
|
+
if( [0] == '0' ) // true
|
|
76
|
+
if( [] == false ) // true
|
|
77
|
+
if( [''] == false ) // true
|
|
78
|
+
if( 0 == false ) // true
|
|
79
|
+
if( 0 == [] ) // true
|
|
80
|
+
if( 0 == [''] ) // true
|
|
81
|
+
if( [0] == false ) // true
|
|
82
|
+
if( [0] == 0 ) // true
|
|
83
|
+
|
|
84
|
+
// also don't forget those delicacies
|
|
85
|
+
0 === -0 // true
|
|
86
|
+
NaN === NaN // false
|
|
87
|
+
(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]] === 'fail' // true
|
|
88
|
+
|
|
89
|
+
// this non-strict equality is symmetric, but not transitive
|
|
90
|
+
a = ''; b = 0; c = [0];
|
|
91
|
+
a == b; // true
|
|
92
|
+
b == c; // true
|
|
93
|
+
c == a; // false
|
|
94
|
+
|
|
95
|
+
// to overcome this issue, we...
|
|
96
|
+
|
|
97
|
+
// ...use strict comparison when possible
|
|
98
|
+
if( vrbl === 'foo' )
|
|
99
|
+
{
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ...use loose comparison when appropriate
|
|
104
|
+
if( hlp.getParam('number') == 1337 )
|
|
105
|
+
{
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ...check for truthness / falsiness with these helper methods
|
|
110
|
+
if( hlp.true(vrbl) )
|
|
111
|
+
{
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if( hlp.false(vrbl) )
|
|
116
|
+
{
|
|
117
|
+
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// be aware, that hlp.true is not always the logic negation of hlp.false
|
|
121
|
+
hlp.true(null) // false
|
|
122
|
+
hlp.false(null) // false
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### value
|
|
126
|
+
```js
|
|
127
|
+
// get variable if exists, otherwise ''
|
|
128
|
+
hlp.v( vrbl )
|
|
129
|
+
|
|
130
|
+
// get variable if exists, otherwise 'default'
|
|
131
|
+
hlp.v( vrbl, 'default' )
|
|
132
|
+
|
|
133
|
+
// get first variable that exists, otherwise ''
|
|
134
|
+
hlp.v( vrbl1, vrbl2, vrbl3 )
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### loop
|
|
138
|
+
```js
|
|
139
|
+
// loop over arrays/objects only if possible
|
|
140
|
+
hlp.loop(['foo','bar','baz'], (vrbl__value) =>
|
|
141
|
+
{
|
|
142
|
+
|
|
143
|
+
});
|
|
144
|
+
hlp.loop(['foo','bar','baz'], (vrbl__value, vrbl__key) =>
|
|
145
|
+
{
|
|
146
|
+
|
|
147
|
+
});
|
|
148
|
+
hlp.loop({bar: 'foo', baz: 'bar', foo: 'baz'}, (vrbl__value, vrbl__key) =>
|
|
149
|
+
{
|
|
150
|
+
|
|
151
|
+
});
|
|
152
|
+
hlp.loop([], (vrbl__value, vrbl__key) => { }) // does nothing
|
|
153
|
+
hlp.loop({}, (vrbl__value, vrbl__key) => { }) // does nothing
|
|
154
|
+
hlp.loop(null, (vrbl__value, vrbl__key) => { }) // does nothing
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
### try
|
|
159
|
+
|
|
160
|
+
```js
|
|
161
|
+
// if you are unsure, if a variable is even set before checking its existence,
|
|
162
|
+
// simply put it inside this helper function
|
|
163
|
+
if( hlp.x(() => vrbl) )
|
|
164
|
+
if( hlp.nx(() => vrbl) )
|
|
165
|
+
if( hlp.true(() => vrbl) )
|
|
166
|
+
if( hlp.false(() => vrbl) )
|
|
167
|
+
if( hlp.v(() => vrbl) === 'foo' )
|
|
168
|
+
if( hlp.v(() => vrbl) == 1337 )
|
|
169
|
+
echo hlp.v(() => vrbl)
|
|
170
|
+
hlp.loop((() => vrbl), (vrbl__value, vrbl__key) => { })
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
that works because javascript only evaluates the content of the inner callback (or closure) when it is actually executed.
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
### helpers
|
|
178
|
+
|
|
179
|
+
there are also some other neat little helpers available:
|
|
180
|
+
|
|
181
|
+
```js
|
|
182
|
+
// capitalize
|
|
183
|
+
hlp.capitalize('foo') // Foo
|
|
184
|
+
|
|
185
|
+
// check if object
|
|
186
|
+
hlp.isObject({}) // true
|
|
187
|
+
hlp.isObject({foo: 'bar'}) // true
|
|
188
|
+
hlp.isObject(null) // false
|
|
189
|
+
hlp.isObject([]) // false (be aware: an array in js is scrictly an object, but this function returns false)
|
|
190
|
+
|
|
191
|
+
// check if array
|
|
192
|
+
hlp.isArray([]) // true
|
|
193
|
+
hlp.isArray(['foo','bar']) // true
|
|
194
|
+
hlp.isArray(null) // false
|
|
195
|
+
|
|
196
|
+
// check if string
|
|
197
|
+
hlp.isString('foo'); // true
|
|
198
|
+
hlp.isString(42); // false
|
|
199
|
+
hlp.isString(null); // false
|
|
200
|
+
|
|
201
|
+
// check if date
|
|
202
|
+
hlp.isDate('2018-01-01') // true
|
|
203
|
+
hlp.isDate('2018-02-29') // false
|
|
204
|
+
hlp.isDate('1700-01-01') // true
|
|
205
|
+
hlp.isDate(42) // false
|
|
206
|
+
|
|
207
|
+
// format date
|
|
208
|
+
hlp.formatDate('d.m.Y', '2018-01-01') // 01.01.2018
|
|
209
|
+
hlp.formatDate('Y-m-d H:i:s', new Date()) // 01.01.2018
|
|
210
|
+
|
|
211
|
+
// get week number from date
|
|
212
|
+
hlp.dateToWeek(new Date('2021-02-22')) // 8
|
|
213
|
+
hlp.dateToWeek() // hlp.dateToWeek(new Date())
|
|
214
|
+
|
|
215
|
+
// get date (of monday) from week number
|
|
216
|
+
hlp.weekToDate(42, 2018) // new Date('2018-10-14')
|
|
217
|
+
hlp.weekToDate(17, 2023) // new Date('2023-04-23')
|
|
218
|
+
|
|
219
|
+
// add days to date
|
|
220
|
+
hlp.addDays(new Date('2018-01-01'), 7) // new Date('2018-01-08')
|
|
221
|
+
hlp.addDays(new Date('2018-02-22'), 658) // new Date('2019-12-12')
|
|
222
|
+
hlp.addDays(new Date('2018-02-22'), 1) // new Date('2018-02-21')
|
|
223
|
+
|
|
224
|
+
// compare dates
|
|
225
|
+
let d1 = new Date();
|
|
226
|
+
let d2 = new Date();
|
|
227
|
+
hlp.compareDates(d1, d2) // 0
|
|
228
|
+
hlp.addDays(d1, -1);
|
|
229
|
+
hlp.compareDates(d1, d2) // -1
|
|
230
|
+
hlp.addDays(d1, 2);
|
|
231
|
+
hlp.compareDates(d1, d2) // 1
|
|
232
|
+
hlp.compareDates('2020-01-01', '2020-01-17 17:42:19') // -1
|
|
233
|
+
|
|
234
|
+
// spaceship operator
|
|
235
|
+
hlp.spaceship(5,7) // -1
|
|
236
|
+
hlp.spaceship(9,7) // 1
|
|
237
|
+
hlp.spaceship(7,7) // 0
|
|
238
|
+
hlp.spaceship('foo','bar') // 1
|
|
239
|
+
hlp.spaceship('bar','foo') // -1
|
|
240
|
+
|
|
241
|
+
// check if objects are equal
|
|
242
|
+
hlp.objectsAreEqual({}, {}) // true
|
|
243
|
+
hlp.objectsAreEqual({ foo: 'bar' }, { foo: 'bar'}) // true
|
|
244
|
+
hlp.objectsAreEqual({ foo: 'bar' }, { bar: 'baz'}) // false
|
|
245
|
+
|
|
246
|
+
// check if object is inside an array/object
|
|
247
|
+
hlp.containsObject({ foo: 'bar' }, []) // false
|
|
248
|
+
hlp.containsObject({ foo: 'bar' }, [{ foo: 'bar' }, { bar: 'baz' }]) // true
|
|
249
|
+
hlp.containsObject({ foo: 'bar' }, { foo: { foo: 'bar' } }) // true
|
|
250
|
+
|
|
251
|
+
// recursively search key/value in nested object and return dotprop array
|
|
252
|
+
hlp.findRecursiveInObject({ foo: { id: 42 }, bar: { foo: { id: 7 } }, baz: { id1: 42, id2: 7 } }, 'id'); // ['foo', 'bar.foo']
|
|
253
|
+
hlp.findRecursiveInObject({ foo: { id: 42 }, bar: { foo: { id: 7 } }, baz: { id1: 42, id2: 7 } }, 'id', 42); // ['foo']
|
|
254
|
+
hlp.findRecursiveInObject({ foo: { id: 42 }, bar: { foo: { id: 7 } }, baz: { id1: 42, id2: 7 } }, null, 7); // ['bar.foo', 'baz']
|
|
255
|
+
|
|
256
|
+
// deep clone reference types (object/array/date/regex)
|
|
257
|
+
hlp.deepCopy({ foo: 'bar' })
|
|
258
|
+
hlp.deepCopy(['foo','bar'])
|
|
259
|
+
hlp.deepCopy(new Date())
|
|
260
|
+
hlp.deepCopy(new Date('2018-01-01'))
|
|
261
|
+
hlp.deepCopy(new RegExp('ab+c', 'i'))
|
|
262
|
+
|
|
263
|
+
// generate uuid/guid v4
|
|
264
|
+
hlp.uuid() // e86e393c-9788-857b-27c2-f80c8ca1a302
|
|
265
|
+
hlp.uuid() // 8b25a8f8-9525-bd73-4679-3539321db93b
|
|
266
|
+
|
|
267
|
+
// replace all occurences
|
|
268
|
+
hlp.replaceAll('foo bar baz', 'a', 'b') // 'foo bbr bbz'
|
|
269
|
+
|
|
270
|
+
// replace last occurence
|
|
271
|
+
hlp.replaceLast('foo bar baz', 'a', 'b') // 'foo bar bbz'
|
|
272
|
+
|
|
273
|
+
// replace last occurence
|
|
274
|
+
hlp.replaceFirst('foo bar baz', 'a', 'b') // 'foo bbr baz'
|
|
275
|
+
|
|
276
|
+
// case insensitive search
|
|
277
|
+
hlp.indexOfCaseInsensitive('foo', 'this is a FOO') // 10
|
|
278
|
+
hlp.indexOfCaseInsensitive('foo', 'this is a FOO and a foobar', 15) // 20
|
|
279
|
+
|
|
280
|
+
// count occurences in string
|
|
281
|
+
hlp.countAllOccurences('foo', 'this is a foo and a foobar') // 2
|
|
282
|
+
hlp.countAllOccurencesCaseInsensitive('FoO', 'this is a FOO and a foobar') // 2
|
|
283
|
+
|
|
284
|
+
// find all positions in string
|
|
285
|
+
hlp.findAllPositions('foo', 'this is a foo and a foobar') // [10,20]
|
|
286
|
+
hlp.findAllPositionsCaseInsensitive('FoO', 'this is a FOO and a foobar') // [10,20]
|
|
287
|
+
|
|
288
|
+
// highlight strings
|
|
289
|
+
hlp.highlight('that is a search string', 'is') // that <strong class="highlight">is</strong> a search string
|
|
290
|
+
hlp.highlight('abc def geh ijk lmn opq rst abc def geh ijk lmn opq rst', 'ijk', true, 5) // '... geh <strong class="highlight">ijk</strong> lmn ... geh <strong class="highlight">ijk</strong> lmn ...'
|
|
291
|
+
|
|
292
|
+
// return unique array (remove duplicate values, order-safe)
|
|
293
|
+
hlp.uniqueArray(['foo','bar','foo','baz']) // ['foo','bar','baz']
|
|
294
|
+
|
|
295
|
+
// shuffle array
|
|
296
|
+
hlp.shuffle(['foo','bar']) // ['foo','bar']
|
|
297
|
+
hlp.shuffle(['foo','bar']) // ['foo','bar']
|
|
298
|
+
hlp.shuffle(['foo','bar']) // ['foo','bar'] (yikes)
|
|
299
|
+
hlp.shuffle(['foo','bar']) // ['bar','foo']
|
|
300
|
+
|
|
301
|
+
// char helpers
|
|
302
|
+
hlp.charToInt('D') // 4
|
|
303
|
+
hlp.intToChar(4) // 'D'
|
|
304
|
+
hlp.incChar('D') // 'E'
|
|
305
|
+
hlp.incChar('Z') // 'AA'
|
|
306
|
+
hlp.incChar('A',2) // 'C'
|
|
307
|
+
hlp.decChar('U') // 'T'
|
|
308
|
+
|
|
309
|
+
// slugify / sanitize string
|
|
310
|
+
hlp.slugify('That röcks!') // that-roecks
|
|
311
|
+
|
|
312
|
+
// range
|
|
313
|
+
hlp.range('A','Z') // ['A','B',...,'Z']
|
|
314
|
+
hlp.range(1,42) // [1,2,...,42]
|
|
315
|
+
hlp.range('C','A') // ['C','B','A']
|
|
316
|
+
|
|
317
|
+
// get last item of object/array
|
|
318
|
+
hlp.last(['foo', 'bar', 'baz']) // 'baz'
|
|
319
|
+
hlp.last({ foo: 'bar', bar: 'baz'}) // 'baz'
|
|
320
|
+
|
|
321
|
+
// get first item of object/array
|
|
322
|
+
hlp.first(['foo', 'bar', 'baz']) // 'foo'
|
|
323
|
+
hlp.first({ foo: 'bar', bar: 'baz'}) // 'bar'
|
|
324
|
+
|
|
325
|
+
// get random element from object/array
|
|
326
|
+
hlp.rand(['foo', 'bar', 'baz']) // 'bar'
|
|
327
|
+
|
|
328
|
+
// generate a random string
|
|
329
|
+
hlp.random_string() // edPhi34d
|
|
330
|
+
hlp.random_string(10) // abCa321aC6
|
|
331
|
+
hlp.random_string(16, 'idkfa') // idifafafifaifafk
|
|
332
|
+
|
|
333
|
+
// generate a random integer
|
|
334
|
+
hlp.random_int() // 42
|
|
335
|
+
hlp.random_int(7,42) // 17
|
|
336
|
+
|
|
337
|
+
// check if variable is integer
|
|
338
|
+
hlp.isInteger('foo') // false
|
|
339
|
+
hlp.isInteger(42) // true
|
|
340
|
+
hlp.isInteger('42') // true
|
|
341
|
+
hlp.isInteger(4e2) // true
|
|
342
|
+
hlp.isInteger('4e2') // true
|
|
343
|
+
hlp.isInteger(' 1 ') // true
|
|
344
|
+
hlp.isInteger('') // false
|
|
345
|
+
hlp.isInteger(' ') // false
|
|
346
|
+
hlp.isInteger(42.1) // false
|
|
347
|
+
hlp.isInteger('1a') // false
|
|
348
|
+
hlp.isInteger('4e2a') // false
|
|
349
|
+
hlp.isInteger(null) // false
|
|
350
|
+
hlp.isInteger(undefined) // false
|
|
351
|
+
hlp.isInteger(NaN) // false
|
|
352
|
+
|
|
353
|
+
// check if variable is numeric
|
|
354
|
+
hlp.isNumeric(1337) // true
|
|
355
|
+
hlp.isNumeric('42') // true
|
|
356
|
+
hlp.isNumeric('42.7') // true
|
|
357
|
+
hlp.isNumeric('a') // false
|
|
358
|
+
|
|
359
|
+
// json parsing
|
|
360
|
+
hlp.jsonStringToObject('["foo","bar","baz"]') // ['foo','bar','baz']
|
|
361
|
+
hlp.jsonStringToObject('["foo","bar","baz",]') // null
|
|
362
|
+
hlp.jsonObjectToString(['foo','bar','baz']) // '["foo","bar","baz"]'
|
|
363
|
+
hlp.isJsonString('["foo","bar","baz",]') // false
|
|
364
|
+
hlp.isJsonString('["foo","bar","baz"]') // true
|
|
365
|
+
|
|
366
|
+
// map for objects
|
|
367
|
+
hlp.map({ foo: 'bar', bar: 'baz' }, (obj__key, obj__value) => obj__value += '!'); // { foo: 'bar!', bar: 'baz!' }
|
|
368
|
+
|
|
369
|
+
// fun with blobs
|
|
370
|
+
hlp.stringtoblob(string)
|
|
371
|
+
hlp.stringtoblob(string, 'image/png')
|
|
372
|
+
hlp.blobtostring(blob).then((string) => { })
|
|
373
|
+
hlp.blobtobase64(blob).then((base64) => { })
|
|
374
|
+
hlp.base64toblob(base64)
|
|
375
|
+
hlp.base64toblob(base64, 'image/png')
|
|
376
|
+
hlp.filetobase64(file).then((base64) => { })
|
|
377
|
+
hlp.blobtofile(blob)
|
|
378
|
+
hlp.blobtofile(blob, 'filename.png')
|
|
379
|
+
hlp.filetoblob(file)
|
|
380
|
+
hlp.base64tofile(base64)
|
|
381
|
+
hlp.base64tofile(base64, 'image/png')
|
|
382
|
+
hlp.base64tofile(base64, 'image/png', 'filename.png')
|
|
383
|
+
hlp.base64tostring(base64)
|
|
384
|
+
hlp.stringtobase64(string)
|
|
385
|
+
hlp.blobtourl(blob)
|
|
386
|
+
hlp.stringtourl(string)
|
|
387
|
+
hlp.base64tourl(base64)
|
|
388
|
+
hlp.filetourl(file)
|
|
389
|
+
|
|
390
|
+
// fix exif image orientation
|
|
391
|
+
hlp.fixImageOrientation(base64).then((base64) => { });
|
|
392
|
+
hlp.getImageOrientation(base64).then((orientation) => { });
|
|
393
|
+
|
|
394
|
+
// html entity encode/decode
|
|
395
|
+
hlp.htmlEncode('&<>"`\'') // &<>"`'
|
|
396
|
+
hlp.htmlDecode('&<>"`'') // &<>"`'
|
|
397
|
+
|
|
398
|
+
// line break conversion
|
|
399
|
+
hlp.nl2br('foo\nbar') // foo<br/>bar
|
|
400
|
+
hlp.br2nl('foo<br/>bar') // foo\nbar
|
|
401
|
+
|
|
402
|
+
// floating point math made easy
|
|
403
|
+
hlp.fmath('*', 0.1, 0.2) // 0.02
|
|
404
|
+
hlp.fmath('+', 0.1, 0.2) // 0.3
|
|
405
|
+
hlp.fmath('-', 0.1, 0.2) // -0.1
|
|
406
|
+
hlp.fmath('/', 0.2, 0.1) // 2
|
|
407
|
+
hlp.fmath('/', 0.39, 100, 12) // 0.0039 (precision of 12)
|
|
408
|
+
|
|
409
|
+
// trim helpers
|
|
410
|
+
hlp.trim(' foo ') // 'foo'
|
|
411
|
+
hlp.trim('xxfoox', 'x') // 'foo'
|
|
412
|
+
hlp.ltrim(' foo ') // 'foo '
|
|
413
|
+
hlp.ltrim('xxfoox', 'x') // 'foox'
|
|
414
|
+
hlp.rtrim(' foo ') // ' foo'
|
|
415
|
+
hlp.rtrim('xxfoox', 'x') // 'xxfoo'
|
|
416
|
+
|
|
417
|
+
// create lexicographically ordered string ids like in firebase
|
|
418
|
+
hlp.pushId() // -LDiDooGs9PyGHmghk5i
|
|
419
|
+
hlp.pushId() // -LDiDooGs9PyGHmghk5j
|
|
420
|
+
|
|
421
|
+
// access object properties with dotprop notation
|
|
422
|
+
// today it is better to use optional chaining in combination with nullish coalescing ({}?.c?.a?.a??'default')
|
|
423
|
+
hlp.getProp({
|
|
424
|
+
a: 1,
|
|
425
|
+
b: { a: 3, b: 3 },
|
|
426
|
+
c: { a: { a: 7 } }
|
|
427
|
+
}, 'c.a.a') // 7
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
check out also the following helpers for the frontend:
|
|
431
|
+
|
|
432
|
+
```js
|
|
433
|
+
// cookies
|
|
434
|
+
hlp.cookieSet('foo', 'bar', 7);
|
|
435
|
+
hlp.cookieGet('foo') // bar
|
|
436
|
+
hlp.cookieDelete('foo')
|
|
437
|
+
hlp.cookieExists('foo') // false
|
|
438
|
+
|
|
439
|
+
// get parameter (example url: https://tld.com/?foo=bar&bar=baz)
|
|
440
|
+
hlp.getParam('foo') // foo
|
|
441
|
+
hlp.getParam('bar') // baz
|
|
442
|
+
hlp.getParam('baz') // null
|
|
443
|
+
|
|
444
|
+
// device detection helpers
|
|
445
|
+
hlp.getDevice() // ['phone','tablet','desktop']
|
|
446
|
+
hlp.isPhone()
|
|
447
|
+
hlp.isTablet()
|
|
448
|
+
hlp.isDesktop()
|
|
449
|
+
hlp.isMobile()
|
|
450
|
+
hlp.isTouch()
|
|
451
|
+
|
|
452
|
+
// os detection helpers
|
|
453
|
+
hlp.getOs() // ['windows','mac','linux','unknown']
|
|
454
|
+
hlp.isWindows()
|
|
455
|
+
hlp.isMac()
|
|
456
|
+
hlp.isLinux()
|
|
457
|
+
|
|
458
|
+
// browser detection helpers
|
|
459
|
+
hlp.getBrowser() // ['ie','edge','firefox','chrome','safari','opera','unknown']
|
|
460
|
+
|
|
461
|
+
// smooth scroll to position / element
|
|
462
|
+
hlp.scrollTo( 0, 1000 ).then(() => { console.log('done'); });
|
|
463
|
+
hlp.scrollTo( document.querySelector('.foo'), 1000 ).then(() => { console.log('done'); });
|
|
464
|
+
|
|
465
|
+
// get top/left scroll position
|
|
466
|
+
hlp.scrollTop()
|
|
467
|
+
hlp.scrollLeft()
|
|
468
|
+
|
|
469
|
+
// get offset of element (excluding margin)
|
|
470
|
+
hlp.offsetTop( document.querySelector('.foo') )
|
|
471
|
+
hlp.offsetLeft( document.querySelector('.foo') )
|
|
472
|
+
hlp.offsetRight( document.querySelector('.foo') )
|
|
473
|
+
hlp.offsetBottom( document.querySelector('.foo') )
|
|
474
|
+
|
|
475
|
+
// get document size
|
|
476
|
+
hlp.documentWidth()
|
|
477
|
+
hlp.documentHeight()
|
|
478
|
+
|
|
479
|
+
// get window size
|
|
480
|
+
hlp.windowWidth()
|
|
481
|
+
hlp.windowHeight()
|
|
482
|
+
hlp.windowWidthWithoutScrollbar()
|
|
483
|
+
hlp.windowHeightWithoutScrollbar()
|
|
484
|
+
|
|
485
|
+
// get width with margin
|
|
486
|
+
hlp.outerWidthWithMargin( document.querySelector('.foo') )
|
|
487
|
+
hlp.outerHeightWithMargin( document.querySelector('.foo') )
|
|
488
|
+
|
|
489
|
+
// polyfills for ie11
|
|
490
|
+
hlp.closest( document.querySelector('.children'), '.parent' )
|
|
491
|
+
hlp.matches( document.querySelector('.parent'), '.parent' ) // true
|
|
492
|
+
hlp.remove( document.querySelector('.foo') ) // also works if .foo does not exist
|
|
493
|
+
|
|
494
|
+
// dom traversal
|
|
495
|
+
hlp.prevAll( document.querySelector('.foo') )
|
|
496
|
+
hlp.prevAll( document.querySelector('.foo'), '.bar' )
|
|
497
|
+
hlp.nextAll( document.querySelector('.foo') )
|
|
498
|
+
hlp.nextAll( document.querySelector('.foo'), '.bar' )
|
|
499
|
+
hlp.siblings( document.querySelector('.foo') )
|
|
500
|
+
hlp.siblings( document.querySelector('.foo'), '.bar' )
|
|
501
|
+
hlp.parents( document.querySelector('.foo') )
|
|
502
|
+
hlp.parents( document.querySelector('.foo'), '.bar' )
|
|
503
|
+
|
|
504
|
+
// wrap all text nodes with new node
|
|
505
|
+
hlp.wrapTextNodes( document.querySelector('.foo'), 'p' )
|
|
506
|
+
|
|
507
|
+
// html string to dom (also supports ie11 and td nodes that cannot be root nodes)
|
|
508
|
+
hlp.html2dom('<p>foo</p>')
|
|
509
|
+
hlp.html2dom('<td>bar</td>')
|
|
510
|
+
|
|
511
|
+
// get all styles of a dom element (extracted from both inline styling and external styling through stylesheets)
|
|
512
|
+
hlp.css( document.querySelector('.foo') )
|
|
513
|
+
|
|
514
|
+
// visually focus element on page
|
|
515
|
+
hlp.focus('.foo')
|
|
516
|
+
hlp.unfocus()
|
|
517
|
+
|
|
518
|
+
// on delegate
|
|
519
|
+
hlp.on('click', '.selector', (e, el) => { });
|
|
520
|
+
hlp.on('click', '.selector', '.scope', (e, el) => { });
|
|
521
|
+
|
|
522
|
+
// classic debounce
|
|
523
|
+
window.addEventListener('resize', hlp.debounce(() => { console.log('debounce at resize') }, 1000));
|
|
524
|
+
document.querySelector('.container').addEventListener('input', hlp.debounce((e) => { console.log('debounce at '+e.target.value); }, 1000));
|
|
525
|
+
|
|
526
|
+
// classic throttle
|
|
527
|
+
window.addEventListener('resize', hlp.throttle(() => { console.log('throttle at resize') }, 1000));
|
|
528
|
+
document.querySelector('.container').addEventListener('input', hlp.throttle((e) => { console.log('throttle at '+e.target.value); }, 1000));
|
|
529
|
+
|
|
530
|
+
// get current url
|
|
531
|
+
hlp.url() // https://github.com/vielhuber/hlp
|
|
532
|
+
hlp.urlWithHash() // https://github.com/vielhuber/hlp#foo
|
|
533
|
+
hlp.fullUrl() // https://github.com/vielhuber/hlp?foo=bar#foo
|
|
534
|
+
hlp.urlWithArgs() // https://github.com/vielhuber/hlp?foo=bar
|
|
535
|
+
hlp.baseUrl() // https://github.com
|
|
536
|
+
hlp.urlHost(); // github.com
|
|
537
|
+
hlp.urlHostTopLevel(); // github.com
|
|
538
|
+
hlp.urlPath(); // /vielhuber/hlp
|
|
539
|
+
hlp.urlHash(); // #foo
|
|
540
|
+
hlp.urlArgs(); // ?foo=bar
|
|
541
|
+
|
|
542
|
+
// get url of current running script
|
|
543
|
+
hlp.urlOfScript(); // https://tld.com/wp-content/themes/dummy/script.js
|
|
544
|
+
hlp.pathOfScript(); // https://tld.com/wp-content/themes/dummy
|
|
545
|
+
|
|
546
|
+
// set 100vh for dom element (even for ios devices, see https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile-browsers.html)
|
|
547
|
+
hlp.real100vh('.foo')
|
|
548
|
+
|
|
549
|
+
// remove hover states on ios to prevent double clicks (see https://stackoverflow.com/questions/47802530/a-click-in-ios-safari-triggers-a-hover-state-on-element-underneath-where-you-t);
|
|
550
|
+
hlp.iOsRemoveHover();
|
|
551
|
+
|
|
552
|
+
// fade in/out dom element
|
|
553
|
+
hlp.fadeIn( document.querySelector('.foo'), 1000 ).then(() => { console.log('done'); });
|
|
554
|
+
hlp.fadeOut( document.querySelector('.foo'), 1000 ).then(() => { console.log('done'); });
|
|
555
|
+
|
|
556
|
+
// check if dom element is generally visible
|
|
557
|
+
hlp.isVisible( document.querySelector('.foo') )
|
|
558
|
+
// check if dom element is visible inside viewport
|
|
559
|
+
hlp.isVisibleInViewport( document.querySelector('.foo') )
|
|
560
|
+
|
|
561
|
+
// wait until a dom element has a certain css property
|
|
562
|
+
// this is quite useful when working with async loaded stylesheets like loadCSS
|
|
563
|
+
// .beacon is an element below the fold populated by the stylesheet
|
|
564
|
+
hlp.waitUntil('.beacon').then(() => { });
|
|
565
|
+
hlp.waitUntil('.beacon','position').then(() => { });
|
|
566
|
+
hlp.waitUntil('.beacon','position','relative').then(() => { });
|
|
567
|
+
|
|
568
|
+
// run a function for every dom element, even it is added dynamically later on
|
|
569
|
+
hlp.runForEl('.beacon', el => { el.style.backgroundColor = 'red'; });
|
|
570
|
+
|
|
571
|
+
// automatically change height of all textareas based on content
|
|
572
|
+
hlp.textareaAutoHeight()
|
|
573
|
+
hlp.textareaAutoHeight('.special')
|
|
574
|
+
hlp.textareaSetHeight( document.querySelector('.special') )
|
|
575
|
+
|
|
576
|
+
// load external js file in dom with promise
|
|
577
|
+
hlp.loadJs('https://apis.google.com/js/api.js').then(() => { console.log('done'); });
|
|
578
|
+
hlp.loadJs([
|
|
579
|
+
'https://www.tld.com/1.js',
|
|
580
|
+
'https://www.tld.com/2.js',
|
|
581
|
+
'https://www.tld.com/3.js'
|
|
582
|
+
]).then(() => { console.log('done'); });
|
|
583
|
+
hlp.loadJsSequentially([
|
|
584
|
+
'https://www.tld.com/1.js',
|
|
585
|
+
'https://www.tld.com/2.js',
|
|
586
|
+
'https://www.tld.com/3.js'
|
|
587
|
+
]).then(() => { console.log('done'); });
|
|
588
|
+
|
|
589
|
+
// run event after all images are loaded inside container
|
|
590
|
+
// works even after dynamic changes
|
|
591
|
+
// runs more than once (after each change)
|
|
592
|
+
// run this outside of window load / document ready events
|
|
593
|
+
hlp.triggerAfterAllImagesLoaded('.container', '.container__image', () => {});
|
|
594
|
+
|
|
595
|
+
// proper document read/load events, that are guaranteed to be run (also if the script is embedded via async)
|
|
596
|
+
hlp.ready().then(() => {});
|
|
597
|
+
hlp.load().then(() => {});
|
|
598
|
+
|
|
599
|
+
// easy ajax requests (without the fetch api; also works in ie11)
|
|
600
|
+
hlp.get('https://httpbin.org/anything').then((response) => { }).catch((error) => { }) // { "method": "GET", ... }
|
|
601
|
+
hlp.get('/relpath').then((response) => { }).catch((error) => { }) // if a full url is omitted, the call is done on the baseurl
|
|
602
|
+
hlp.get('https://httpbin.org/anything', { throttle: 1000 }).then((response) => { }).catch((error) => { }) // same but with a throttle of 1 second
|
|
603
|
+
hlp.get('https://httpbin.org/status/404', { allow_errors: false }).then((response) => { }) // deny 404 and other status codes as a response (inside catch())
|
|
604
|
+
hlp.post('https://httpbin.org/anything', { data: { foo: 'bar' } }).then((response) => { }).catch((error) => { }) // { "method": "POST", "data": {"foo": "bar"}, ... }
|
|
605
|
+
hlp.post('https://httpbin.org/anything', { data: { foo: 'bar' }, headers: { Bar: 'baz' } }).then((response) => { }).catch((error) => { }) // { "method": "POST", "headers" = { "Bar": "baz", ... }, ... }
|
|
606
|
+
let formData = new FormData(); formData.append('foo', 'bar'); hlp.post('https://httpbin.org/anything', { data: formData }) // this also works with FormData
|
|
607
|
+
|
|
608
|
+
// on resize vertically/horizontally
|
|
609
|
+
window.addEventListener('resize', () => {}) // inaccurate, triggers too often (especially when scrolling on android/iphone)
|
|
610
|
+
hlp.onResizeHorizontal(() => {}) // only triggers when viewport width changes; also triggers on first run
|
|
611
|
+
hlp.onResizeVertical(() => {}) // only triggers when viewport height changes; also triggers on first run
|
|
612
|
+
|
|
613
|
+
// add event listener once
|
|
614
|
+
hlp.addEventListenerOnce(
|
|
615
|
+
document.getElementById('foo'),
|
|
616
|
+
'click',
|
|
617
|
+
(event) => { alert('this gets called only once'); }
|
|
618
|
+
);
|
|
619
|
+
hlp.addEventListenerOnce(
|
|
620
|
+
document.getElementById('foo'),
|
|
621
|
+
'click',
|
|
622
|
+
(event) => { if(1==1) { return false; } } // if you return false, the event listener is not removed
|
|
623
|
+
);
|
|
624
|
+
|
|
625
|
+
// simple animations (via css transitions)
|
|
626
|
+
hlp.animate(
|
|
627
|
+
document.getElementById('.single'),
|
|
628
|
+
'transform: translateX(0)',
|
|
629
|
+
'transform: translateX(-100%)',
|
|
630
|
+
'ease-in-out',
|
|
631
|
+
1000
|
|
632
|
+
).then(() => { console.log('done'); });
|
|
633
|
+
hlp.animate(
|
|
634
|
+
document.querySelectorAll('.multiple'),
|
|
635
|
+
'opacity: 1; pointer-events:auto',
|
|
636
|
+
'opacity: 0; pointer-events:none',
|
|
637
|
+
'linear',
|
|
638
|
+
5000
|
|
639
|
+
).then(() => { console.log('done'); });
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
## php implementation
|
|
644
|
+
|
|
645
|
+
there is also a php implemenation [stringhelper](https://github.com/vielhuber/stringhelper) with similiar functions available.
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
## appendix
|
|
649
|
+
|
|
650
|
+
### existence matrix
|
|
651
|
+
|
|
652
|
+
| | <sub>hlp.x()</sub> | <sub>hlp.true()</sub> | <sub>hlp.false()</sub> | <sub>!== null</sub> | <sub>!= null</sub> | <sub>!== false</sub> | <sub>!= false</sub> | <sub>=== true</sub> | <sub>== true</sub> | <sub>typeof !== 'undefined'</sub> | <sub>!= undefined</sub> | <sub>!== undefined</sub> | <sub>if/else</sub> | <sub>ternary</sub> | <sub>length > 0</sub> | <sub>!= ''</sub> | <sub>!== ''</sub> |
|
|
653
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
654
|
+
| <sub>undefined</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
655
|
+
| <sub>null</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
656
|
+
| <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> |
|
|
657
|
+
| <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
658
|
+
| <sub>[]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> |
|
|
659
|
+
| <sub>['']</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> |
|
|
660
|
+
| <sub>0</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> |
|
|
661
|
+
| <sub>1</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
662
|
+
| <sub>-1</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
663
|
+
| <sub>'0'</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
664
|
+
| <sub>'1'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
665
|
+
| <sub>'-1'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
666
|
+
| <sub>''</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> |
|
|
667
|
+
| <sub>' '</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
668
|
+
| <sub>'null'</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
669
|
+
| <sub>'false'</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
670
|
+
| <sub>'true'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
671
|
+
| <sub>'str'</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
672
|
+
| <sub>[0,1]</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
673
|
+
| <sub>[0]</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
674
|
+
| <sub>{}</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
675
|
+
| <sub>un.known.property</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> |
|
|
676
|
+
| <sub>(()=>un.known.property)</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> |
|
|
677
|
+
|
|
678
|
+
### loose comparison matrix
|
|
679
|
+
|
|
680
|
+
| <sub>==</sub> | <sub>undefined</sub> | <sub>null</sub> | <sub>false</sub> | <sub>true</sub> | <sub>[]</sub> | <sub>['']</sub> | <sub>0</sub> | <sub>1</sub> | <sub>-1</sub> | <sub>'0'</sub> | <sub>'1'</sub> | <sub>'-1'</sub> | <sub>''</sub> | <sub>' '</sub> | <sub>'null'</sub> | <sub>'false'</sub> | <sub>'true'</sub> | <sub>'str'</sub> | <sub>[0,1]</sub> | <sub>[0]</sub> | <sub>{}</sub> | <sub>un.known.property</sub> | <sub>(()=>un.known.property)</sub> |
|
|
681
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
682
|
+
| <sub>undefined</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
683
|
+
| <sub>null</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
684
|
+
| <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
685
|
+
| <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
686
|
+
| <sub>[]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
687
|
+
| <sub>['']</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
688
|
+
| <sub>0</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
689
|
+
| <sub>1</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
690
|
+
| <sub>-1</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
691
|
+
| <sub>'0'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
692
|
+
| <sub>'1'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
693
|
+
| <sub>'-1'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
694
|
+
| <sub>''</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>true</sub> | <sub>true</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
695
|
+
| <sub>' '</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
696
|
+
| <sub>'null'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
697
|
+
| <sub>'false'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
698
|
+
| <sub>'true'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
699
|
+
| <sub>'str'</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
700
|
+
| <sub>[0,1]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
701
|
+
| <sub>[0]</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>false</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
702
|
+
| <sub>{}</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>true</sub> | <sub>error</sub> | <sub>false</sub> |
|
|
703
|
+
| <sub>un.known.property</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> | <sub>error</sub> |
|
|
704
|
+
| <sub>(()=>un.known.property)</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>false</sub> | <sub>error</sub> | <sub>true</sub> |
|