javascript有八种数据类型:undefined, Null, Boolean, Number, String, Symbol, Biglnt,Object。
symbol和Biglnt是ES6新增的数据类型:
这些数据类型分为基本数据类型和引用数据类型:
基本数据类型和引用数据类型的区别在于存储位置不同:
堆和栈存在于数据结构和操作系统内存中
数据结构中:
操作系统内:
(1)typeof
数组,对象,null都会被判断为object
console.log(typeof 2); // numberconsole.log(typeof true); // booleanconsole.log(typeof 'str'); // stringconsole.log(typeof []); // object console.log(typeof function(){}); // functionconsole.log(typeof {}); // objectconsole.log(typeof undefined); // undefinedconsole.log(typeof null); // object
(2)instanceof
instanceof可以正确判断对象的类型,其内部运行机制时在原型链中能否找到该类型的原型。
console.log(2 instanceof Number); // falseconsole.log(true instanceof Boolean); // false console.log('str' instanceof String); // false console.log([] instanceof Array); // trueconsole.log(function(){} instanceof Function); // trueconsole.log({} instanceof Object); //true
instanceof只能正确判断引用数据类型,而不能判断基本数据类型。
instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。
(3)constructor
console.log((2).constructor === Number); // trueconsole.log((true).constructor === Boolean); // trueconsole.log(('str').constructor === String); // trueconsole.log(([]).constructor === Array); // trueconsole.log((function() {}).constructor === Function); // trueconsole.log(({}).constructor === Object); // true
constructor有两个作用:一是判断数据的类型,二是对象实例通过constructor对象访问的构造函数,需要注意:如果创建一个对象来改变它们的原型,constructor就不能判断数据类型
function Fn(){};Fn.prototype = new Array();var f = new Fn();console.log(f.constructor===Fn); // falseconsole.log(f.constructor===Array); // true
(4)Object.prototype.toString.call()
Object.prototype.toString.call() 使用Object对象的原型方法toString来判断数据类型:var a = Object.prototype.toString;
console.log(a.call(2)); //[object Number]console.log(a.call(true)); //[object Boolean]
console.log(a.call('str')); //[object String]
console.log(a.call([])); //[object Array]
console.log(a.call(function(){})); //[object Function]
console.log(a.call({})); //[object Object]
console.log(a.call(undefined)); //[object Undefined]
console.log(a.call(null)); //[object Null]
let obj = [1,2,3]
Object.prototype.toString.call(obj).slice(8,-1) === 'Array'
let obj = [1, 2, 3]console.log(obj.__proto__ === Array.prototype)
fn() function fn() { let obj = [1, 2, 3] console.log(Array.isArray(obj)); }
let obj = [1, 2, 3] console.log(obj instanceof Array);
let obj = [1, 2, 3] console.log(Array.prototype.isPrototypeOf(obj));
undefined和null都是基本数据类型,这两个基本数据类型都只有一个值,就是undefined和null.
undefined代表的是未定义,null代表的是空对象。一般声明了变量但还没有定义的时候会返回undefined,null主要用于赋值给一些可能会对象的变量,作为初始化。
console.log(null == undefined); //true console.log(null === undefined); //false
let n1 = 0.1, n2 = 0.2console.log(n1 + n2) //0.30000000000000004
toFixed(num)方法可以把Number四舍五入为指定小数位的数字。
出现0.1+0.2 !== 0.3是因为计算机是通过二进制方式存储的,
函数isNaN接受参数,会尝试将这个参数转换为数值,任何不被转换为数值的值都会返回true,因此非数字值也会返回true,会影响NaN的判断。
函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确
使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较。
使用三等号(===)进行相等判断时,如果两边的类型不一致时,不会做强制类型准换,直接返回 false。
使用 Object.is 来进行相等判断时,一般情况下和三等号的判断相同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN 是相等的。
原文出处:数据类型