El uso de typeof para juzgar el tipo de datos en JavaScript solo puede distinguir cinco tipos básicos , a saber, "número", "cadena", "indefinido", "booleano" y "objeto" .
Para matrices, funciones y objetos , la relación es compleja y typeof devolverá uniformemente la cadena "objeto".
¿Cómo juzgar tipos complejos como objetos, matrices y funciones?
Para distinguir objetos, matrices y funciones, simplemente usar typeof no es suficiente. En JavaScript, puede usar el método Object.prototype.toString para juzgar.
Object.prototype.toString()
La función del método toString es devolver la forma de cadena de un objeto. Por defecto, se devuelve el tipo cadena . Por lo tanto, se puede utilizar para determinar el tipo de un valor.
como:
var o = {};
o.toString(); // "[object Object]"
El código anterior llama al método del objeto vacío toString
y el resultado devuelve una cadena object Object
, la segunda de las cuales Object
representa el constructor del valor. Esta es una forma muy útil de determinar el tipo de datos.
Sin embargo, las matrices, las cadenas, las funciones y los objetos de fecha anulan cada uno su propia versión del toString
método y anulan Object.prototype.toString
el método.
var arr = [];
arr.toString(); //''
[1, 2, 3].toString() // "1,2,3"
'123'.toString() // "123"
Encontramos que el objeto de instancia puede personalizar toString
el método y anular Object.prototype.toString
el método. A través call
del método de funciones, se pueden llamar métodos sobre cualquier valor Object.prototype.toString
para ayudarnos a determinar el tipo de este valor.
Object.prototype.toString.call(value)
ejemplo:
var arr = [];
console.log(Object.prototype.toString.call(arr))
// "[object Array]"
Dado que todo en JavaScript es un objeto y nada es una excepción, aplicar el método Object.prototype.toString.call() a todos los tipos de valores da como resultado lo siguiente:
console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call('123')) //[object String]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(true)) //[object Boolean]
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
console.log(Object.prototype.toString.call(function(){})) //[object Function]
Extensión: implementar la función de juzgar el tipo de objeto
//判断是否为函数
function isFunction(it) {
return Object.prototype.toString.call(it) === '[object Function]';
}
//判断是否为数组:
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}