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