ECMAScript中有5中基本数据类型:Undefined
,Null
,Boolean
,Number
,String
,还有一种复杂数据类型对象(Object)
,Object
本质上是由一组无序的名值对组成的,JavaScript一样还定义了另外两种特殊对象:javascript
综上为ES5的所有数据类型,ES6新出了一种数据类型为Symbol
,表示独一无二的值。
函数,数组,对象在后续文章中会有详解(写完后将加上连接,提早埋坑)。本篇文章将回顾学习5种基本类型和Symbol
及数据类型之间的转化。java
Undefined
类型只有一个值,即undefined
,在使用var
声明变量但没有对这个变量初始化时,这个变量的值就是undefined
。面试
undefined
。由于没有赋值初始化的变量就是undefined
这样更有利于咱们比较赋值仍是未赋值的变量。跟Undefined
相似,Null
类型也只有一个值null
。null
表示是一个空对象指针。因此当type of null
的时候返回'object'
数组
undefined
不一样的是,当咱们明确这个变量是将用来保存对象的时候,咱们最好将这个变量初始化为null
,这样有利于咱们只要检查当前这个对象的值是否是null
就能够知道当前的变量是否已经保存了一个对象的引用。同时也能更好的区别undefined
和null
Boolean类型只有两个值:true
和false
这个类型在开发中能够说是用的最多的类型了,大多数判断都是用这个类型来完成的。函数
简而言之就是数字,分为整数和浮点数。最基本的整数数字值是十进制整数的也就是咱们平时用的数字,除了十进制,还有八进制和十六进制。学习
八进制0开头的后面的每位数都是(0~7)如:测试
var num = 0666; // 八进制的438
可是若是不符合规则了,那前面的0就会被忽略,后面数值按照十进制解析,如:指针
var num1 = 0668; // 不符合规则 解析为668
(严格模式八进制是无效的)code
在进行计算的时候八进制和十六进制的数值都会被转化为十进制数值。对象
浮点数,就是通俗理解的小数。因为舍入偏差缘由因此不要将浮点数做为判断依据。
数字能够用科学计数法e表示,如:
var int = 3e3; // 表示3000,至关于3乘以10的3次幂 var float = 3e-3 // 表示0.003 ,至关于3乘以10的-3次幂
数字在javascript中是有范围的:5e-324~1.7976931348623157e308;通常状况是用不到的知道就行,超过范围的数值会自动被转换为Infinity(区分正负)
。若是出现了也能够用isFinite()函数进行识别判断,在范围内转换为true
。
关于数值最后还有一个特殊的值: NaN
表明非数值英文直译缩写(Not a Number);用于原本是要返回数值的操做没有返回数值就会返回NaN
,NaN
有两个特色须要注意一下:
NaN
的操做都返回NaN
NaN
与任何值都不相等,包括NaN
自己。由于以上两个比较难受的特色会致使咱们无法判断一个值是否是NaN
,因此JavaScript给咱们定义了一个函数:isNaN()
这个函数接受一个参数,若是能转化位数值返回false
,不能则true
,如下有几个书上很是经典的例子,请切记(面试可能会用到,哈哈哈哈哈):
isNaN(NaN) // true isNaN(10) // false (10是一个数值) isNaN('10') // false ('10'能够被转化为数值10) isNaN('blue') // true (不能被转化为数值) isNaN(true) // false (能够被转化为1)
手动注意一下这里 isNaN()
的参数也能够是对象,当传入一个对象的时候会先调用被传入对象的valueOf()
方法,而后肯定该方法返回的数值是否能够被转化为数值。若是不能,再调用对象的toString()
方法,再测试返回值是否能够被转化为数值。之因此特别注意这里由于通常JavaScript中的内置函数和操做符都是按照这个流程执行的。下面基于isNaN
举个栗子:
var a = {}; isNaN(a); // true //执行过程 a.valueOf() // {},不能转化。 //而后执行 a.toString() // 返回"[object Object]" 也不能被转化,因此isNaN返回true
说到number类型确定要提一下3个函数:Number()
,parseInt()
,parseFloat()
.功能类似但也不是彻底相同,一个一个来讲。
首先Number()
能够用于任何数据类型,另外两个则是专门用于把字符串转换成数值。Number()
函数的转换规则:
Boolean
值,true
和false
将分别被转换为1
和0
null
,返回0
undefined
,返回NaN
若是是字符串,遵循如下规则:
0
NaN
valueOf()
方法,按照上面的规则调用转换返回值,若是返回NaN
,则继续调用toString()
方法,再次按照上面的规则转换举几个例子:
var num1 = Number('Hello world') // NaN var num2 = Number('') // 0 var num3 = Number('0000000000020') // 20 var num4 = Number(true) // 1
再次手动注意一下 +
操做符与Number()
函数相同 ,以下例:
var str = '1212' +str // 1212
parseInt()
只转换字符串,规则大致能够整理为一下几种:
NaN
NaN
(Number()
返回0
)0
0x
🌰:
var num1 = parseInt('1111cc') // 1111 var num2 = parseInt('') // NaN var num3 = parseInt('0xA') // 10 var num4 = parseInt('11.1') // 11 var num5 = parseInt('070') // 70 var num6 = parseInt('AF',16) // 175 var num7 = parseInt('AF') // NaN (未指定16进制且未带前导0x)
为了不错误解析,建议使用此函数时带着第二个参数parseFloat()
的用法跟parseInt
差很少,区别有一下几点:
🌰:
var num1 = parseFloat('1111cc') // 1111 var num2 = parseInt('0xA') // 0 var num3 = parseInt('11.1') // 11.1 var num4 = parseInt('11.1.11') // 11.1 var num5 = parseInt('011.1') // 11.1
以单引号或者双引号开头结尾表示
特色: 字符串是不可变的,也就是说,字符串一旦建立它的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,而后再用另外一个包含新值得字符串填充该变量
字符串有length属性,可是若是字符串中若是包括以十六进制表示Unicode字符\unnn
这种格式的字符在length里算一个长度,这时length返回的就不是精确的字符数目了
转换字符串的方法:
toString()
: 数值、布尔值、对象和字符串都有toString()
方法,注意的是null
和undefined
没有这个方法,换言之toString()
没法将null
和undefined
转换为字符串,当数值调用toString()
时可传入参数2,8,10……等数字的转换基数(进制数)默认为10String()
可将任何类型转换为字符串。执行规则:若是值有toString()
方法则调用该方法并返回对应的值(没有参数),null
返回"null"
undefined
返回""undefined
小技巧: 待转换的值+ ""
可转换为字符串
是一组数据和功能的集合。能够经过new
操做符后跟要穿件的对象类型名称来建立。建立Object
类型的实例并为其添加属性、方法,就能够建立自定义对象。Object
类型是全部实例的基础从继承的角度来说就是祖宗。Object
的每一个实例都有下列属性和方法:
constructor
: 保存着用于建立当前对象的函数(构造函数)hasOwnProperty(propertyName)
:用于检查给定的属性在当前对象属性中是否存在(不是在实例的原型中)。propertyName
必须以字符串形式指定isPrototypeOf(Object)
: 用于检查传入的对象是不是当前对象的原型propertyIsEnumerable(propertyName)
: 用于检查给定属性是否能使用 for-in
语句来枚举toLocaleString()
: 返回对象的字符串表示,该字符串与执行环境的地区对应(例如,若是是Date类型则返回的数据中与地区相关,在中国返回的格式是"2019/7/27 下午8:12:23"
)toString()
: 返回对象的字符串表示valueOf()
: 返回对象的字符串、数值或布尔值表示。ES6 增长了一个新的基本数据类型 symbol
. 不过,和其余基本数据类型相比,它有点不同凡响,由于它没有字面量的表现形式,并且建立的方式也有点奇怪,只能经过调用全局函数Symbol()
来完成。
使用Symbol
时注意:
boolean
,可是不能转化为Number
。Symbol()
时最好为其传入参数,容易区分;因为symbol
的值是独一无二的,即便是传入相同的参数,两者的值也是不等的。.
调用需用[]
🌰:
let symbol1 = Symbol('a'); let symbol2 = Symbol('a'); let obj = { [symbol1]: '噫呜呜噫', [symbol2]: '哦哦哦哈哈哈哈' } console.log(symbol1 === symbol2) // false console.log(obj.symbol1) // undefined console.log(obj[symbol1]) // 噫呜呜噫 symbol1.toString() // "Symbol('a')" Number(symbol1) // Uncaught TypeError: Cannot convert a Symbol value to a number Boolean(symbol1) // true
symbol
要细说彻底能够但拉出来一篇文章来讲了,因此这里简单介绍一下最基本的用法,后续若是写的话,我会在这里添加连接放纵了好长一段时间了,以前的计划搁置了许久,如今开始重启。各位老铁共同进步,共勉。