js中的数据类型

这几天重新开始复习JavaScript的一些基础知识,今天正好看到了“js中的数据类型”相关的知识(以ES5为参考,所以不讨论symbol),那就在这里扯一扯吧。
一、js中的数据类型有哪些?
JavaScript是一门弱类型语言,它的变量是无类型的,变量可以被赋予任何类型的值。在js中,数据类型有六种,其中有五种基本数据类型和一种对象类型(复杂数据类型)。基本数据类型把数据名和值直接存储在栈当中,而复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储对象的属性及值。访问时先从栈获取地址(即栈中存放的是对象的引用),再到堆中拿出相应的值。

基本数据类型:

1.number:任意的数字。
2.string:任意的字符串。
3.boolean:只有两个值,true和false。
4.null:只有一个值,null。
5.undefined:只有一个值,undefined。
这五种基本数据类型相信大家都明白,就不做展开了。

对象类型(object):

常见的有function(我把它理解为一种可以执行的对象),array等。

二、判断数据类型的方法
1.typeof
判断数据类型最常用的方法就说typeof了,它可以用来判断大多数的数据类型,下面是具体的例子:

var a;
console.log(typeof a);//undefined

a = 1;
console.log(typeof a);//number

a = '1';
console.log(typeof a);//string

a = true;
console.log(typeof a);//boolean

a = NaN;
console.log(typeof a);//number

a = [1,2,3,4];
console.log(typeof a);//object

a = new Object();
console.log(typeof a);//object

a = null;
console.log(typeof a);//object

大家会发现,虽然typeof能判断大多数数据的类型,但是无法区分null与object,也无法区分object和array,所以要区分它们,我们要另辟蹊径。其实,规范尝试过修改typeof null,让其返回“null”,但是修改完后大量网站无法访问,为了兼容,还是让它返回”object”。

2.instanceof
instanceof是基于原型链的一种判断对象类型的方式,它可以判断一个对象具体的类型。instanceof的左操作数为对象,如果不是就返回false,右操作数必须是函数对象或者构造函数,不是就会抛出typeError异常。下面是具体的例子:

var a = [];
console.log(a instanceof Array);//true

a = {};
console.log(a instanceof Object);//true

function Person() {}
var b = new Person();
console.log(b instanceof Person);//true

3.Object.prototype.toString
Object.prototype.toString也是一种基于原型链的判断数据类型的方法,因为js中每一个对象(空对象除外)都会继承自Object,下面是例子:

console.log(Object.prototype.toString.apply([]));// [object Array]

console.log(Object.prototype.toString.apply(function () {}));// [object Function]

console.log(Object.prototype.toString.apply(null));// object Null]

console.log(Object.prototype.toString.apply(undefined));//[object Undefined]

那么我们就可以用这种方法来区分array与object,null与object。

4.全等(===)
说这个之前,先说一说JavaScript中,“==”和“===”的区别:
1.“==”叫做相等运算符,在比较的时候可以先转换数据类型,然后进行值的比较,比如:’1’==1,将返回true。
2.“===”叫做全等运算符,它的运算规则如下:
(1)“===”两侧,只要类型不匹配就返回flase,上述例子中左侧为string类型,右侧为number,所以直接返回false。
(2)对基本数据类型,如果两侧的数据类型相同,就进行值的比较,值相同就返回true,否则返回false。
(3)对复合数据类型,并不是比较它们的值是否相等,而是比较它们的引用是否相等,即它们在栈中的地址是否相同,如果引用相等,则返回true,否则返回false。

已经扯了这么多,那么进入全等判断数据类型的正题,下面是例子:

var a;
console.log(a === undefined);//true

a = null;
console.log(a === null);//null

我们常用这种方法来判断某个数据的数据类型是否为null

5.duck type(鸭式辩型)
什么叫鸭式辩型呢?它是由一位叫做James Whitcomb Riley的作家提出的:
像鸭子一样走路、游泳、并且能嘎嘎叫的鸟就是鸭子。。那么对于JavaScript程序猿来说,“如果一个对象可以像鸭子一样走路、游泳并且嘎嘎叫,就认为这个对象是鸭子,哪怕它并不是从鸭子类的原型对象继承而来的。”
比如我们不知道一个对象是不是数组,那么我们可以判断它的length是不是数字,它是不是有join,push这样一些数组的方法。通过一些特征判断对象是否属于某些类型,这个有时候也常用,可以用它实现一些接口,留在之后再更。(未完待续…)

三、null与undefined
这里就说一说null与undefined的区别吧:null表示定义了一个变量并给它赋了值,值就是null,打印该变量,值为null。而undefined表示定义了一个变量,但是并没有给这个变量赋值,如果打印该变量,输出的结果为undefined,这样子是不是就很容易理解了。

var a;
console.log(a); //undefined

a = null;
console.log(a); //null

那么我们在什么时候给变量赋值为null呢?主要有以下两种情况:
1.初始赋值,表明该变量是一个对象,比如我想声明一个对象,但是并不知道接下来有哪些操作,我们就可以把它先赋值为null,即变量的数据类型为object。
2.在一个对象不再被使用时,将其变为垃圾对象,使其被垃圾回收器回收。

重点:
1.JavaScript中有哪些数据类型,如何判断这些数据类型。
2.如何判断一个变量的值是否为null。
3.“===”与“==”的区别。
4.null与undefined的区别。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值