js基础阵营:变量篇之变量类型
前面我们已经说过了变量的提升,那么变量具体有哪些类型呢?
当前JavaScript具有5个基本数据类型,分别是:null,undefined,string,number,boolean。以及两个非基础数据类型,分别是:object,symbol(ES6新增)。下面我们来一一来介绍下
null
顾名思义是空,没有的意思,所以在js中他是一个空指针,空值的意思。他不同于没有定义(ReferenceError)以及定义未赋值(undefined)。通常我们用来定义一个对象为空的赋值。那么如果我们通过typeof来查看null的类型会是什么值呢?
我们可以看到是一个object,而不是我们想象中的null。为什么呢?在我看来就是一个当年设计语言的时候为了靠近其他语言,所以通过null来表明是一个空指针。那么我们如果判断一个数据是否是null还是对象呢?我们可以通过以下代码来实现
if(typeof data === 'object' && !data){
// 这里就是null了
}
undefined
JavaScript中第二个特殊的变量就是undefined。通过我们定义了一个变量,但是没有初始化的时候,此时这个变量的值即为undefined。我们可以在控制台看下以下代码
var name;
typeof name; //undefined
那么如果我们一个变量没有定义,通过typeof来看是什么呢?
image.png从程序的逻辑上来讲是合理的,但是从我们日常开发来讲这样就很难通过typeof 来判断是未定义还是未初始化。所以我们在日常开发中需要养成将变量定义的时候初始化的习惯,这样我们才能通过typeof来判断数据的正确性。
boolean
布尔类型,只有两个值,不同于上面两个只有一个值,他永远只有true以及false两种情况。通常我们在需要判断的时候都需要使用布尔值。虽然布尔值只有true和false两个值,但是在javascript中所有的值都有跟这两个值相对等的值。我们可以通过显式的方法Boolean来获取。那么哪些值会对应的是true呢?将在下一章变量的转换中有讲解(又挖了一个坑)。
string
字符串,在js中通过通过“”或者‘’来创建,例如
var name = '二锅头';
var name2 = "二锅头";
在js中字符串是不可变的。也就是说在js中如果创建了一个变量且初始化了后,值是不能改变,如果改变则是先销毁原有的值,然后创建新值后赋值给原有变量。其实不难理解,在前面我们已经说过了,字符串是非引用类型,也就是说我们存储的值是直接存储在内存中的,当我们要去改变的时候必然要先去清除原有的值,才能赋值。所以我们在执行以下代码的时候是什么样的呢?
var name="二锅头";
name += ',你好';
按照我们先销毁再赋值的理论,我们可以明显知道,在执行这代码的时候,编辑器先创建一个6位的字符串,存储二锅头,你好然后将原有的name值的二锅头销毁后再将6位的字符串赋值给name.在低版本的浏览器中我们其实能感受这个过程,因为在某些低版本浏览器中会很慢。
number
数字,包括整数以及浮点数两类。整个number类型本身是没有什么可讲解的,其更多的是在数值转换上,我们将在下章讲解。但是关于浮点数有一个很常见的问题,那就是浮点数的精度问题,我们来看一下代码
0.1 + 0.2 === 0.3
在我们的认知中应该是true,但是实际上不是,实际上返回的值是false。为什么呢?归根到底就是因为精度问题,由于js的浮点数的精度是17位,所以其精度根本无法与整数相比。所以才会导致此类问题的出现。这个时候我们不仅仅要担心,是不是浮点数都这样,大可不必,大多数的情况下数据是不会出现问题的,那么我们如何能将上面的代码变成true呢?此时我们需要使用ES6中的EPSILON(机器精度)。因此我们可以使用以下方法来处理上面的问题
function test(n1,n2) {
return Math.abs(n1- n2) < Number.EPSILON
}
test(0.3,(0.1 + 0.2));
object
对象,其实就是数据和功能的有序集合。对象的创建不同于前面的几个类型的数据,通常对象的创建需要借助于对象类型来创建。例如:
var person = new Object();
但是在实际的日常工作中,我们很少这样定义,通常通过一个{}来定义,例如:
var person = {};
两者都能创建出一个对象。
至此我们关于js中的变量类型都已经说明完成了,其实还有一个symbol对象没有说明,此类型我们将在后面ES6篇章中详细说明。下一章我们将开启类型转换。敬请期待