JavaScript中有几种数据类型?
- String
- Number
- Boolean
- undefined
- null
- Symbol
- BigInt
- Object
- Function
- Regexp
- Math
- Date
- Array
typeof
typeof "1"; // "string"
typeof 1; // "number"
typeof true; // "boolean"
typeof 100n; // "bigint"
typeof undefined; // "undefined"
typeof null; // "object"
typeof function () {}; // "function"
typeof {}; // "object"
typeof []; // "object"
typeof new Date(); // "object"
typeof的问题
- 引用数据类型除了
function
可以正常检测,其他结果都是object typeof null === object
这是一个历史悠久的bug
instanceof
function Person(name) {
this.name = name
}
const p = new Person('tianzhen')
p instanceof Person // true
[] instance Array // true
{} instance Object // true
1 instanceof Number // false
instanceof
判断规则:左边是否是右边的实例,p的原型链上是否存在Person的构造函数
推荐阅读:深入理解javascript原型和闭包(5)——instanceof
instanceof的问题
- 只能检测对象类型
- 如果在iframe中使用instanceof检测父窗口的数据类型存在bug
constructor
(1).constructor // ƒ Number() { [native code] }
'1'.constructor // ƒ String() { [native code] }
true.constructor // ƒ Boolean() { [native code] }
Symbol('1').constructor // ƒ Symbol() { [native code] }
[].constructor // ƒ Array() { [native code] }
{}.constructor // ƒ Object() { [native code] }
(function(){}).constructor // ƒ Function() { [native code] }
undefined.constructor // Uncaught TypeError: Cannot read properties of undefined (reading 'constructor')
null.constructor // Uncaught TypeError: Cannot read properties of null (reading 'constructor')
可以使用
constructor.name
拿到函数名
constructor的问题
- 不能检测
undefined
,null
Object.prototype.toString.call
Object.prototype.toString.call(1); // '[object Number]'
Object.prototype.toString.call(""); // '[object String]'
Object.prototype.toString.call(true); // '[object Boolean]'
Object.prototype.toString.call([]); // '[object Array]'
Object.prototype.toString.call({}); // '[object Object]'
Object.prototype.toString.call(Symbol("")); // '[object Symbol]'
Object.prototype.toString.call(null); // '[object Null]'
Object.prototype.toString.call(Undefined); // '[object Undefined]'
Object.prototype.toString.call
可以完美解决以上存在的问题,所以也有人称为类型检测的终极方案