持续创作,加速成长!这是我参与「掘金日新计划 · 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基础这一块更加夯实了