JS的数据类型

JavaScript 的数据类型分为两大类:
值类型(基本类型):字符串(String)、数字(Number) 、布尔(Boolean) 、对空(Null)、未定义(Undefined)、Symbol(ES6新增)。

引用数据类型:对象(Object)、数组(Array)、函数(Function)、日期(Date)、正则表达式 (RegExp)、Set(ES6新增)、Map(ES6新增)

值类型(基本类型)

在js引擎中对变量的存储主要有两种位置,堆内存和栈内存

值类型是按值访问的,其值存储在栈内存中,栈内存的优势是,存取速度比堆内存要快

  1. 字符串(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两种类型。

  1. 布尔(Boolean)

Boolean(布尔)对象用于将非布尔值转换为布尔值(true 或者 false)。

使用 new 关键字创建 Boolean 对象
var x=new Boolean();
直接创建
var y= true;

检查布尔对象是 true 还是 false

布尔对象布尔值
0false
-0false
nullfalse
“”false
falsefalse
undefinedfalse
NaNfalse
“false”(当变量值为字符串 “false” 时)true
1true
其余都为true
  1. 数字(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
  1. Symbol(ES6新增)

Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
为什么说Symbol是原始类型,而不是对象类型呢?因为Symbol是没有构造函数constructor的,不支持new方法,不能通过new Symbol()获得实例

  1. 未定义(Undefined)

使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined,即:Undefined 这个值表示变量不含有值
Null 和 Undefined 是基本数据类型中的两个特殊数据类型
undefined是Undefined类型中的唯一一个值

var x;
console.log(x);//undefined
  1. 对空(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出来,所以对象类型都有构造函数。

  1. 对象(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"];
  1. 数组(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"];
  1. 函数(Function)

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。

函数通常是使用函数声明语法定义的,如下所示

function sum(num1,num2){
  return num1 + num2;
};

这和使用函数表达式定义函数的方式相差无几。

var sun = function (){
  return sum1 + sum2;
};
  1. 日期(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)
  1. 正则表达式 (RegExp)

RegExp:是正则表达式(regular expression)的简写

注意:当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)。
比如,以下是等价的:

var re = new RegExp("\\w+");
var re = /\w+/;
  1. 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);
  1. 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

数据类型的判断

  1. typeof()
    typeof操作符返回一个字符串,表示未经计算的操作数的类型
数据类型运算结果
Undefined“undefined”
Null“object” (null表示一个空对象引用)
Boolean“boolean”
Number“number”
NaN“number” (NaN 是 Number 中的一种,非Number)
String“string”
Symbol“symbol”
Function“function”
其他对象“object”

typeof得到的结果无法判断出数组,普通对象,其他特殊对象

  1. toString()
  2. instanceOf()

参考:https://cloud.tencent.com/developer/article/1659035
引深其他知识点:
1.map数据类型
2.js栈内存和堆内存
3.js 深拷贝和浅拷贝
4.数据类型之间的相互转换
5.json对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值