JavaScript的数据类型,想到的是7种基本数据类型
基本类型
Undefined
Null
Boolean
String
Number
Symbol
引用类型
Object
类型说明
有空再写了~
type of 类型和 运行时类型
这就要从 Object.prototype.toString.call(obj)说起了。
Object.prototype.toString.call(obj)可以检测传入对象obj的数据类型,但是他和常用的 type of 又有一些不同。
JavaScript 的对象类型都继承自Object,但是每个对象的toString会被改写。
可以参考以下尝试验证过程
let arr_0 = ['a', 1, 2]
console.log(arr_0.toString()) // a,1,2
console.log(Array.prototype.hasOwnProperty('toString')) // true 这里还有toString 方法
delete Array.prototype.toString // 删除数组的toString方法
console.log(Array.prototype.hasOwnProperty('toString')) // false- 数组的toString已经被删除了
console.log(arr_0.toString()) // [object Array]
所以,不同类型的数据在使用toString()方法的时候,会因为类在继承Object的时候改写了toString()方法,表现出不同的结果
整理了个表格备忘
有兴趣的同学可以自己试一试下面的代码
function getType2String(target) {
return Object.prototype.toString.call(target)
}
function getRow(target) {
return {
"值": target,
"typeof 结果": typeof target,
"prototype.toString.call 结果": getType2String(target),
"toString 结果": target && target.toString ? target.toString() : '没有'
}
}
console.table({
null: getRow(null),
'Symbol(s1)': getRow(Symbol('s1')),
'[]': getRow([]),
'{}': getRow({}),
'function(){}': getRow(function () { }),
1: getRow(1),
ab: getRow('ab'),
true: getRow(true),
Object: getRow(Object),
'void 0': getRow(void 0),
undefined: getRow(undefined),
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。