-
Notifications
You must be signed in to change notification settings - Fork 0
/
js_data_type.html
116 lines (95 loc) · 4.77 KB
/
js_data_type.html
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
<html>
<head>
<title>js 判断数据类型</title>
</head>
<body>
github: <a href="https://github.com/florida0723" target="_blank">github</a>
<br/>
js 判断数据类型
<script type="text/javascript">
function typeVal() {
return Object.prototype.toString.call(arguments[0]).slice(8, -1).toLowerCase();
}
console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function isArray(val) {
return Object.prototype.toString.call(val) === '[object Array]';
}
function isString(val) {
return typeof val === 'string';
}
function isNumber(val) {
return typeof val === 'number';
}
function isUndefined(val) {
return typeof val === 'undefined';
}
function isFunction(val) {
return typeof val === 'function';
}
function isObject(val) {
return val !== null && typeof val === 'object'
}
function isDate(val) {
return Object.prototype.toString.call(val) === '[object Date]';
}
function isFormData(val) {
return (typeof FormData !== 'undefined') && (val instanceof FormData);
}
function isFile(val) {
return Object.prototype.toString.call(val) === '[object File]';
}
function isBlob(val) {
return Object.prototype.toString.call(val) === '[object Blob]';
}
function isStream(val) {
return isObject(val) && isFunction(val.pipe);
}
function isArrayBuffer(val) {
return Object.prototype.toString.call(val) === '[object ArrayBuffer]';
}
function isArrayBufferView(val) {
var result;
if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
result = ArrayBuffer.isView(val);
} else {
result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
}
return result;
}
/*********************************** 我是分割线 ***********************************/
// 深度剖析Object.prototype.toString.call
//1、使用这种方式可以很好的区分各种类型,但是无法区分自定义对象类型,自定义类型可以采用instanceof区分
console.log(Object.prototype.toString.call({}) === "[object Object]");
//2、为什么这样就能区分呢? 那为什么不直接用obj.toString()呢?
console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
//3、obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?
// 这是因为toString为Object的原型方法,而Array ,function等类型作为Object的实例,都重写了toString方法。
// 不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....)。
// 而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型。
// 因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。
// 4、我们可以验证一下,将数组的toString方法删除,看看会是什么结果:
var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"
// 5、删除了Array的toString方法后,同样再采用arr.toString()方法调用时,不再有屏蔽Object原型方法的实例方法。
// 因此沿着原型链,arr最后调用了Object的toString方法,返回了和Object.prototype.toString.call(arr)相同的结果。
</script>
</body>
</html>