一,数据类型
-
原始值类型「值类型/基本数据类型」
- number 数字
- string 字符串
- boolean 布尔
- null 空对象指针
- undefined 未定义
- symbol 唯一值
- bigint 大数
-
Symbol 创建一个唯一值
- 1,给对象设置“唯一值”的属性名
- 2, 字符串
- 3,Symbol类型
- 4,Map新的数据结构:可以允许属性名是对象
-
BigInt 大数类型 Number.MAX_SAFE_INTEGER 9007199254740991 JS中的最大安全数 Number.MIN_SAFE_INTEGER -9007199254740991 最小安全数 超过安全数后,进行运算或者访问,结果会不准确!!!
解决方案:
- 服务器返回给客户端的大数,按照“字符串”格式返回!
- 客户端把其变为 BigInt ,然后按照BigInt进行运算
- 最后把运算后的BigInt转换为字符串,在传递给服务器即可
console.log((90071992547409912446579n).toString());
Symbol.asyncIterator/iterator/hasInstance/toPrimitive/toStringTag...是某些JS知识底层实现的机制
- 在派发行为标识统一进行管理的时候,可以基于symbol类型的值,保证行为标识的唯一性
-
对象类型「引用数据类型」
- 标准普通对象 object
- 标准特殊对象 Array、RegExp、Date、Math、Error……
- 非标准特殊对象 Number、String、Boolean……
- 可调用/执行对象「函数」function
typeof检测数据类型
所有的数据类型值,在计算机底层都是按照“64位”的二进制值进行存储的!
- typeof 是按照二进制进行检测类型的
二进制的前三位是0,认为是对象,然后再去看有没有实现call方法,如果实现了,返回‘function’,没有实现,则返回‘object’
- 000 对象
- 1 整数
- 010 浮点数
- 100 字符串
- 110 布尔
- 000000…. null 64个0
- -2^30 undefined
- ……
- 怎么解决精度问题?
- 将数字转成整数(扩大系数)
- 三方库:Math.js decimal.js big.js ...
- 0.1+0.2为什么不等于0.3
js中有关于小数(浮点数)的计算会出现精准度丢失的问题
- js中所有值在计算机中都是以2进制在计算机底层进行存储的(浮点数转为二进制,可能出现无限循环的情况)
- 在计算机底层存储的时候,最多存储64位(舍弃了一些值,值本身就失去了精准度 )
- 浮点数计算的解决方案:
- tofixed保留小数点后面N位,他自己会四舍五入
- 扩大系数法
全局上下文中 基于var function 声明的变量,并没有放在Vo(G)中直接存储到GO中,作为window的一个成员
基于let/const 声明的变量,存储在VO(G)中的
console.log(a) 先看VO(G),再看GO,如果GO中也没有,则报错 a is not defined console.log(window.a)直接去GO找,如果没有不会报错,值是undefined
- 函数是一种特殊的对象(可执行对象):函数(普通函数、构造函数)、对象
- 创建函数
- 1,堆内存空间(16进制地址)
- 2,存储信息,创建函数的时候,就声明了其作用域,在哪个上下文中创建的,其作用域就是谁(宿主环境)
- 把函数体中的代码当做字符串存储起来
- 看做普通对象,存储键值对,name函数名length形参个数 prototype 原型对象