16
16
17
17
( function ( ) {
18
18
19
- // 实际上 1. Number(1) 的原型 与 Number 对应的原型相同
19
+ // instanceof 无法判断基本类型
20
20
console . log ( 1 instanceof Number ) ;
21
21
console . log ( Number ( 1 ) instanceof Number ) ;
22
22
console . log ( new Number ( 1 ) instanceof Number ) ; // new 使得对象为 Number 的实例
23
- console . log ( ( 1 ) . prototype == Number . prototype && ( Number ( 1 ) ) . prototype == Number . prototype ) ;
24
23
// false false true
25
24
25
+ // __proto__ 是一组 getter/setter 函数, 用于访问对象内部的原型
26
+ // prototype 是对象继承属性方法的来源, 一般为了避免修改原型导致影响其他对象, 原型一般 new 实例
27
+ console . log ( ( 1 ) . __proto__ == Number . prototype && ( Number ( 1 ) ) . __proto__ . __proto__ == Number . prototype . __proto__ ) ; // true
28
+
29
+ function Person ( name ) {
30
+ this . name = name ;
31
+ }
32
+ const p = new Person ( 'somebody' ) ;
33
+ console . log ( p instanceof Person ) ; // true
34
+ console . log ( p . __proto__ === Person . prototype ) ; // true
35
+ console . log ( p . __proto__ . __proto__ === Object . prototype ) ; // true
36
+
37
+ // 模拟实现 instanceof, 实际上就是遍历对比原型
38
+ function isInstanceof ( obj , p ) {
39
+ if ( typeof obj !== 'object' ) return false ;
40
+ while ( obj ) {
41
+ if ( p . prototype === obj . __proto__ ) return true ;
42
+ obj = obj . __proto__ ;
43
+ }
44
+ return false ;
45
+ }
46
+ console . log ( isInstanceof ( p , Person ) ) ; // true
47
+
48
+ } ) ; //();
49
+
50
+ ( function ( ) {
51
+ // constructor 判断
52
+ console . log ( ( 1 ) . constructor ) ; // [Function: Number]
53
+ console . log ( '1' . constructor ) ; // [Function: String]
54
+ console . log ( ( true ) . constructor ) ; // [Function: Boolean]
55
+ console . log ( Symbol ( 's' ) . constructor ) ; // [Function: Symbol]
56
+ // console.log(null.constructor); // TypeError: Cannot read property 'constructor' of null
57
+ // console.log(undefined.constructor); // TypeError: Cannot read property 'constructor' of undefined
58
+ console . log ( { } . constructor ) ; // [Function: Object]
59
+ console . log ( [ ] . constructor ) ; // [Function: Array]
60
+ console . log ( new Set ( ) . constructor ) ; // [Function: Set]
61
+ console . log ( new Date ( ) . constructor ) ; // [Function: Date]
62
+ console . log ( ( ( ) => 1 ) . constructor ) ; // [Function: Function]
63
+
64
+ function Person ( ) { }
65
+ const p = new Person ( ) ;
66
+ console . log ( p . constructor ) ; // [Function: Person]
67
+
68
+ } ) ; //();
69
+
70
+ ( function ( ) {
71
+
72
+ const toString = Object . prototype . toString ;
73
+
74
+ console . log ( toString . call ( 1 ) ) ; // [object Number]
75
+ console . log ( toString . call ( '1' ) ) ; // [object String]
76
+ console . log ( toString . call ( true ) ) ; // [object Boolean]
77
+ console . log ( toString . call ( Symbol ( 's' ) ) ) ; // [object Symbol]
78
+ console . log ( toString . call ( null ) ) ; // [object Null]
79
+ console . log ( toString . call ( undefined ) ) ; // [object Undefined]
80
+ console . log ( toString . call ( { } ) ) ; // [object Object]
81
+ console . log ( toString . call ( [ ] ) ) ; // [object Array]
82
+ console . log ( toString . call ( new Set ( ) ) ) ; // [object Set]
83
+ console . log ( toString . call ( new Date ( ) ) ) ; // [object Date]
84
+ console . log ( toString . call ( ( ( ) => 1 ) ) ) ; // [object Function]
85
+
86
+ function Person ( ) { }
87
+ const p = new Person ( ) ;
88
+ console . log ( toString . call ( p ) ) ; // [object Object]
89
+ } ) ; //();
90
+
91
+
92
+ ( function ( ) {
93
+ // number +
94
+ console . log ( 1 + '1' ) ; // 11
95
+ console . log ( 1 + true ) ; // 2
96
+ console . log ( 1 + false ) ; // 1
97
+ console . log ( 1 + null ) ; // 1
98
+ console . log ( 1 + undefined ) ; // NaN
99
+
100
+ console . log ( '-------------------------' ) ;
101
+
102
+ // string + => string
103
+ console . log ( '1' + '1' ) ; // 11
104
+ console . log ( '1' + true ) ; // 1true
105
+ console . log ( '1' + false ) ; // 1false
106
+ console . log ( '1' + null ) ; // 1null
107
+ console . log ( '1' + undefined ) ; // 1undefined
108
+
109
+ console . log ( '-------------------------' ) ;
110
+
111
+ // number -
112
+ console . log ( 1 - '1' ) ; // 0
113
+ console . log ( 1 - true ) ; // 0
114
+ console . log ( 1 - false ) ; // 1
115
+ console . log ( 1 - null ) ; // 1
116
+ console . log ( 1 - undefined ) ; // NaN
117
+
118
+ console . log ( '-------------------------' ) ;
119
+
120
+ // string -
121
+ console . log ( '1' - '1' ) ; // 0
122
+ console . log ( '1' - true ) ; // 0
123
+ console . log ( '1' - false ) ; // 1
124
+ console . log ( '1' - null ) ; // 1
125
+ console . log ( '1' - undefined ) ; // NaN
126
+
127
+ console . log ( '-------------------------' ) ;
128
+
129
+ // other -
130
+ console . log ( true - true ) ; // 0
131
+ console . log ( true - false ) ; // 1
132
+ console . log ( true - null ) ; // 1
133
+ console . log ( true - undefined ) ; // NaN
134
+
135
+ console . log ( '-------------------------' ) ;
136
+
137
+ // 复杂类型
138
+ const a = {
139
+ valueOf ( ) {
140
+ return 1 ;
141
+ }
142
+ } ;
143
+ const b = {
144
+ toString ( ) {
145
+ return '2' ;
146
+ }
147
+ } ;
148
+ const c = {
149
+ valueOf ( ) {
150
+ return 3 ;
151
+ } ,
152
+ toString ( ) {
153
+ return '4' ;
154
+ }
155
+ }
156
+ console . log ( 1 + a ) ; // 2; -> a.valueOf
157
+ console . log ( 1 + b ) ; // 12; -> b.toString
158
+ console . log ( 1 + c ) ; // 4; -> c.valueOf
159
+ console . log ( "1" + a ) ; // 11;
160
+ console . log ( "1" + b ) ; // 12;
161
+ console . log ( "1" + c ) ; // 13;
162
+
163
+ console . log ( 1 - a ) ; // 0
164
+ console . log ( 1 - b ) ; // -1
165
+ console . log ( 1 - c ) ; // -2
166
+ console . log ( "1" - a ) ; // 0
167
+ console . log ( "1" - b ) ; // -1
168
+ console . log ( "1" - c ) ; // -2
169
+
170
+ } ) ; // ();
171
+
172
+ ( function ( ) {
173
+
174
+ console . log ( [ 10 ] == 10 ) ; // true; [10] == 10 => '10' == 10 => true
175
+ console . log ( '10' == 10 ) ;
176
+ console . log ( [ ] == 0 ) ; // true; [] == 0 => '' == 0 => Number('') == 0 => true
177
+ console . log ( true == 1 ) ; // true; true == 1 => Number(true) == 1 => true
178
+ console . log ( [ ] == false ) ; // true; [] == false => '' == false => '' == 0 => true
179
+ console . log ( ! [ ] == false ) ; // true; ![] == false => false == false => true
180
+ console . log ( '' == 0 ) ;
181
+ console . log ( '' == false ) ;
182
+ console . log ( null == false ) ; // false; null == false => null == 0 => false
183
+ console . log ( ! null == true ) ; // true; !null == true => true == true => true;
184
+ console . log ( null == undefined ) ; // true;
185
+
186
+
187
+ console . log ( null === undefined ) ; // false;
188
+ console . log ( NaN === NaN ) ; // false;
189
+ console . log ( 1 === 1 ) ; // true;
190
+ console . log ( + 0 === - 0 ) ; // true;
191
+ console . log ( undefined === undefined ) ; // true;
192
+ console . log ( null === null ) ; // true;
193
+ console . log ( 'aaab' === 'aaab' ) ; // true;
194
+ console . log ( Symbol . for ( '1' ) === Symbol . for ( '1' ) ) ; // true;
195
+ console . log ( [ ] === [ ] ) ; // false;
196
+ let a = b = [ ] ;
197
+ console . log ( a === b ) ; // true;
198
+
199
+ // 注意:
200
+ console . log ( [ ] == 0 ) ; // true;
201
+ console . log ( [ ] == [ ] ) ; // false; // 两侧类型相同,均为 object, 相当于 [] === []
202
+
203
+
204
+ } ) ( ) ;
205
+
206
+
207
+
26
208
27
- } ) ( ) ;
0 commit comments