类型
基本数据类型
String
js里,单引号和双引号都是字符串
字符串也可以进行嵌套,但是只允许单引号里嵌套双引号或者双引号里嵌套单引号,同一种引号不允许嵌套
JS里,两个字符串之间直接比较,不会先把字符串转化为数字再进行比较,而是直接采用字符串的比较规则进行比较
字符串比较大小,是将字符串对应位置上的字符对应的ASCII码的值进行大小比较,如果相同,比较后一个字符,直到比较出大小为止.如果每个位置上的值都相等,则这两个字符串相等
Number
数值范围:
- 5e324 ~ 1.7976931348623157e+308
- 如果超过范围,会表示为 Infinity 或者 -Infinity
特殊的数值NaN:
- NaN是 number类型,是一个数值
- 特点1:NaN与任何数进行任何运算结果都是NaN
- 特点2:NaN与任何数都不相等,包括自己
相关函数:
- isNaN() 判断数据是否是 NaN, 是返回true,否则返回false
- isFinite() 判断数据是否在范围内,在范围内返回true,否则false
Boolean
布尔类型,一种非真即假的数据类型,该数据类型只有两个值: true(真)和false(假);
Null
空值类型
表示没有对象,此处无值 使用typeof获取null的类型值是object
Undefined
未定义类型
表示缺少值,本来应该有值但没定义 ;未定义类型,表示变量声明但未赋值
Symbol
Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题
BigInt
BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。
BigInt 的提案
JavaScript 中 Number.MAX_SAFE_INTEGER 表示最⼤安全数字,计算结果是 9007199254740991,即在这个数范围内不会出现精度丢失(⼩ 数除外)。但是⼀旦超过这个范围,js 就会出现计算不准确的情况, 这在⼤数计算的时候不得不依靠⼀些第三⽅库进⾏解决,因此官⽅提 出了 BigInt 来解决此问题。
引用数据类型
Object
Object是个大类,function函数、array数组、date日期...等都归属于Object
区别
栈
堆
- 在数据结构中,栈中数据的存取方式为先进后出
-
堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定
-
堆区内存一般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。
堆和栈的区别
堆和栈是计算机科学中用于管理内存的两种主要数据结构。它们在内存管理方式、数据访问速度、存储内容等方面有显著的区别:
- 内存管理方式不同。栈是一种先进后出的数据结构,通常由操作系统自动管理,用于存储局部变量、函数参数和函数调用的上下文。当函数执行完毕或超出其作用域时,栈上的数据会自动清除。堆是一种树形结构,通常由程序员手动管理,用于动态分配和释放较大的数据结构,如动态数组、对象等。程序员需要显式地释放堆上的内存,否则可能导致内存泄漏。
- 数据访问速度不同。栈上的数据通常直接存放在系统内存中,访问速度快。堆上的数据需要通过指针进行间接访问,访问速度相对较慢。
- 存储内容不同。栈主要存储局部变量、函数参数和函数调用的上下文,其生命周期通常与其作用域相对应。堆主要用于存储动态分配的对象和数据结构,其生命周期由程序员控制。
- 内存大小不同。栈的大小通常受到限制,受到操作系统和编译器的影响,一般只有几百KB到几MB的空间。堆的大小可以较大,受到系统资源的限制,通常比栈要大得多。
- 内存分配和释放的不同。栈的内存分配和释放是由系统自动管理的,通常比较快。堆的内存分配和释放需要较多的开销,通常比较慢。
此外,在多线程环境下,栈的线程独享,不会发生竞争问题,而堆则需要考虑多线程并发访问时的同步和互斥机制。
数据类型判断
typeof
数组、对象、null 都会被判断为 object,其他判断都正确。
console.log(typeof 2);
console.log(typeof true);
console.log(typeof 'string');
console.log(typeof undefined);
console.log(typeof null);
console.log(typeof {});
console.log(typeof []);
console.log(typeof function(){});
instanceof
console.log(2 instanceof Number); //false
console.log(true instanceof Boolean); //false
console.log('string' instanceof String); //false
console.log([] instanceof Array); //true
console.log({} instanceof Object); //true
console.log(function() {} instanceof Function); //true
constructor
console.log((2).constructor === Number);
console.log(true.constructor === Boolean);
console.log('string'.constructor === String);
console.log([].constructor === Array);
console.log({}.constructor === Object);
console.log(function() {}.constructor === Function);
Object.prototype.toString.call()
Object.prototype.toString.call() 使用 Object 对象的原型方法 toString 来判断数据类型:同样是检测对象 obj 调用 toString 方法,obj.toString()的结果和 Object.prototype.toString.call(obj)的结果不一样,这是为什么?这是因为 toString 是 Object 的原型方法,而 Array、function 等类 型作为 Object 的实例,都重写了 toString 方法。不同的对象类型调 用 toString 方法时,根据原型链的知识,调用的是对应的重写之后的 toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串…),而不会去调用 Object 上原型 toString 方法(返回对象的具体类型),所以采用 obj.toString() 不能得到其对象类型,只能将 obj 转换为字符串类型;因此,在想要 得到对象的具体类型时,应该调用 Object 原型上的 toString 方法。
const a = Object.prototype.toString
console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('string'));
console.log(a.call([]));
console.log(a.call({}));
console.log(a.call(function() {}));
console.log(a.call(undefined));
console.log(a.call(null));
数据类型之间的转换
数字与字符串
显式转化
数字转字符串 String()方法
字符串转数字 Number()方法
隐式转化(只适合js)
数字转字符串 加上一个空字符串即可
例:console.log(123+"")
字符串转数字 用字符串做除了加法之外的四则运算(-0,*1,/1)
例:console.log("123"-0)
其他数据类型转布尔
显示转化
Boolean()
隐式转化
在某些结果是布尔值的有运算符参与的式子里,系统会即将最终计算的结果自动转化为布尔值
数字非0即为真,0为假
字符串非非空即为真,空字符串为假
null为假
undefned为假
NaN为假
对象为真
快捷操作 !!
!!
!!5 true !!0 false
!!'a' true !!'' false
有错误请小伙伴们指出啊~~