类型
JavaScript 中有七种内置类型:
空值 (null)
未定义 (undefined)
布尔值 (boolean)
数字 (number)
字符串 (string)
符号 (symbol,ES6中新增)
对象 (object) :复杂数据类型
typeof
typeof常常被用做判断基本类型,但它不能判断复杂数据类型。
typeof undefined; // undefined
typeof []; // object
typeof '123'; // string
注意点:
- 当操作数为null时。
typeof null; // object
- NaN(not a number)会被判断为
number
typeof NaN; //number
typeof 1/0; // NaN
- Symbol
typeof Symbol('foo'); //symbol
- type可以判断函数对象
typeof function(){} === 'function';
typeof Math.sin === 'function';
从技术角度讲,函数在ECMAScript
中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的。在实际的使用过程中有必要区分Object
和Function
,所以在typeof
这里实现了
- 它不能区分对象、数组、正则,会返回"
object
"
typeof [1,2,3]; //object
instanceof
-
instanceof
操作符返回一个布尔值
,主要用来表明指定对象
是否为某个构造函数的实例
。 - 因为
instanceof
对整个原型链上的对象都有效,所以同一个实例对象,可能会对多个构造函数都返回true
。
const s = new String('123');
s instanceof String; // true
s instanceof Object; // true
- 利用instanceof操作符,我们可以对自定义的对象进行判断:
function Animal (name) {
this.name = name
}
const fizz = new Animal('fizz');
fizz instanceof Animal // true
注意,instanceof对象只能用于复杂数据类型(数组,对象等),不能用于简单数据类型(布尔值,数字,字符串等)。此外,null和undefined都不是对象,所以instanceof 总是返回false。
constructor属性
-
prototype
对象有一个constructor
属性,默认指向prototype
对象所在的构造函数。 - 由于
constructor
属性是定义在原型(prototype)对象
上面,意味着可以被所有实例对象继承
。
function A(){};
var a=new A();
console.log(a.constructor===A) //true
console.log(a.constructor===Array) //false
var a = new Array();
a.constructor; //Arrar
Arrar.constructor; //Function
![](https://img.haomeiwen.com/i17237086/362f8b1382216e81.png)
toString
使用 Object.prototype.toString 方法, 可以获取到变量的准确的类型.
function foo(){};
Object.prototype.toString.call(1); '[object Number]'
Object.prototype.toString.call('1'); '[object String]'
Object.prototype.toString.call(NaN); '[object Number]'
Object.prototype.toString.call(foo); '[object Function]'
Object.prototype.toString.call([1,2,3]); '[object Array]'
Object.prototype.toString.call(undefined); '[object Undefined]'
Object.prototype.toString.call(null); '[object Null]'
Object.prototype.toString.call(true); '[object Boolean]'
Object.prototype.toString.call(Array); `[object Function]`
....
Object.prototype.toString
的原理是当调用的时候, 就取值内部的 [[Class]]
属性值, 然后拼接成 '[object ' + [[Class]] + ']'
这样的字符串并返回. 然后我们使用call
方法来获取任何值的数据类型.
网友评论