开发过程中,总有一些情况,根据判断数据类型来区别执行后续操作,整理一下js的类型及类型的获取
数据类型
js的数据类型分为2种,分别是 基础类型 和 引用类型
基础类型: 基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
number:数字类型(-∞到∞;-Infinity到Infinity;负无穷大到无穷大,)
string:字符串类型(的值一般用单引号或者双引号括起来)
boolean:布尔类型(值只有两个真或假,true或者false; 数字类型的0就是false,1代表true )
null:空类型,值只有一个:null;(形象点说,例如number类型有0,1,2等无数个数值,而null类型只有null一个值)
undefined:未定义,值只有一个:undefined,如果一个变量结果是undefined和一个数字运算,结果NaN,不是一个数字,无意义
引用类型: javascript的引用数据类型是保存在堆内存中的对象。
Object: 通俗点说 就是对象 {}
Array:数组 []
Function: 方法函数 function()
RegExp:正则表达式
Date:时间类型
不知道是啥类型 先整理上,后续回展开调研,小白请忽略此区域
Arguments:是一个对应于传递给函数的参数的类数组对象。(官方是这么说的)
Error:var x=1a 错在变量不能以数字开头(我是一脸懵)
说明
① NaN是数字类型的,但是它又可以用isNaN()检测,isNaN() 函数用于检查其参数是否是非数字值
console.log(typeof(NaN) ) // number
console.log(isNaN(NaN) ) // true
②Infinity是数字类型的,代表无穷大
③Blob 是一种Javascript的对象类型。而实际上 、File 对象只是 blob 对象的一个更具体的版本,Blob 存储着大量的二进制数据,并且 Blob 的 size 和 type 属性,都会被 File 对象所继承
④什么情况下的结果是undefined
--变量申明了,没有赋值,结果是undefined
--函数没有明确返回值,如果接收了,结果也是undefined
数据类型与引用类型的区别
① 引用类型值可添加属性和方法,基本类型值不可以。
② 赋值变量值时
基本类型会在变量对象上创建一个新值,再复制给新变量。此后,两个变量的任何操作都互不影响
引用类型是将存储在变量对象的值复制一份给新变量,但是两个变量的值都指向存储在堆中的一个对象,牵一发而动全身
获取数据类型的方法
typeof: 根据typeof判断对象也不太准确
表达式 返回值
typeof undefined 'undefined'
typeof null 'object'
typeof true 'boolean'
typeof 123 'number'
typeof "abc" 'string'
typeof function() {} 'function'
typeof {} 'object'
typeof [] 'object'
Object.prototype.toString.call: 建议使用此方式
// Boolean 类型,tag 为 "Boolean"
Object.prototype.toString.call(true); // => "[object Boolean]"
// Number 类型,tag 为 "Number"
Object.prototype.toString.call(1); // => "[object Boolean]"
// String 类型,tag 为 "String"
Object.prototype.toString.call(""); // => "[object String]"
// Array 类型,tag 为 "String"
Object.prototype.toString.call([]); // => "[object Array]"
// Arguments 类型,tag 为 "Arguments"
Object.prototype.toString.call((function() {
return arguments;
})()); // => "[object Arguments]"
// Function 类型, tag 为 "Function"
Object.prototype.toString.call(function(){}); // => "[object Function]"
// Error 类型(包含子类型),tag 为 "Error"
Object.prototype.toString.call(new Error()); // => "[object Error]"
// RegExp 类型,tag 为 "RegExp"
Object.prototype.toString.call(/\d+/); // => "[object RegExp]"
// Date 类型,tag 为 "Date"
Object.prototype.toString.call(new Date()); // => "[object Date]"
// 其他类型,tag 为 "Object"
Object.prototype.toString.call(new class {}); // => "[object Object]"