JavaScript 的数据类型分为两大类:
值类型(基本类型):字符串(String)、数字(Number) 、布尔(Boolean) 、对空(Null)、未定义(Undefined)、Symbol(ES6新增)。
引用数据类型:对象(Object)、数组(Array)、函数(Function)、日期(Date)、正则表达式 (RegExp)、Set(ES6新增)、Map(ES6新增)
值类型(基本类型)
在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
值类型是按值访问的,其值存储在栈内存中,栈内存的优势是,存取速度比堆内存要快
- 字符串(String)
通常, JavaScript 字符串是原始值,可以使用字符创建:
var x = "John";
typeof x // 返回 String
但我们也可以使用 new 关键字将字符串定义为一个对象:
var y = new String("John");
typeof y // 返回 Object
不要创建 String 对象。它会拖慢执行速度,并可能产生其他副作用:
(x === y) // 结果为 false,因为 x 是字符串,y 是对象
将其他数据类型转换为String类型,可以使用String()和 toString()。
这两个方法的区别是:
String()可以转任何类。null,undefined 转换后为null和undefined。
而toString()方法不能转Null,undefined两种类型。
- 布尔(Boolean)
Boolean(布尔)对象用于将非布尔值转换为布尔值(true 或者 false)。
使用 new 关键字创建 Boolean 对象
var x=new Boolean();
直接创建
var y= true;
检查布尔对象是 true 还是 false
布尔对象 | 布尔值 |
---|---|
0 | false |
-0 | false |
null | false |
“” | false |
false | false |
undefined | false |
NaN | false |
“false”(当变量值为字符串 “false” 时) | true |
1 | true |
其余 | 都为true |
- 数字(Number)
数字可以是数字或者对象
var x = 123;
var y = new Number(123);
typeof(x) // 返回 Number
typeof(y) // 返回 Object
(x === y) // 为 false,因为 x 是一个数字,y 是一个对象
JavaScript 不是类型语言。与许多其他编程语言不同,JavaScript 不定义不同类型的数字,比如整数、短、长、浮点等等。在JavaScript中,数字不分为整数类型和浮点型类型,所有的数字都是浮点型类型,所有 JavaScript 数字均为 64 位。
JavaScript 数字可以使用也可以不使用小数点来书写:
var pi=3.14; // 使用小数点
var x=34; // 不使用小数点
什么是浮点型数值:浮点数数值必须包含一个小数点,且小数点后面至少有一位数字
NaN - 非数字值
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。你可以使用 isNaN() 全局函数来判断一个值是否是 NaN 值。
isNaN() 函数用于检查其参数是否是非数字值。
isNaN(123) //false isNaN("hello") //true
var x = 1000 / "Apple";
isNaN(x); // 返回 true
var y = 100 / "1000";
isNaN(y); // 返回 false
- Symbol(ES6新增)
Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
为什么说Symbol是原始类型,而不是对象类型呢?因为Symbol是没有构造函数constructor的,不支持new方法,不能通过new Symbol()获得实例
- 未定义(Undefined)
使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined,即:Undefined 这个值表示变量不含有值
Null 和 Undefined 是基本数据类型中的两个特殊数据类型
undefined是Undefined类型中的唯一一个值
var x;
console.log(x);//undefined
- 对空(Null)
null类型被看做空对象指针,null类型也是空的对象引用
一般用在你不知道给y定义什么数据,这个时候可以先存一个空值,可以通过将变量的值设置为 null 来清空变量来节约内存空间。
同样地,null是Null类型中的唯一一个值
var y = null;
console.log(y);//null
当您声明新变量时,可以使用关键词 “new” 来声明其类型:
var carname = new String;
var x= new Number;
var y= new Boolean;
var cars= new Array;
var person= new Object;
JavaScript 变量均为对象。当您声明一个变量时,就创建了一个新的对象。
引用数据类型
对象类型是按引用访问的,通过指针访问对象。对象可以new出来,所以对象类型都有构造函数。
- 对象(Object)
我们看到的大多数类型值都是Object类型的实例,创建Object实例的方式有两种。
第一种是使用new操作符后跟Object()构造函数,如下所示
var person = new Object();//不过我们一般也不会这么写一个普通对象
person.name = "Micheal";
person.age = 24;
第二种方式是使用对象字面量表示法,如下所示
var person =
name : "Micheal",
age : 24
};
对象属性有两种寻址方式:
name = person.name;
name = person["name"];
- 数组(Array)
数组的每一项可以用来保存任何类型的数据,也就是说,
可以用数组的第一个位置来保存字符串,第二个位置保存数值,第三个位置保存对象…另外,数组的大小是可以动态调整的。创建数组的基本方式有两种:
第一种是使用new操作符后跟Array()构造函数,如下所示
var colors = new Array("red","blue","yellow");
或
var cars=new Array();
cars[0]="red";
cars[1]="blue";
cars[2]="yellow";
第二种是使用数组字面量表示法,如下所示
var colors = ["red","blue","yellow"];
- 函数(Function)
每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。
函数通常是使用函数声明语法定义的,如下所示
function sum(num1,num2){
return num1 + num2;
};
这和使用函数表达式定义函数的方式相差无几。
var sun = function (){
return sum1 + sum2;
};
- 日期(Date)
Date 对象用于处理日期和时间。 可以通过 new 关键词来定义 Date 对象
var today = new Date()
var d1 = new Date("October 13, 1975 11:13:00")
var d2 = new Date(79,5,24)
var d3 = new Date(79,5,24,11,33,0)
- 正则表达式 (RegExp)
RegExp:是正则表达式(regular expression)的简写
注意:当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)。
比如,以下是等价的:
var re = new RegExp("\\w+");
var re = /\w+/;
- Set(ES6新增)
set,map都是构造函数,需要new,才能使用
Set 是es6中新的引用数据类型,类似于数组,但是成员是唯一的 ,所以可以用来去重
const set = new Set([1,2,3,4,5,6,5]);
console.log(set);
let newSet = new Set();
//添加 add
newSet.add("5").add(5);
console.log(newSet);
//删除 delete
newSet.delete(5);
console.log(newSet);
//是否含有某元素 has
console.log(newSet.has("5")); //true;
//清除所有 clear
newSet.clear();
console.log(newSet);
//size Set的长度 和数组的length差不多
注意:Set内部的判断机制是 === ,undefined 与 undefined 是恒等的,所以不重复,NaN 与 NaN 是不恒等的,但是在 Set 中认为NaN与NaN相等,所有只能存在一个,不重复
let newSet = new Set();
newSet.add(NaN).add(NaN).add(1).add(1);
console.log(newSet);
- Map(ES6新增)
Map 也是es6中新引用的数据类型,类似于对象。
但对象的键只能是字符串或者symbols,但Map的键可以是任意值
let map = new Map([['name','张三']]);
//添加新元素 set
map.set("age","18");
console.log(map);
//查找特定的键并返回值 get
console.log(map.get("age"));
//查找是否有这个键 has
console.log(map.has("age"));
//删除某个键 delete
map.delete("age");
console.log(map);
//删除所有键 clear
console.log(map.clear());
如何知道Set和Map是新的引用数据类型
let set = new Set();
let map = new Map();
console.log(Object.prototype.toString.call(set)) //"[object Set]"
console.log(set instanceof Set) //true
数据类型的判断
- typeof()
typeof操作符返回一个字符串,表示未经计算的操作数的类型
数据类型 | 运算结果 |
---|---|
Undefined | “undefined” |
Null | “object” (null表示一个空对象引用) |
Boolean | “boolean” |
Number | “number” |
“number” (NaN 是 Number 中的一种,非Number) | |
String | “string” |
Symbol | “symbol” |
Function | “function” |
其他对象 | “object” |
typeof得到的结果无法判断出数组,普通对象,其他特殊对象
- toString()
- instanceOf()
参考:https://cloud.tencent.com/developer/article/1659035
引深其他知识点:
1.map数据类型
2.js栈内存和堆内存
3.js 深拷贝和浅拷贝
4.数据类型之间的相互转换
5.json对象