js 的简单数据类型和复杂数据类型

181 阅读3分钟
基本数据类型包括:Number、String、Boolean、Null、Undefined、Symbol。(栈)
引用数据类型包括:Object、Array、Function。(堆)

一、基本数据类型

基本数据类型主要存放在栈内存中。基本数据类型变量赋值给另一个变量时,会在栈中重新分配一块内存空间。

1.1 Number

NaN、0、1、2... 等 NaN 属性用于引用特殊的非数字值。NaN不是常量,可以把它设置为其他值。NaN 与所有值都不相等,包括它自己。所有用 isNaN() 来判断。JSON.stringify(NaN)返回的是 null。 在 if 判断中 0 和 NaN 为 false,其他为 true。 Number() 可以将类数字字符串转化成 Number 类型,否则为 NaN。

1.2 String

在 if 判断中 '' 为 false,其他为 true。 String 操作方法

方法 用法
length 为字符串的长度。
charAt() 返回在指定位置的字符。
concat() 连接字符串。
indexOf() 检索字符串。
lastIndexOf() 从后向前搜索字符串。
slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。
search() 检索与正则表达式相匹配的值。
split() 把字符串分割为字符串数组。
substr() 从起始索引号提取字符串中指定数目的字符。
substring() 提取字符串中两个指定的索引号之间的字符。
toString() 返回字符串。
valueOf() 返回某个字符串对象的原始值。
toLocaleLowerCase() 把字符串转换为小写。
toLocaleUpperCase() 把字符串转换为大写。
toLowerCase() 把字符串转换为小写。
toUpperCase() 把字符串转换为大写。
replace() 替换与正则表达式匹配的子串。
1.3 Boolean

主要 true 和 false,Boolean() 可以将其他类型进行转化。 Boolean('')、Boolean(0)、Boolean(NaN)、Boolean(undefined)、Boolean(null) 为 false,其他为 true。 toString() 把逻辑值转换为字符串,并返回结果'false'和'true'。

1.4 Null

typeof null 返回的是 'object'。(浏览器本身的bug)

1.5 Undefined

typeof undefined 返回的是 'undefined'。(浏览器本身的bug)

1.6 Symbol

typeof Symbol() 返回的是 'symbol'。Symbol本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。 1)Symbol数据类型的特点是唯一性,即使是用同一个变量生成的值也不相等。

let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1 == id2);  //false

2)Symbol 数据类型的另一特点是隐藏性,for···in,object.keys()不能访问。 3)Object.getOwnPropertySymbols 方法会返回一个数组。 4)Symbol.for() 多次使用同一个symbol值。

let name1 = Symbol.for('name'); //检测到未创建后新建
let name2 = Symbol.for('name'); //检测到已创建后返回
console.log(name1 === name2); // true
二、引用数据类型

复杂数据类型索引存放在栈内存中,对象存在于堆内存中。引用数据类型变量赋值给另一个变量时,索引只是指向相同的堆内存空间。拷贝分为浅拷贝和深度拷贝。

2.1 Object

Object 主要遍历方法有,for in 和 Object.keys() 用 Object.defineProperty 第一方法。 Object.prototype.protoPer1 通过原型链增加属性,为一个函数。 Object.keys主要用于遍历对象自有的可枚举属性,不包括继承自原型的属性和不可枚举的属性。

2.1.1 for in

主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性,(Object.prototype.jinhua),就会遍历到 jinhua。

2.1.1 Object.keys()

Object.keys() 会返回对象的,键值的数组。