每日一记
原始类型的方法
原始类型和对象之间的关键区别。
一个原始值:
是原始类型中的一种值。
在 JavaScript 中有 7 种原始类型:string,number,bigint,boolean,symbol,null 和 undefined。
一个对象:
能够存储多个值作为属性。
可以使用大括号 {} 创建对象,例如:{name: “John”, age: 30}。JavaScript 中还有其他种类的对象,例如函数就是对象。
原始类型不是对象,它们不能存储额外的数据。
数字类型
两种类型:
常规数字以 64 位的格式 IEEE-754 存储,也被称为“双精度浮点数”
BigInt 用于表示任意长度的整数
编写数字的方法:
let billion = 1e9; // 10 亿,字面意思:数字 1 后面跟 9 个 0
alert( 7.3e9 ); // 73 亿(与 7300000000 和 7_300_000_000 相同)
let mcs = 0.000001 = 1e-6; // 1 的左边有 6 个 0;
二进制0b 八进制0o 十六进制0x
toString(base):
返回在给定 base 进制数字系统中 num 的字符串表示形式
alert( 123456..toString(36) ); // 三十六进制,2n9c
使用两个点来调用一个方法:
123456.toString(36)相当于(123456).toString(36)
语法隐含了第一个点之后的部分为小数部分。再放一个点,JS就知道小数部分为空。
舍入:
Math.floor Math.ceil Math.round Math.trunc
3.1 3 4 3 3
3.6 3 4 4 3
-1.1 -2 -1 -1 -1
-1.6 -2 -1 -2 -1
Math.floor向下舍入
Math.ceil向上舍入
Math.round向最近的整数舍入
Math.trunc(IE 浏览器不支持这个方法)移除小数点后的所有内容而没有舍入
舍入到小数点后 n 位:
1.将数字乘以 100,调用舍入函数,然后再将其除回
2.toFixed(n) 将数字四舍五入到小数点后 n 位,并以字符串形式返回结果
不精确的计算:
数字是以 64 位格式 IEEE-754 表示的:其中 52 位被用于存储这些数字, 11 位用于存储小数点的位置,而 1 位用于符号。
1.如果一个数字真的很大,则可能会溢出 64 位存储,变成一个特殊的数值 Infinity
2.一个数字以其二进制的形式存储在内存中。但是在十进制数字系统中看起来很简单的 0.1,0.2 这样的小数,实际上在二进制形式中是无限循环小数
最可靠的解决方法是借助方法 toFixed(n) 对结果进行舍入
isFinite 和 isNaN:
属于 number 类型,但不是“普通”数字
Infinity(和 -Infinity)是一个特殊的数值,比任何数值都大(小)。
NaN 代表一个 error。
isNaN(value) 将其参数转换为数字,然后测试它是否为 NaN
isFinite(value) 将其参数转换为数字,如果是常规数字而不是 NaN/Infinity/-Infinity,则返回 true
注:在所有数字函数中,包括 isFinite,空字符串或仅有空格的字符串均被视为 0
比较两个值是否完全相同时,它使用Object.is(a,b) === true
parseInt(str, radix) 和 parseFloat:
从字符串中“读取”数字,直到无法读取为止。parseInt 返回一个整数,parseFloat 返回一个浮点数,没有数字可读时为NaN
parseInt(str, radix) 的第二个参数为要解析的str的进制,可选
其他数学函数:
Math.random()返回一个从 0 到 1 的随机数(不包括 1)
Math.max(a, b, c…)返回最大值
Math.pow(n, power)返回 n 的power次幂
字符串
文本数据被以字符串形式存储,单个字符没有单独的类型。
字符串的内部格式始终是 UTF-16,它不依赖于页面编码。
引号(Quotes):
1.反引号允许我们通过 ${…} 将任何表达式嵌入到字符串中
2.允许字符串跨行
特殊字符:
\n 换行
\r Windows 文本文件中,两个字符 \r\n 的组合代表一个换行。而在非 Windows 操作系统上,它就是 \n。
\'和\" 引号
\ 转义字符
\\ 反斜线
\t 制表符
\b 退格
\f 换页
\v 垂直
\xXX 十六进制 Unicode XX 的 Unicode 字符
\u{X…XXXXXX}(1 到 6 个十六进制字符) 具有给定 UTF-32 编码的 Unicode 符号
字符串长度:
let str = `Hello`;
// 第一个字符
alert( str[0] ); // H
alert( str.charAt(0) ); // H
// 最后一个字符
alert( str[str.length - 1] ); // o
如果没有找到字符,[] 返回 undefined,而 charAt 返回一个空字符串
字符串是不可变的:
要更改就要创建一个新的字符串,并将其分配给新字符串而不是以前的字符串
改变大小写:
toLowerCase() 和 toUpperCase()
改变单个字符大小写
alert( 'Interface'[0].toLowerCase() ); // 'i'
查找子字符串:
str.indexOf(substr, pos)
从给定位置 pos 开始,在 str 中查找 substr,如果没有找到,则返回 -1,否则返回匹配成功的位置
如果我们对所有存在位置都感兴趣,可以在一个循环中使用 indexOf
str.lastIndexOf(substr, position)
从字符串的末尾开始搜索到开头,以相反的顺序列出这些事件
按位(bitwise)NOT :
将数字转换为 32-bit 整数(如果存在小数部分,则删除小数部分),然后对其二进制表示形式中的所有位均取反
对于 32-bit 整数,~n 等于 -(n+1)
includes,startsWith,endsWith:
includes检测匹配,但不需要它的位置,第二个可选参数是开始搜索的起始位置
alert( "Widget".startsWith("Wid") ); // true,"Widget" 以 "Wid" 开始
alert( "Widget".endsWith("get") ); // true,"Widget" 以 "get" 结束
获取子字符串:
str.slice(start,end)
返回字符串从 start 到(但不包括)end 的部分
start/end 也有可能是负值。它们的意思是起始位置从字符串结尾计算
str.substring(start,end)
返回字符串从 start 到(但不包括)end 的部分。
这与 slice 几乎相同,但它允许 start 大于 end
str.substr(start,length)
返回字符串从 start 开始的给定 length 的部分。
与以前的方法相比,这个允许我们指定 length 而不是结束位置
第一个参数可能是负数,从结尾算起
比较字符串:
1.小写字母总是大于大写字母
2.带变音符号的字母存在“乱序”的情况(例如部分国家名字)
str.codePointAt(pos)返回在 pos 位置的字符代码
String.fromCodePoint(code)通过数字 code 创建字符
可以用 \u 后跟十六进制代码,通过这些代码添加 Unicode 字符
其他几种有用的字符串方法:
str.trim()删除字符串前后的空格 (“trims”)。
str.repeat(n)重复字符串 n 次。