Skip to content

Commit 6d95beb

Browse files
type
1 parent 5833c8a commit 6d95beb

File tree

2 files changed

+427
-7
lines changed

2 files changed

+427
-7
lines changed

Note/type/type.js

+184-3
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,193 @@
1616

1717
(function() {
1818

19-
// 实际上 1. Number(1) 的原型 与 Number 对应的原型相同
19+
// instanceof 无法判断基本类型
2020
console.log(1 instanceof Number);
2121
console.log(Number(1) instanceof Number);
2222
console.log(new Number(1) instanceof Number); // new 使得对象为 Number 的实例
23-
console.log((1).prototype == Number.prototype && (Number(1)).prototype == Number.prototype);
2423
// false false true
2524

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+
26208

27-
})();

0 commit comments

Comments
 (0)