目录
原始类型的包装类
JavaScript的原始类型
并非对象类型
,所以从理论上来说,它们是
没有办法获取属性或者调用方法
的。
但是,在开发中会看到,我们会经常这样操作:
![](https://img-blog.csdnimg.cn/6e4f38a3e4e44471b41faaf0c7347bf8.png)
那么,为什么会出现这样奇怪的现象呢?(悖论)
- 原始类型是简单的值,默认并不能调用属性和方法;
- 这是因为JavaScript为了可以使其可以获取属性和调用方法,对其封装了对应的包装类型;
常见的包装类型有:
String、Number、Boolean、Symbol、BigInt类型
包装类型的使用过程
默认情况,当我们
调用一个原始类型的属性或者方法
时,会进行如下操作:
- 根据原始值,创建一个原始类型对应的包装类型对象;
- 调用对应的属性或者方法,返回一个新的值;
- 创建的包装类对象被销毁;
- 通常JavaScript引擎会进行很多的优化,它可以跳过创建包装类的过程在内部直接完成属性的获取或者方法的调用。
我们也可以自己来创建一个包装类的对象:
- name1是字面量(literal)的创建方式,name2是new创建对象的方式;
注意事项:
null、undefined没有任何的方法,也没有对应的“对象包装类”
;
Number类
Number属性补充:
- Number.MAX_SAFE_INTEGER:JavaScript 中最大的安全整数 (2^53 - 1);
- Number.MIN_SAFE_INTEGER:JavaScript 中最小的安全整数 -(2^53 - 1)
Number实例方法补充:
方法一:toString(base)
,将数字转成字符串,并且按照base进制进行转化
- base 的范围可以从 2 到 36,默认情况下是 10;
- 注意:如果是直接对一个数字操作,需要使用..运算符;
方法二:toFixed(digits)
,格式化一个数字,保留digits位的小数;
- digits的范围是0到20(包含)之间;
Number类方法补充:
- 方法一:Number.parseInt(string[, radix]),将字符串解析成整数,也有对应的全局方法parseInt;
- 方法二:Number. parseFloat(string),将字符串解析成浮点数,也有对应的全局方法parseFloat;
更多Number的知识,可以查看MDN文档:
在除了Number类可以对数字进行处理之外,JavaScript还提供了一个
Math对象
。
- Math是一个内置对象(不是一个构造函数),它拥有一些数学常数属性和数学函数方法;
Math
常见的属性:
- Math.PI:圆周率,约等于 3.14159;
Math
常见的方法:
- Math.floor:向下舍入取整
- Math.ceil:向上舍入取整
- Math.round:四舍五入取整
- Math.random:生成0~1的随机数(包含0,不包含1)
- Math.pow(x, y):返回x的y次幂
Math中还有很多其他数学相关的方法,可以查看MDN文档:
String类
String常见的属性:
- length:获取字符串的长度;
操作一:访问字符串的字符
- 使用方法一:通过字符串的索引 str[0]
- 使用方法二:通过str.charAt(pos)方法
- 它们的区别是索引的方式没有找到会返回undefined,而charAt没有找到会返回空字符串;
字符串的不可变性:
- 字符串在定义后是不可以修改的,所以下面的操作是没有任何意义的;
所以,在我们改变很多字符串的操作中,都是生成了一个新的字符串;
比如改变字符串大小的两个方法
- toLowerCase():将所有的字符转成小写;
- toUpperCase() :将所有的字符转成大写;
在开发中我们经常会在一个字符串中查找或者获取另外一个字符串,String提供了如下方法:
方法一:查找字符串位置
![](https://img-blog.csdnimg.cn/c37c201977e94bc8b15bfd8e6e6d1c39.png)
- 从fromIndex开始,查找searchValue的索引;
- 如果没有找到,那么返回-1;
- 有一个相似的方法,叫lastIndexOf,从最后开始查找(用的较少)
方法二:是否包含字符串
![](https://img-blog.csdnimg.cn/ed3ce68dc65c4c309319b96859325b2d.png)
- 从position位置开始查找searchString, 根据情况返回 true 或 false
- 这是ES6新增的方法;
方法三:以xxx开头
![](https://img-blog.csdnimg.cn/7953021b125e4bcab8541802236a17c4.png)
- 从position位置开始,判断字符串是否以searchString开头;
- 这是ES6新增的方法,下面的方法也一样
方法四:以xxx结尾
![](https://img-blog.csdnimg.cn/5492ac3fb7ad4c0694ca1a6583291a04.png)
- 在length长度内,判断字符串是否以searchString结尾;
方法五:替换字符串
![](https://img-blog.csdnimg.cn/d259597a4a9547aabb3b4e016a1d9aad.png)
- 查找到对应的字符串,并且使用新的字符串进行替代;
- 这里也可以传入一个正则表达式来查找,也可以传入一个函数来替换;
方法六:拼接字符串
方法七:删除首位空格
![](https://img-blog.csdnimg.cn/2bd051130f1941d7800be90023250d9b.png)
方法八:获取子字符串(开发中推荐slice)
方法九:字符串分割
![](https://img-blog.csdnimg.cn/59255051bb924eb6a06e41ab69419637.png)
- separator:以什么字符串进行分割,也可以是一个正则表达式;
- limit:限制返回片段的数量;
补充:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String
数组(Array)
访问
数组中的元素:
- 通过中括号[]访问
- arr.at(i): 如果 i >= 0,则与 arr[i] 完全相同;对于 i 为负数的情况,它则从数组的尾部向前数。
修改数组中的元素
删除和添加
元素虽然也可以通过索引来直接操作,但是开发中很少这样操作。
在数组的
尾端
添加或删除元素:
- push 在末端添加元素.
- pop 从末端取出一个元素.
在数组的首端添加或删除元素
- shift 取出队列首端的一个元素,整个数组元素向前前移动;
- unshift 在首端添加元素,整个其他数组元素向后移动;
push/pop 方法运行的比较快,而 shift/unshift 比较慢。
arr.splice 方法可以说是处理数组的利器,它可以做所有事情:添加,删除和替换元素。
arr.splice的语法结构如下(这个方法会修改原数组):
- 从start位置开始,处理数组中的元素;
- deleteCount:要删除元素的个数,如果为0或者负数表示不删除;
- item1, item2, ...:在添加元素时,需要添加的元素;
length属性用于获取数组的长度:
- 当我们修改数组的时候,length 属性会自动更新。
length 属性的另一个有意思的点是它是可写的。
- 如果我们手动增加一个大于默认length的数值,那么会增加数组的长度。
- 但是如果我们减少它,数组就会被截断。
所以,清空数组最简单的方法就是:arr.length = 0;
常用的数组遍历
- 普通for循环遍历:
- for..in 遍历,获取到索引值:
- for..of 遍历,获取到每一个元素:
arr.slice 方法
:用于对数组进行截取(类似于字符串的slice方法)。
- 包含bigin元素,但是不包含end元素;
arr.concat方法
:创建一个新数组,其中包含来自于其他数组和其他项的值。
arr.join方法
:
将一个数组的所有元素连接成一个字符串并返回这个字符串。
arr.indexOf方法
: 查找某个元素的索引
![](https://img-blog.csdnimg.cn/7e7c24cfcf1c457c9643e1855f1bfa63.png)
- 从fromIndex开始查找,如果找到返回对应的索引,没有找到返回-1;
- 也有对应的从最后位置开始查找的 lastIndexOf 方法
arr.includes方法
:判断数组是否包含某个元素
![](https://img-blog.csdnimg.cn/01b0c4a94a004b118579de5d748ff278.png)
- 从索引 from 开始搜索 item,如果找到则返回 true(如果没找到,则返回 false)。
find 和 findIndex
直接查找元素或者元素的索引(ES6之后新增的语法)
sort方法也是一个高阶函数,用于对数组进行排序,并且生成一个排序后的新数组:
- 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 前面;
- 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变;
- 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 前面;
- 也就是说,谁小谁排在前面;
reverse() 方法
将数组中元素的位置颠倒,并返回该数组。
其他高阶方法:
arr.forEach
遍历数组,并且让数组中每一个元素都执行一次对应的方法;
arr.map
map() 方法创建一个新数组;
这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成;
arr.filter
filter() 方法创建一个新数组;
新数组中只包含每个元素调用函数返回为true的元素;
arr.reduce
用于计算数组中所有元素的总和;
对数组中的每个元素按序执行一个由您提供的
reducer
函数;
每一次运行
reducer
会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值;
时间的表示方式
在JavaScript中我们使用Date来表示和处理时间。
日期的表示方式有两种:
RFC 2822 标准
或者
ISO 8601 标准
。
默认打印的时间格式是RFC 2822标准的:
我们也可以将其转化成ISO 8601标准的:
- YYYY:年份,0000 ~ 9999
- MM:月份,01 ~ 12
- DD:日,01 ~ 31
- T:分隔日期和时间,没有特殊含义,可以省略
- HH:小时,00 ~ 24
- mm:分钟,00 ~ 59
- ss:秒,00 ~ 59
- .sss:毫秒
- Z:时区
我们可以从Date对象中获取各种详细的信息:
- getFullYear():获取年份(4 位数);
- getMonth():获取月份,从 0 到 11;
- getDate():获取当月的具体日期,从 1 到 31(方法名字有点迷);
- getHours():获取小时;
- getMinutes():获取分钟;
- getSeconds():获取秒钟;
- getMilliseconds():获取毫秒;
获取某周中的星期几:
- getDay():获取一周中的第几天,从 0(星期日)到 6(星期六);
Date也有对应的设置方法:
- setFullYear(year, [month], [date])
- setMonth(month, [date])
- setDate(date)
- setHours(hour, [min], [sec], [ms])
- setMinutes(min, [sec], [ms])
- setSeconds(sec, [ms])
- setMilliseconds(ms)
- setTime(milliseconds)
了解:我们可以设置超范围的数值,它会自动校准。
Unix
时间戳
:它是一个整数值,表示自
1970
年
1
月
1
日
00:00:00 UTC
以来的毫秒数。
在
JavaScript
中,我们有多种方法可以获取这个时间戳:
- 方式一:new Date().getTime()
- 方式二:new Date().valueOf()
- 方式三:+new Date()
- 方式四:Date.now()
获取到
Unix
时间戳之后,我们可以利用它来测试代码的性能:
Date.parse(str) 方法可以
从一个字符串中读取日期
,并且
输出对应的Unix时间戳
。
Date.parse(str) :
- 作用等同于 new Date(dateString).getTime() 操作;
- 需要符合 RFC2822 或 ISO 8601 日期格式的字符串;
- 比如YYYY-MM-DDTHH:mm:ss.sssZ
- 其他格式也许也支持,但结果不能保证一定正常;
- 如果输入的格式不能被解析,那么会返回NaN;