theme: condensed-night-purple
JavaScript
随手笔记总结,随时补充;如有误之处,请留言指出,在此先感谢各路大佬🙏
数据类型
JavaScript
语言中类型集合由原始值和对象组成。
原始值(直接表示在语言底层的不可变数据)
- 布尔类型 :布尔值是一种取值仅能为 真 或 假 的数据类型,它赋予了编程语言在逻辑上表达真 或 假 的能力;
Boolean:布尔值是一种取值只有 真 或 假 的数据类型,它可以在代码逻辑上表达真 或 假 的能力
- 如果值为以下情况之一则为
false
:
0
-0
null
false
-NaN
undefined
- 空字符串「
""
」 - 否则为
true
- 其值不是
undefined
或null
的任何对象「所有的对象类型」(包括其值为false
的布尔对象)在传递给条件语句时都将计算为true
const f = new Boolean(false); if(f){// 执行}
const f = Boolean(false); if(f){// 执行}
- 转换布尔值的方法
-
Boolean(123)
「直接将Boolean
当作转换函数使用」 -
!!(123)
「双重非运算符」 -
new Boolean(123)
「不推荐,不要用创建对象的方式进行类型转换;对于任何对象来说,即使值为false
的Boolean
对象,使用此方法转换结果都是true
」
- 注意:不要在应该使用基本类型布尔值的地方使用
Boolean
对象 - 实例方法
Boolean.prototype.toString()
- 以字符串形式返回该布尔对象的值
- 不会继承
Object.prototype.toString()
Boolean.prototype.valueOf()
- 返回一个
Boolean
对象的原始值「基本类型值」
const x = new Boolean(null);
console.log( x.valueOf() ) // false
// 首先会进行隐式转换,其次在进行比较
Boolean(null) ==> false
- 数字类型 :是一种基于
IEEE 754
标准的双精度64 位二进制
格式的值;
- 整数
+0 / -0
console.log(+0 === -0) ==> true
console.log(1 / +0) ==> Infinity
console.log(1 / -0) ==> -Infinity
- 负数
- 小数
+/-Infinity
- 检查数值是否大于或者小于
+/-Infinity
:Number.MAX_VALUE
/Number.MIN_VALUE
- 最大安全数和最小安全数
:Number.MAX_SAFE_INTEGER
/Number.MIN_SAFE_INTEGER
- 检查是否在安全数之内:
Number.isSafeInteger()
-NaN
(非数值,Not-a-Number
)
- 用途:一般用于浏览器的隐式转换中
- 数学运算
-
isNaN
检测 -
==
比较 - …
- 字符串类型 :;
-
""
/''
/String()
- 字符串一旦被创建,就不能被修改
Undefined
类型 :一个没有被赋值的变量会有个默认值undefined
- 标识符:用来标识变量/函数/属性的字符序列
- 全局对象的一个属性
undefined
「全局作用域的一个变量」 - 函数没有
return
返回值,就会返回一个undefined
值 - 用途
- 判断变量是否有值
- 判断变量是否与
undefined
严格相等,若相等则变量有值
- 判断变量是否被声明
- 一般会使用
typeof
来判断变量是否存在,其优点:
-
typeof
不会在变量没有被声明时抛出错误,所以不会阻塞代码执行 - 注意:必须使用严格相等操作符,否则会出现值为
null
的情况
- 通过判断变量是否在当前上下文中被声明;如果是全局上下文,可以通过全局对象来检查是否存在当前属性
in
操作符:指定的属性在指定的对象或其原型链中,则in
运算符返回true
。void
运算符:对给定的表达式进行求值,然后返回undefined
。
- 一般只用于获取
undefined
的原始值,一般使用void(0)
- 当函数返回值是一个不会被使用到的时候,应该使用
void
运算符,来确保返回undefined
==
和===
的区别:
-
==
:判断值相等则返回true
,不会判断类型是否相等 -
===
:判断类型和值都相等则返回true
Null
类型 :特指对象的值未设置
- 是一个字面量
- 变量未指向任何对象 「表示一个空指针」
- 返回类型是一个对象,但是没有关联任何的值
null
与undefined
的区别:
-
“==”
相等「内部会进行隐式转换」==>true
-
“===”
全等 「内部不会进行隐式转换」==>false
Symbol
类型:是唯一且不可修改的原始值
- 创建
symbol
数据类型:let sym = Symbol();
- 该类型的性质在于这个类型的值可以用来创建
匿名的对象属性
- 该属性是匿名的,并且是不可枚举的,所以:
- 不是
for..in
循环中的成员 - 不是
Object.getOwnPropertyNames()
中返回的成员
- 可以通过
Object.getOwnPropertySymbols()
属性访问
- 能对该类型实例使用其他操作符
- 不能被当作构造函数使用,作为构造函数调用时会抛出一个错误:
Symbol is not a constructor「new Symbol()
」 - 应用场景:
- 给对象设置“唯一值”的属性名
- 字符串「属性的类型为字符串」
-
Symbol
类型「属性的类型也可为Symbol
类型」:用变量存储symbol
的值,然后使用存储的值创建对象属性 -
Map
新的数据结构:可以允许属性名是对象「Map
属性名是字符串/对象」 -
Symbol.asyncIterator/iterator「for...of..」/hasInstance「instanceOf」/toPrimitive/toStringTag...
是某些JS
知识底层实现的机制
- 在派发行为标识统一进行管理的时候,可以基于
symbol
类型的值,保证行为标识的唯一性 - …
BigInt
类型:表示任意精度的整数;
BigInt([value])
/[value]n
- 通过在整数末尾附加字母
n
或调用构造函数来创建的 - 可以安全地存储和操作大整数,甚至可以超过数字类型的安全整数限制「四则运算都支持」
- 不能与数字相互运算;需要把数字转换为
BigInt
类型,在进行运算 - 最大安全数:
Number.MAX_SAFE_INTEGER
「9007199254740991
」 - 最小安全数:
Number.MIN_SAFE_INTEGER
「-9007199254740991
」 - 超过安全数后,进行运算或者访问,结果会不准确!!!解决方案:
- 服务器返回给客户端的大数,按照“字符串”格式返回!
- 客户端把其变为
BigInt
,然后按照BigInt
进行运算 - 最后把运算后的
BigInt
转换为字符串,在传递给服务器即可
对象类型(一组属性的集合)「引用数据类型」
对象(
object
) 是指内存中的可以被标识符引用的一块区域
- 标准普通对象
- 标准特殊对象
- 非标准特殊对象
- 可调用/执行对象「函数」
- 普通函数
- 构造函数
- 箭头函数
- 生成器函数