typeof 和instanceof Object.prototype.toString.call(),cunstrutor
时间: 2024-06-03 11:08:20 浏览: 184
typeof是JavaScript中的一个操作符,用于确定一个值的数据类型,返回值为字符串类型。例如,typeof "hello"会返回"string",typeof 123会返回"number"。
instanceof是JavaScript中的一个操作符,用于检查一个对象是否是某种类型的实例,返回值为布尔类型。例如,"hello" instanceof String会返回false,因为"hello"是一个字符串字面量而不是String对象的实例,而new String("hello") instanceof String会返回true。
Object.prototype.toString.call()是一种常用的方法,可以确定一个值的具体类型。它会返回一个以"[object 类型]"形式表示的字符串,其中类型就是值的具体类型。例如,Object.prototype.toString.call("hello")会返回"[object String]"。
constructor是JavaScript对象的一个属性,指向创建该对象的构造函数。例如,var str = new String("hello"),那么str.constructor就指向String构造函数。可以使用constructor来确定一个对象的类型。例如,if (str.constructor === String) { ... }。
相关问题
typeof 和instanceof Object.prototype.toString.call()
typeof用于获取一个值的数据类型,返回一个字符串。
例如:
typeof 123 // "number"
typeof "hello" // "string"
typeof true // "boolean"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
typeof undefined // "undefined"
typeof function(){} // "function"
instanceof用于判断一个对象是否是某个构造函数创建的实例,返回一个布尔值。
例如:
var arr = [1, 2, 3];
arr instanceof Array // true
arr instanceof Object // true
arr instanceof Date // false
var now = new Date();
now instanceof Date // true
now instanceof Object // true
now instanceof Array // false
Object.prototype.toString.call()可以获取一个值的详细类型信息,返回一个字符串。
例如:
Object.prototype.toString.call(123) // "[object Number]"
Object.prototype.toString.call("hello") // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call(new Date()) // "[object Date]"
使用 `instanceof` 和 `Object.prototype.toString.call` 之间的主要区别是什么?
### `instanceof` 与 `Object.prototype.toString.call` 的区别
在 JavaScript 中,判断数据类型时,`instanceof` 和 `Object.prototype.toString.call` 是两种常用但用途不同的方法。
#### `instanceof`
该操作符用于检测一个对象是否是某个构造函数的实例。它基于原型链进行判断,因此可以识别继承关系。例如,数组也是对象,因此 `[] instanceof Object` 返回 `true` [^1]。
```javascript
let arr = [];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
```
`instanceof` 的局限性在于无法准确区分原始类型(如 `number`、`string`、`boolean`)以及 `null` 和 `undefined`,因为它仅适用于对象和函数等引用类型 [^2]。
#### `Object.prototype.toString.call`
这种方法提供了一种更通用且精确的方式来判断所有数据类型,包括基本类型和复杂类型。通过调用 `Object.prototype.toString` 并将目标值作为上下文传入,可以获得 `[object Type]` 格式的字符串,其中 `Type` 表示具体的类型名称 [^3]。
```javascript
console.log(Object.prototype.toString.call(10)); // [object Number]
console.log(Object.prototype.toString.call('hello')); // [object String]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(function() {})); // [object Function]
```
相比 `instanceof`,`Object.prototype.toString.call` 不依赖于原型链,也不受对象自定义 `toString` 方法的影响,因此更适合用于跨环境或不确定类型的场景 [^4]。
#### 主要区别总结
- **适用范围**:`instanceof` 仅适用于对象和函数等引用类型,而 `Object.prototype.toString.call` 可以处理所有类型,包括原始值。
- **继承关系**:`instanceof` 基于原型链判断,能够识别继承关系;`Object.prototype.toString.call` 则直接返回具体类型标签,不涉及继承。
- **准确性**:对于某些特殊值(如 `null` 和 `undefined`),`typeof` 和 `instanceof` 都存在缺陷,而 `Object.prototype.toString.call` 能够准确返回它们的类型标识符 [^2]。
---
###
阅读全文
相关推荐

















