【JS】JS基础

数据类型

在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
  • 算术运算:+ - * / %
    总结:
  • 转布尔值时:除undefinednullfalse+0/-0/0NaN空字符串""会被转成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方法取得原始值),再比较
- 两个都为引用类型,则比较它们是否指向同一个对象
- nullundefined 相等
- 存在 NaN 则返回 falseNaN==NaNfalse
  • ===是全等操作符: 两个操作数要在不转换的前提下相等才会返回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()matchreplcae()

  • 全局匹配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}$/;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值