JavaScript有哪些数据类型
共有八种数据类型:undefined、null、boolean、string、number、object、symbol、bigint
简单数据类型
又称为原始数据类型,直接存储在栈(stack)中的简单数据段,占据空间小、大小固定、属于被频繁使用的数据
string——字符串
由一系列的字符构成的数据,对某个东西进行描述。在使用字符串类型数据的使用,需要使用双引号:""或单引号:'',一单一双或者不加引号都会报错。
字符串有length属性,可以使用length方法获取自身长度
number——数字
用来表示数字的 ,任何数字都可以使用数值类型。比如商品价格、年份、年龄等,包含整数和浮点数(数值必须包含一个小数点,且小数点后面至少有一位数字,需要大于0)两种值以及特殊的非数字类型NaN
var n = NaN;
var a = 1;
// NaN表示一个本来要返回数字,但是由于某种原因,没有返回成功,就用NaN表示。
console.log(typeof(n)); // NaN
// NaN与任何值都不等,包括其本身;
console.log(n == NaN) // NaN
// NaN与其他任意值进行运算,都为NaN;
console.log(n + a); // NaN
isNaN()函数用于检查其参数是否是’非数字值’,如果是数值返回false,如果是非数值返回true
var a = 1;
var b = '我是字符串';
console.log(isNaN(a)); // false
console.log(isNaN(b)); // true
boolean——布尔值
该类型只有两个值:true和false,一般会在条件判断和循环等语句中来使用。
null——空值
null类型被看做空对象指针,null类型也是空的对象引用,当将来需要存储一个对象的时候,可以给其初始值赋为null。
// 初始赋值
var name = null,
obj = null
// 赋值
name = '张三'
obj = {
'key':'value'
}
undefined——未定义
如果一个变量通过var声明了,但是没有赋值,那么它的值就是undefined,表示变量在声明的时候没有初始值。
var name;
console.log(name); // undefined
// undefined 的数据类型是 ‘undefined’;
console.log(typeof name); // undefined
symbol——独一无二的值
创建后独一无二且不可变的数据类型,主要是为了解决可能出现的全局变量冲突问题
bigint——大数
因为js中的Number.MAX_SAFE_INTEGER表示最大安全数字,在数值范围内整数不会出现精度丢失,但是一旦超过这个范围,就会出现计算不准确的情况,这种时候就不得不依赖一些第三方库进行解决,因此官方提出bigint解决此问题。
复杂数据类型
又称为引用数据类型,存储在堆(heap)中的对象,占据空间大,大小不固定。通过存储在栈中的指向堆中实体地址的指针获取使用
数组、对象、函数,本质上都是object。
// 创建方式
// 对象字面量方式定义:
var a = {
name:"张三",
age:18,
sex:'男'
}
// 构造函数的方式定义:
var b = new Object();
b.name = '李四';
b.age = 28;
b.sex = '女'
console.log(b); // {name:"兔子",m:"吃草",age:14}
// 通过点语法和[中括号语法]获取对象里面的数据
console.log(a.age);
console.log(b['name']);;
类型转换
JavaScript 是弱类型语言,而且JavaScript声明变量的时候并没有预先确定的类型,变量的类型就是其值的类型,也就是说变量当前的类型由其值所决定,在进行加减乘除等操作运算中可能就发生了强制类型转换。虽然弱类型的这种不需要预先确定类型的特性给我们带来了便利,同时也会给我们带来困扰。
Boolean():可以将任意类型的数据转为布尔类型
// 等于false有且仅有:null、0、’‘、undefined、NaN
console.log(Boolean(null)); // false
console.log(Boolean(0)); // false
console.log(Boolean('')); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false
// 其余统一为true
console.log(Boolean(123));//ture
console.log(Boolean(’123‘));//ture
console.log(Boolean({}));//ture
console.log(Boolean([]));//ture
String():可以将任意类型的数据转为字符型
// 数字
var a = 123;
console.log(typeof(a)); // number
console.log(typeof(String(a))); // string
// NaN
var b = NaN;
console.log(typeof(b)); // number
console.log(typeof(String(b))); // string
// null
var c = null;
console.log(typeof(c)); // objcet
console.log(typeof(String(c))); // string
// 未定义类型的
var d = undefined;
console.log(typeof(d)); // undefined
console.log(typeof(String(d))); // string
// 布尔值
var e = true;
console.log(typeof(e)); // Boolean
console.log(typeof(String(e))); // string
// toString():除了null和undefined之外的数据都可用toString转换
var num = 123 ;
num.toString() // '123';
var str = true;
str.toString(); // 'ture';
// 隐式转换
console.log(123 + ''); // '123'
console.log(null + ''); // 'null'
console.log('' + undefined); // 'undefined'
Number();可以将任意类型数据转为数值型
// null 转 number: 结果为 0
console.log(Number(null)) // 0
// Undefined转number:结果为NaN
console.log(Number(undefined)) // NaN
var a;
console.log(Number(a)) // NaN
// 布尔 转 number 结果:true = 1,false = 0
console.log(Number(true)) // 1
console.log(Number(false)) // 0
// 空字符串 转 number 结果为 0
console.log(Number(' ')) // 0
// 非空字符串 转 number ,如果字符串里 的内容全部是有效数字,那么就转成对应的有效数字,否则,转number后就是NaN.数字前面有零的就默认隐藏0
console.log(Number('123')); // 123
console.log(Number('12.34')); // 12.34
console.log(Number('12.31.54')); // NaN
console.log(Number('123nx')); // NaN
console.log(Number('你好')); // NaN
console.log(Number('012138')); // 12138
JavaScript数据类型检测
typeof
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof 'str'); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof function(){}); // function
其中数组、对象、null都会返回object
instanceof
instanceof只能正确判断引用数据类型,不能判断基本数据类型,原理是判断能否在变量原型链中找到该类型的原型,可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log('str' instanceof String); // false
console.log(undefined instanceof undefined); // 报错
console.log(null instanceof Object); // false
console.log({} instanceof Object); // true
console.log([] instanceof Object); // true
console.log(function(){} instanceof Function); // true
constructor
constructor有两个作用,判断数据类型和实例对象通过constructor访问构造函数,但是如果创建一个对象改变它的原型,判断就不再准确
console.log((2).constructor === Number); // true
console.log(true.constructor === Boolean); // true
console.log('str'.constructor === String); // true
console.log({}.constructor === Object); // true
console.log([].constructor === Array); // true
console.log((function(){}).constructor === Function); // true
// 改变原型之后
function fn(){}
fn.prototype = new Array()
let f = new fn()
console.log(f.constructor === Function); // false
console.log(f.constructor === Array); // true
Object.prototype.toString
Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型
let to = Object.prototype.toString
console.log(to.call(2)); // [object Number]
console.log(to.call(true)); // [object Boolean]
console.log(to.call('str')); // [object String]
console.log(to.call(undefined)); // [object Undefined]
console.log(to.call(null)); // [object Null]
console.log(to.call([])); // [object Array]
console.log(to.call({})); // [object Object]
console.log(to.call(function(){})); // [object Function]
判断
Object.is()与比较操作符’==‘、’===‘的区别
双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转换后比较
console.log(2 == '2'); // true
console.log(0 == false); // true
console.log('1' == true); // true
console.log(NaN == NaN); // false
console.log(-0 == +0); // true
console.log(null == null); // true
三等号(===)进行判断不会做强制类型转换
console.log(2 === '2'); // false
console.log(0 === false); // false
console.log('1' === true); // false
console.log(NaN === NaN); // false
console.log(-0 === +0); // true
console.log(null === null); // true
Object.is()一般情况下与三等号相同,但也处理了一些特殊情况
console.log(Object.is(2,'2')); // false
console.log(Object.is(0,false)); // false
console.log(Object.is('1',true)); // false
console.log(Object.is(NaN,NaN)); // true
console.log(Object.is(-0,+0)); // false
console.log(Object.is(null,null)); // true
如何判断一个空对象
// 使用JSON自带的stringify方法判断
if(JSON.stringify(obj) == '{}'){
console.log('这是一个空对象');
}
// 使用ES6新增的方法object.keys()判断
if(Object.keys(obj).length < 1){
console.log('这是一个空对象');
}