​重学Javascript之数据类型

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

​重学Javascript之数据类型
​重学Javascript之数据类型

  • 如果对一个对象调用isNaN,或者对其进行整数操作,首先会调用对象的valueOf()方法

  • 与此类似的有isInfiite() , 将参数转换为数字,常规数字 -> true  否则 ->  false

  • 还有一个常用的比较方法: Object.is().他基本与 ===相同,只有两点不同: Object.is(NaN, NaN) === true ;  Object.is(0, -0) === false
  • toString(base)

通过num.toString(base) 可以将数字转换为特定base进制的字符串。

​重学Javascript之数据类型

数字的摄入操作

  • 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个小数位,且返回的结果为字符串。

​重学Javascript之数据类型

​重学Javascript之数据类型

字符串转换成数字

  • parseInt()

  • parseFloat()

在这里,他们接受一个字符串,从字符串中第一个数字位开始读取,直到遇到一个非数字位。parseInt()还可以接受第二个参数,表示以多少进制解析字符串

​重学Javascript之数据类型

小操作: 在字符串之前加上+ , - 可以把字符串立即转换成数值。

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

​重学Javascript之数据类型

  • Instanceof

如果想要判断一个对象的具体类型,可以通过 obj instanceof Obj 来进行判断。

原理: 判断Obj是不是在obj的原型链上。

  • Object.prototype.toString.call()

​重学Javascript之数据类型