javascript基本数据类型

124 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

前言

记得进入javascript的第一天就是学习基本数据类型,虽然觉得自己了属于心但是遇到面试时依然结结巴巴说不出答案;于是我就想再来回顾一下这个基础中的基础;

javascript中的基础数据类型有7种:Undefined、Null、Boolean、String、Number、Symbol、BigInt

undefined和null

undefined时一个全局属性,我们访问undefined其实是访问的window.undefined,而且我们发现无论如何修改window.undefined它的值都不变,我们获取一下它的属性描述符: {value: undefined, writable: false, enumerable: false, configurable: false} 原来这个undefined是不可修改的

在全局环境下无论如何声明undefined,在取值的时候都是不变的 var undefined = 2;console.log(undefined) // undefined 但是如果在函数中,undefined就成为了局部变量,它的值也生效了,这就是为什么jQuery源码中要闭包传入一个undefined

再来看一看null,它不是window的属性,通常表示未创建的对象,它的二进制就是前四位为0

转换为数值时,+null==0,+undefined NaN NaN!=NaN

undefined == null,undeined !== null类型不同

装箱和拆箱

运行点运算符时会将基本数据类型包装为包装类型===隐式装箱

(.6).constructor // ƒ Number() { [native code] }

"abc".prototype 会返回 String(abc).prototype 然后会销毁实例

拆箱是指把引用类型转换成基本数据类型

var objNum = new Number(64);
var objStr = new String('64');

console.log(typeof objNum.valueOf()); // number 
console.log(typeof objNum.toString()); // string 
console.log(typeof objStr.valueOf()); // string 
console.log(typeof objStr.toString()); // string 

运算符规则

两个对象比较:先把符号左右对象运行ToPrimitive运算转化为原始数据类型

加号运算时优先进行字符串加减,然后是数字,最后才是原始类型

ToPrimitive运算:

  • 执行对象的valueof方法,如果得到原始类型直接返回,如果还是对象则继续执行toString方法然后返回
  • 数组的toString方法默认是链接数组病返回一个字符串,其中包含用逗号分隔的每个数组元素
  • 当一个数组被作为文本值或者进行字符串连接操作时,将会自动调用其 toString 方法。
  • 对象的toString方法返回"[object type]"
  • null===null null!='null' NaN!=NaN []!=[]

Number包含浮点数和整数

js浮点数运算精度丢失,那么应该如何进行计算呢?

将小数转化为整数然后转化为数组进行运算,最后再转换回小数

js中Number实质上是一个64位的浮点数,第0位为符号位,其中1-11为指数位,12-63为小数部分,总共只有53位

Symbol

Symbol:常量唯一标识符

const TYPES = {
Animal :Symbol.for("Animal"),
Dog : Symbol.for("Dog")
}
const container = new Map()
container.set(TYPES.Animal,"abc")

Symbol vs Symbol.for: Symbol.for会被登记在全局环境中供搜索,不会每次调用都返回新的Symbol类型值, 会先检查是否存在这个key,不存在才会新建这个值

BigInt

BigInt可以直接转换为Number

const myBigInt = BigInt(10);  // of course, `10n` also works
const myNumber = Number(myBigInt);

总结

今天重温了javascript基本数据类型,感觉到自己在javascript基础这一块更加夯实了