javascript数据类型

443 阅读5分钟

javascript数据类型:

基础数据类型

js数据分为两种类型:原始(基本)数据类型和引用(复杂)数据类型。

原始(基本)数据类型有:StringNumberBooleanundefinednullSymbol(ES6新增)
引用(复杂)数据类型有:ObjectArrayDateFunction和自定义类等

基础数据类型判断

1、typeof()函数

对于原始数据类型,我们可以使用typeof()函数来判断他的数据类型:

typeof(1)                              //number
typeof("1")                            //string
typeof(true)                           //boolean
typeof(undefined)                      //undefined
typeof(null)                           //object
为什么 typeof 运算符对于 null 值会返回 "object"。
这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。
现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。

2、instanceof

typeof()函数对于原始类型的判断还差强人意,但他是没法用来区分引用数据类型的,因为所有的引用数据类型都会返回"object"。于是javascript引入了java中使用的instanceof,用来判断一个变量是否是某个对象的实例,所以对于引用类型我们使用instanceof来进行类型判断。

var obj = {};
obj instanceof Object;           //true

var arr = [];
arr instanceof Array;           //true

var now = new Date();
now instanceof Date;             //true

var func = function(){};
func instanceof Function;        //true

var str = "string";
str instanceof String;           //false

3、Object.prototype.toString.call()

在javascript高级程序设计中提供了另一种方法,可以通用的来判断原始数据类型和引用数据类型。 常用的类型判断函数:

	// 是否是字符串
    function isString(value){
        return Object.prototype.toString.call(value) == "[object String]";
    }
    // 是否是数字
    function isNumber(value){
        return Object.prototype.toString.call(value) == "[object Number]";
    }
    // 是否是布尔值
    function isBoolean(value){
        return Object.prototype.toString.call(value) == "[object Boolean]";
    }
    // 是否undefined
    function isUndefined(value){
        return Object.prototype.toString.call(value) == "[object Undefined]";
    }
    // 是否是null
    function isNull(value){
        return Object.prototype.toString.call(value) == "[object Null]";
    }
    // 是否数组
    function isArray(value){
        return Object.prototype.toString.call(value) == "[object Array]";
    }
    // 是否是函数
    function isFunction(value){
        return Object.prototype.toString.call(value) == "[object Function]";
    }
    // 是否是对象
    function isObject(value){
        return Object.prototype.toString.call(value) == "[object Object]";
    }
    // 是否是正则表达式
    function isRegExp(value){
        return Object.prototype.toString.call(value) == "[object RegExp]";
    }
    // 是否是日期对象
    function isDate(value){
        return Object.prototype.toString.call(value) == "[object Date]";
    }

4、constructor

在W3C定义中的定义:constructor 属性返回对创建此对象的数组函数的引用

就是返回对象相对应的构造函数。从定义上来说跟instanceof不太一致,但效果都是一样的

如: (a instanceof Array) //a是否Array的实例?true or false

  (a.constructor == Array) // a实例所对应的构造函数是否为Array? true or false

举个例子:

function employee(name,job,born){
    this.name=name;
    this.job=job;
    this.born=born;
}

var bill=new employee("Bill Gates","Engineer",1985);
console.log(bill.constructor);
 //输出
 //function employee(name, jobtitle, born){
 //this.name = name; this.jobtitle = job; this.born = born;
 //}

那么判断各种类型的方法就是:

console.log([].constructor == Array);
console.log({}.constructor == Object);
console.log("string".constructor == String);
console.log((123).constructor == Number);
console.log(true.constructor == Boolean);

较为严谨并且通用的方法:

function isArray(object){
    return object && typeof object==='object' &&
            Array == object.constructor;
}

5、jquery判断js数据类型

$.isArray([1,2]);              // 数组
$.isFunction(function () { }); // 函数function
$.isEmptyObject(null);         // null,undefind
$.isXMLDoc();    // xml
typeof (2) === "number";    // 数字
typeof ("2") === "string";  // 字符串
typeof (true) === "boolean";// bool型
typeof (function () { }) === "function";// 函数function

当然还有其他的判断方法,这里就不一一列举了。仅供参考。

基本数据类型和复杂数据类型的区别

首先需要了解这两种数据类型的存储方式=》栈(stack)和堆(heap)

stack为自动分配的内存空间,它由系统自动释放; heap则是动态分配的内存,大小也不一定会自动释放

基本数据类型:

基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问。

引用数据类型:

引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。

引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存

1、变量声明是内存分配不同

 *原始类型:存储在栈中,占据内存空间是固定的,存放在栈中,这样便于迅速查询变量的值。

 *引用类型:存储在堆中,栈中存储的变量用来查找堆中的引用地址。(引用值的大小不固定,会改变,所以不能把引用值存储在栈中,若存储在栈中会降低变量查询的速度。所以变量存放在栈中的值只是这个对象存储在堆重的地址,地址大小固定,所以引用地址存储在栈中,引用值存在堆中不会堆变量查询的速度没有影响)

2、因为内存分配的不同所以读取机制也不同

JavaScript是允许直接访问堆中的对象,所以访问一个对象时,是通过栈中的引用地址,然后通过这个地址去堆内存中查找对象。而原始类型的值是可以直接在栈中访问到的。

3、变量复制时不同

1)原始值:在将一个存储着值时的变量复制给另外一个变量的时候,会将存储的值赋值给新的变量,之后的两个变量时候完全独立的,只是有相同的值而已。

2)引用值:在将一个保存着引用地址的变量赋值给另一个变量,会把这个引用地址赋值给新的变量,但是这个引用地址都是指向相同的堆中的对象(复制对象时并不会在堆中产生新的对象),所以新的变量或者之前的变量任何一个作出改变的时候,这两个变量都会改变。

就这么多了。需要继续积累。