JavaScript 有以下几种基本数据类型
- Boolean
有两个值 true 和 false - Null
只有一个 null 值 - Undefined
一个没有被赋值的变量会有个默认值 undefined - Number
表示数字,整数浮点数都行,还有一些带符号的值 +Infinity,-Infinity 和 NaN(非数值,Not-a-Number)
要检查值是否大于或小于 +/-Infinity,你可以使用常量 Number.MAX_VALUE 和 Number.MIN_VALUE。另外在 ECMAScript 6 中,你也可以通过 Number.isSafeInteger() 方法还有 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 来检查值是否在双精度浮点数的取值范围内。 超出这个范围,JavaScript 中的数字不再安全了,也就是只有 second mathematical interger 可以在 JavaScript 数字类型中正确表现。
-
String
用于表示文本数据,是一组 16 位的无符号整数值的‘‘元素’’,每个字符占据字符串的位置,第一个元素的索引为 0,下一索引为 1,依次类推。 -
Symbol
符号类型是 ES6 新定义的,是唯一的并且不可修改的,并且也可以用来作为 Object 的 key 的值 -
Object
对象可以被看作一组属性的集合
数组是一种使用整数作为键属性和长度属性之间关联的常规对象
不同数据类型之间怎么判断?
- typeof 只能检测基本数据类型,对 null 有 bug,
typeof null //object
- instanceof 适用于检测对象,基于原型链运作
- constructor 指向的时最初创建者,容易改写,不适合做类型判断
- toString 适用内置的 JavaScript 类型。
如果要判断的时基本数据类型或 JavaScript 内置对象,使用toString
如果要判断的是自定义类型,使用instanceof
如何判断数组是数组?
- 使用 typeof 操作符来判断
Value typeof
--------------------------
Undefined undefined
Null object
Boolean boolean
Number number
String string
Symbol symbol
Function Object function
Any other Object object
数组,对象,null 等用 typeof 返回的都是 object 类型,我们并没有办法具体的区分。
- 使用 instanceof 判断
instanceof 可以用来判断某个构造函数的 prototype 属性所指向的对象是否存在于另外一个要检测对象的原型链上。
const a = [];
const b = {};
console.log(a instanceof Array); //true
console.log(a instanceof Object); //true,在数组的原型链上也能找到 Object 构造函数
console.log(b instanceof Array); //fasle
- 用 constructor 判断
实例化数组拥有一个 constructor 属性,这个属性指向生成这个数组的方法。
const a = [];
console.log(a.constructor); // Function Array
以上代码说明,数组是有一个叫 Array 的函数实例化的。
但是,constructor 属性是可以修改的,如果不小心改写了 constructor 属性的话,那么这种方法就无法真正判断出数组。
const a = [];
//改写 constructor 属性
a.constructor = Object;
console.log(a.constructor == Array); //false
console.log(a.constructor == Object); //true
console.log(a instanceof Array); //true 真正判断出
这种方法也不是非常靠谱。
- 用 Object 的 toString() 方法判断
每一个继承自 Object 的对象都有 toString 的方法
const a = [1,2,3];
const b = {name:'bob',age:12};
Object.prototype.toString.call(a); //'[object Array]'
Object.prototype.toString.call(b); //'[object Object]'
这样我们就可以自己写一个方法来判断是否为数组
const isArray = (something)=>{
return Object.prototype.toString.call(something) === '[object Array]';
}
cosnt a = [];
const b = {};
isArray(a);//true
isArray(b);//false
- 用 Array 对象的 isArray 方法判断
这是目前最靠谱的方法了
const a = [1,2,3];
const b = {name:'bob',age:12};
Array.isArray(a); //true
Array.isArray(b); //false