数据类型
在JS中有两种数据类型
- 基本数据类型:Number(NaN,Infinity)、String、Boolean、null、undefined、BigInt、Symbol(确保对象属性使用唯一标识符,不会发生属性冲突的危险)
- 引用类型:Object、Array、Function(函数声明、函数表达式、箭头函数)、Date、RegExp、Map、Set等
typeof无法区分数组,但instanceof可以
基本数据类型
undefined
值是由null
值派生而来的,null==undefined
为true- 任何值和null运算,null可看作0运算
- 任何数据类型和undefined运算都是NaN
存储区别: 所有的变量都是保存在栈内存的
声明变量时不同的内存地址分配
:基本数据类型在声明时值存储在栈中,引用类型在声明时对应的值存储在栈中,引用类型变量存放的是栈中指向堆内存的地址- 不同类型数据导致赋值变量的不同:简单类型赋值,是生成两个有着不同地址相同值的两个变量;而引用类型赋值,是两个变量指向堆内存中同一个对象
类型转换机制
- 显示转换(强制转换):String()、toString()、Number()、parseInt()、parseFloat()、Boolean()
- 自动转换(隐式转换):isNaN()、自增自减(
++
、--
)、正负号(+a
、-a
)、加号(+
)、运算符(-
、*
、/
)
显示转换
- null和undefined没有toString()方法
- Number():将任意类型的值转化为数值,注意
Number('324abc')
会转成NaN;对象除了只包含单个数值的数组外其他对象都会转成NaN
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
- parseInt():相较Number没有很严格,将输入当做字符串会逐个解析字符,遇到不能转换的字符就停下来。如果一个数字都没有解析出来就返回NaN,
paserInt('32a3')=>32
。如果字符串是 一个空串或者是一个全是空格的字符串转换时会报错。会自动截断小数点,带两个参数表示转换时要进行进制转换 - String():可以将任意类型的值转化成字符串
//对象
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
- Boolean():注意使用
!!
可以显式转换为Boolean类型
数据类型 | 能转换为true的值 | 能转换为false的值 |
---|---|---|
String | 非空字符串 | ‘’ |
Number | 非零数值(包括无穷值) | 0、NaN |
Object | 非空对象 | null |
undefined | 不存在 | undefined |
隐式转换
- 比较运算:
== != > <
、if while
- 算术运算:
+ - * / %
总结: - 转布尔值时:除
undefined
、null
、false
、+0/-0/0
、NaN
、空字符串""
会被转成false,其他都会被转成true - 转字符串时:在
+
中,先将复合类型的值拆分成原始类型,然后再进行拼接
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
- 自动转换成数值:除了+有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN
==和===的区别
- ==是等于操作符: 在比较之前会先进行类型转换,再确定操作数是否相等
- 两个都为简单类型,字符串和布尔值都会转换成数值,再比较
- 简单类型与引用类型比较,对象转化成其原始类型的值(先调用valueOf方法取得原始值),再比较
- 两个都为引用类型,则比较它们是否指向同一个对象
- null 和 undefined 相等
- 存在 NaN 则返回 false(NaN==NaN为false)
- ===是全等操作符: 两个操作数要在不转换的前提下相等才会返回true。 要求类型相等,值也相等,是真正意义上的全等
'' == '0' // false
在比较null
情况时,一般使用操作符==
const obj = {};
if(obj.x == null){
console.log("1"); //执行
}
等同于
if(obj.x === null || obj.x === undefined) {
...
}
所以,除了在比较对象属性为null或者undefined的情况下,我们可以使用相等操作符(==),其他情况建议一律使用全等操作符(===)
数组常见的方法
- 操作方法
- 增:push()、unshift()、splice(开始位置, 0(要删除的元素位置), 插入的元素)、concat()
- 删:pop()、shift()、splice(开始位置,删除元素数量)、slice()
- 改:splice()
- 查:indexOf()、includes()、find()
- 排序方法:reverse()、sort()
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
let values = [0, 1, 5, 10, 15];
values.sort(compare);// 0,1,5,10,15
- 转换方法:join()
- 迭代方法:some()、every()、forEach()、filter()、map()
JS字符串的常见方法
字符串是常量,一旦创建了就不可变
- 操作方法
- 增(不是直接增加内容,而是创建字符串的副本):
+
、${}
、concat()
- 删:slice(开始位置,结束位置)、substring(开始位置,结束位置)、substr(开始位置,截取字符个数)
- 改(创建字符串副本)
- trim()、trimLeft()、trimRight()
- repeat()
- padStart()、padEnd()
- toLowerCase()、toUpperCase()
- 查:chatAt()、indexOf()、startWith()、includes()
- 增(不是直接增加内容,而是创建字符串的副本):
- 转换方法:split()
- 模板匹配方法:match()、search()、replace()
正则表达式
匹配字符串的规则
创建方式:
- 字面量创建:
const re = /\d+/g
- 调用
RegExp
对象的构造函数:const re = new RegExp("\\d+", "g")
匹配规则
正则表达式标记
匹配方法
- 字符串str方法:match、matchAll、search、replace、split
- 正则对象下(regexp)的方法:test、exec
注意: 全局匹配模式g一般用于exec()
、match
、replcae()
- 全局匹配g慎用test方法:对于非全局匹配的正则表达式,
test()
只会检测是否存在某个目标字符串(只要存在就为true),多次检测的结果都相同;当设置全局标志 /g 时,一旦字符串中还存在匹配,test() 方法都将返回 true,同时匹配成功后将把 lastIndex 属性的值设置为上次匹配成功结果之后的第一个字符所在的位置,下次匹配将从 lastIndex 指示的位置开始;匹配不成功时返回 false,同时将 lastIndex 属性的值重置为 0
const reg = /test/g;
const str = '_test_test';
reg.test(str) // true
reg.test(str) // true
reg.test(str) // true
console.log(reg.test(str)); // true
console.log(reg.lastIndex); // 5
console.log(reg.test(str)); // true
console.log(reg.lastIndex); // 10
console.log(reg.test(str)); // false
console.log(reg.lastIndex); // 0
- 默认情况下,match()方法只会找到第一个符合要求的内容,找到以后就停止检索。我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容,并以数组的形式返回。
新的字符串 = str.replace(被替换的内容,新的内容);
默认只会替换第一个。如果需要替换全部符合条件的内容,可以设置正则表达式为全局匹配模式。
常见正则表达式举例
- 字符串是否是一个合法的手机号(以1开头,第二位是3~9之间的任意数字,三位以后任意9位数字)
var phoneReg = /^1[3-9][0-9]{9}$/;
- 去掉字符串开头和结尾的空格:
str = str.replace(/^\s*|\s*$/g,"");
- 判断字符串是否是电子邮件:
var emailReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;