js的数据类型分为两大类:
基本类型:也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度, 将其存储在栈中,即按值访问 。
引用类型:也称为复杂类型,由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此, 其值存储在堆中 ,而存储在变量处的值,是一个指针,指向存储对象的内存处,即 按址访问 。引用类型除 Object 外,还包括 Function 、Array、RegExp、Date 等等。
引用类型和基本类型的区别:
1、基本类型按 值 访问
需要注意的是:
A instanceof B用来判断A是否属于B的实例,返回true或者false。
需要注意的是:
ES5中可以用Array.isArray([])来准确判断数组的实例
当创建变量b时,js会在b的原型上添加constructor属性,指向b的引用
js在创建内置对象时,也是这么做的:
Object对象有tostring方法返回:
而非object对象,则需要call/apply才能正确返回类型,返回格式为字符串类型的 "[object 数据类型xxx]" :
以上几种方式可以在不同场景使用。
基本数据类型(按值访问):Undefined 、 Null 、 Boolean 、 Number 和 String
引用数据类型(按引用访问):object、Array、function
typeof(检测基本数据类型时 typeof 是非常得力的助手)可以返回以下6种类型:undefined 、 boolean 、 number 、string、object(对象和null都是object类型)、function
instanceof(用于检测引用类型):所有引用类型的值都是 Object 的实例,person(引用类型值) instanceof Object永远都是true。
要知道是什么类型的对象,使用instanceof 操作符接上想要判断的类型,例如colors instanceof Array。
基本数据类型复制:复制的是该变量的副本,这两个变量可以参与任何操作而不会相互影响
引用数据类型复制:复制的是该变量的指针,该指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一 个变量
传参:基本类型和引用类型全部是按值传递,相当于把参数复制一份给到function的局部变量
为了便于操作基本类型值,ECMAScript 还提供了 3 个特殊的引用类型: Boolean 、 Number 和
String 。
Number 类型重写了 valueOf() 、 toLocaleString() 和 toString()方法。除了继承的方法之外, Number 类型还提供了一些用于将数值格式化为字符串的方法。 toFixed() 方法会按照指定的小数位返回数值的字符串表示。
String 对象的方法也可以在所有基本的字符串值中访问到。其中,继承的 valueOf() 、 toLocale-String() 和 toString() 方法,都返回对象所表示的基本字符串值。String 类型的每个实例都有一个 length 属性。
字符方法:两个用于访问字符串中特定字符的方法是: charAt() 和 charCodeAt() 。
var stringValue = "hello world"
alert(stringValue.charAt(1))//"e"
alert(stringValue.charCodeAt(1))// 输出"101",小写字母 "e" 的字符编码
字符串操作方法
1、concat:拼接字符串,可接收任意多字符串,不改变原字符串值,虽然 concat() 是专门用来拼接字符串的方法,但实践中使用更多的还是加号操作符(+)。
var stringValue = "hello "
var result = stringValue.concat("world", "!")
alert(result)//"hello world!"
alert(stringValue)//"hello"
2、三个基于子字符串创建新字符串的方法: slice() 、 substr() 和 substring() 。都接收1或2个参数。
slice() 、substring()在接收正数参数时,第一个参数是字符串截取的起始位置,第二个是字符串结束位置。
substr()在接收正数参数时,第一个参数同上,第二个参数是截取长度。
当第一个参数为负数的时候,slice()和substr()按照参数+字符串长度结果来截取;substring()将负参数转换为0;
当第二个参数为负数的时候,slice()按照参数+字符串长度结果来截取;substr()和substring()将负参数转换为0;
3、字符串位置方法:有两个可以从字符串中查找子字符串的方法: indexOf() 和 lastIndexOf()
4、trim():删除字符串前后空格,不改变原字符串值
5、字符串大小写转换方法
字符串大小写转换的方法有 4 个: toLowerCase() 、 toLocaleLowerCase() 、 toUpperCase() 和toLocaleUpperCase() 。
6、字符串的模式匹配方法
match() 方法只接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象。返回数组。
search()参数同上。返回要查找的在字符串中第一次出现的位置。
字符串替换:var result = text.replace("at", "ond")
7、localeCompare() 方法
var stringValue = "yellow"
alert(stringValue.localeCompare("brick"))//1
在前面返回1,同样位置返回0,在后面返回-1
JS中一共有六种基本数据类型,分别是Undefined、Null、Boolean、Number、String,还有在ES6中新增的Symbol和ES10中新增的BigInt类型。
1. Undefined:未定义型
一个变量声明了但是未赋值的情况下就是undefined;
2. Null:空型
一般用来清空变量,也起了占位作用
3. String:字符型
凡是被双引号或单引号包裹起来的都叫做字符型,字符串有length属性。
4. Number:数值型
包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。
(1)NaN:非数字类型。
特点:①涉及到的任何关于NaN的操作,都会返回NaN
② NaN不等于自身。
(2)isNaN() :用于检查其参数是不是数值,得到的结果是一个布尔值,不是数值返回true,是数值返回false。
5. Boolean:布尔型
只有true和false两个值。
6. Symbol代表创建后独一无二且不可变的数据类型,它的出现我认为主要是为了解决可能出现的全局变量冲突的问题。
7. BigInt是一种数字类型的数据,它可以表示任意精度格式的整数,使用BigInt可以安全地存储和操作大整数,即使这个数已经超出了Number能够表示的安全整数范围。