Number类型
在Javascript,数值类型包括整数、浮点数。不管是什么类型,在js中都是使用64为来存储数值。这些数值因为分为正数和负数,因此64位内存既要用来存储正数,也要能存储负数。在这64位中,52位保存整数,11位保存小数,剩下的1位为符号位。
对于整数而言,除了可以使用常用的十进制来表示之外,还可以使用八进制和十六进制。
- 八进制是以数字0开头的数字,如012是10的八进制表示
- 注意,如果0后面的数字超出范围,会以十进制来进行解析。
- 十六进制是以数字0和x开头的数字,后面的数字可以0-9, a-f的任意组合
特殊的数值——infinity -infinity 以及NaN
infinity表示能表示的最大数值
-infinity表示js能表示的最小数值
NaN: 代表一个计算错误。他是一个不正确的或者是一个未定义的数学操作所得到的结果。
对于NaN,可以通过isNaN来判断是否”不是数值“。接受一个参数。将接受的参数转换为数字,然后再判断是不是NaN
如果对一个对象调用isNaN,或者对其进行整数操作,首先会调用对象的valueOf()方法
与此类似的有isInfiite() , 将参数转换为数字,常规数字 -> true 否则 -> false
- 还有一个常用的比较方法: Object.is().他基本与 ===相同,只有两点不同: Object.is(NaN, NaN) === true ; Object.is(0, -0) === false
- toString(base)
通过num.toString(base) 可以将数字转换为特定base进制的字符串。
数字的摄入操作
Math.floor() 向下取整
Math.ceil() 向上取整
Math.round() 就进取整
Math.trunc() 移除小数点后的所有内容,没有舍入
不精确的计算
这里有一个常见的问题: 为什么0.1 + 0.2 !== 0.3
原因: 数据在内存中是以二进制进行存储的,0.1 和 0.2转换成二进制都是无限循环小数。而在JS中,小数位的精度为17位,超过的话会进行舍入,从而造成舍入误差。
如何解决? 通过toFixed(n) 进行解决。通过toFixed(n)可以对结果进行舍入,保留n个小数位,且返回的结果为字符串。
字符串转换成数字
parseInt()
parseFloat()
在这里,他们接受一个字符串,从字符串中第一个数字位开始读取,直到遇到一个非数字位。parseInt()还可以接受第二个参数,表示以多少进制解析字符串
小操作: 在字符串之前加上+ , - 可以把字符串立即转换成数值。
String类型
现在的字符串表示形式主要有三种方式:
单引号
双引号
模板字符串的形式(
abcd
)
模板字符串是ES6中出现的。作为新出现的特性,必定是为了解决以前存在的一些痛点,及做了扩展。
主要有两种:
- 可以实现多行文本。
之前的字符串,要实现换行,一般都是在文本中要换行的地方插入 \n 。这种方式很不方便。
- 可以让我们较为自由的插入变量。
一般我们的字符串字面量一旦创建就不会也不能再发生改变。而在模板字符串中,通过使用占位符${var}可以实现将变量嵌入到字符串中。更为具体地说,不仅仅可以插入变量,只要是JS表达式,都可以进行插入。
- 标签模板。可以在模板字符串前加上一个标签模板,可以是一个函数。
调用toString()方法,将其他值转换成字符串的值。
NULL
仅仅代表 ”空“,“无” 或者 “值未知”。
Undefined
表示一个值,已经声明但是未被赋值。
注意 undefined和undeclared的区别:
undefined表示已经被声明了,只是这个变量还没有被赋值。undeclared表示连声明都没有。所以,虽然基本类型中没有undeclared,但是要注意区别。
Object类型
对象类型,其实就是一组键值对。他可以通过对象字面量创建,也可以通过new操作符来创建。
每个Object的实例都具有一下几种属性:
Constructor : 指向创建该对象实例的函数。
hasOwnProperty() : 检查特定属性书不是在当前对象实例中(而不是在原型中)
isPrototypeOf(object) : 用于判断传进来的对象是不是当前对象的原型。
toLocalString() : 返回对象的字符串表示。与当地对应。
toString() : 对象的字符串表示
valueOf() : 返回对象的数值,字符串或布尔值表示。
propertyIsEnumerable(proname) : 当前对象的属性能不能通过for-in来枚举。
Symbol
主要用于定义唯一的标识符。
如何判断数据的类型
- Typeof
- Instanceof
如果想要判断一个对象的具体类型,可以通过 obj instanceof Obj 来进行判断。
原理: 判断Obj是不是在obj的原型链上。
- Object.prototype.toString.call()