-
Notifications
You must be signed in to change notification settings - Fork 5
/
02-types.js
132 lines (100 loc) · 2.08 KB
/
02-types.js
1
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
*
* typeof operator
*
*/
// typeof always returns a "string"
var v;
typeof v; // "undefined"
var v = "1";
typeof v; // "string"
v = 2;
typeof v; // "number"
v = true;
typeof v; // "boolean"
v = {};
typeof v; // "object"
v = Symbol();
typeof v; // "symbol"
typeof doesntExist; // "undefined"
var v = null;
typeof v; // "object"
v = function () {};
typeof v; // "function"
v = [1, 2, 3];
typeof v; // "object"
/**
*
* BigInt
*
*/
var x = 42n;
typeof x; // "bigint"
/**
*
* NaN & isNaN
*
*/
// NaN = it is not not-number, it is invalid number
var myAge = Number("0o46"); // 38
var myNextAge = Number("39"); // 39
var myCatsAge = Number("n/a"); // NaN
myAge - "my sons age"; // NaN
myCatsAge === myCatsAge; // false OOPS
isNaN(myAge); // false
isNaN(myCatsAge); // true
isNaN("my sons age"); // true OOPS
Number.isNaN(myCatsAge); // true
Number.isNaN("my sons age"); // false
/**
*
* Negative zero
*
*/
var trendRate = -0;
trendRate === -0; // true
trendRate.toString(); // "0"
trendRate === 0; // true
trendRate < 0; // false
trendRate > 0; // false
// Best way to check whether two values are the same value
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
Object.is(trendRate, -0); // true
Object.is(trendRate, 0); // false
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
Math.sign(-3); // -1
Math.sign(3); // 1
Math.sign(-0); // -0 ???
Math.sign(0); // 0 ???
// Fix Math.sign
function sign(v) {
return v !== 0 ? Math.sign(v) : Object.is(v, -0) ? -1 : 1;
}
Math.sign(-3); // -1
Math.sign(3); // 1
Math.sign(-0); // -1
Math.sign(0); // 1
function formatTrend(trendRate) {
var direction = trendRate < 0 || Object.is(trendRate, -0) ? "↓" : "↑";
return `${direction} ${Math.abs(trendRate)}`;
}
formatTrend(-3); // "↓ 3"
formatTrend(3); // "↑ 3"
formatTrend(-0); // "↓ 0"
formatTrend(0); // "↑ 0"
/**
*
* Fundamental objects
*
*/
// When to use new keyword?
Object();
Array();
Function();
Date();
RegExp();
Error();
// Don't use new keyword
String();
Number();
Boolean();