JS的数据类型(深入理解undefined与null)

 

JS的数据类型

总体来说,JS的数据类型可以分为两大类

基本数据类型:

string: 任意字符串

number: 任意数字(整数、小数)

boolean: false/ true

undefined: undefined

null: null 

引入数据类型

object: 任意对象

Array: 一种特别的对象(数值下标属性,内部数据是有序的)

Function:一种特别的对象(可以执行)

 以上就是JS的全部的基本数据类型,但是怎么判断一个值是什么数据类型呢??? 接下来将会详细讲解

首先,可以通过typeof、instanceof、=== 来进行判断,但是,他们之间有什么区别呢? 每一种数据类型需要怎么判断呢?

在判断数据类型的时候,你需要知道,typeof 返回的是数据类型的字符串表达,而instanceof返回的是一个boolean值,用于判断对象的具体类型

首先,先对基本数据类型进行判断。

undefined

      var a
      console.log(a, typeof a, typeof a === 'undefined', a === undefined) //undefined 'undefined'  true true
      console.log(undefined === 'undefined') // false

这里注意,我们声明一个a,但是没有给他赋值,他的默认值为undefined。typeof a  返回的是'undefined',注意:这里是数据类型的字符串表达。 因为undefined的值只有一个,所以可以使用===进行直接比较。

string、number、boolean

      a = 3
      console.log(typeof a === 'number') // true

      a = 'hello'
      console.log(typeof a === 'string') // true

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

通过以上代码发现,string、number、boolean数据类型,只能通过typeof 进行判断

null

      a = null
      console.log(typeof a, a === null) //object true

在基本数据类型中,undefined和null很特殊,因为他们的值只有一个。但是typeof 判断null的类型,会返回object(后序会讲解为什么),通过===是可以判断null的数据类型的。

对象类型的判断

首先,先创建一个这样的对象

var b = {
        b1: [1, 'abc', console.log],
        b2: function() {
          console.log('b3')
          return function () {
            return 'hello word'
            }
        }
      }

这里大家可以思考一下,console.log是一个什么类型的数据(可以将自己的想法评论在下方)

 console.log(b instanceof Object, b instanceof Array) // true false

通过instanceof可以判断b是对象类型,这里的Object和Array都是构造函数

console.log(b.b1 instanceof Array, b.b1 instanceof Object) // true true
console.log(typeof b.b1) // object

b.b1是一个数组,可以看出数组也属于Object类型,数组是一种特殊的对象。但是不能通过typeof 来判断是否为数组

      console.log(b.b2 instanceof Function, b.b2 instanceof Object) // true true
      console.log( typeof b.b2 ==='function') // true

b.b2  是一个函数,可以通过typeof来进行判断

总结:经过以上代码研究,可以发现,typeof可以判断的数据类型有:string、number、boolean、function、undefined,但是不能判断null与object 、 Array和object。===可以判断undefined和null ,因为他们都只有一种值。

 


基本数据类型中,undefined和null 都表示一个空值,那么他们有什么区别呢?????

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

 当我们声明了一个变量,没有对其进行初始化时,他的值为undefined

那么我们是否可以将一个值初始为undefined呢? 

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

显然是可以的! 一般而言,我们不存在需要显式地把一个变量设置为undefined值的情况,因为对于未经初始化的值默认就会取得undefined值,而已经初始化的值再将其赋值为undefined来表示空值是没有意义且不可取的。

window.undefined

从上面的例子我们可以看出,无论我们是否初始化过变量,都可以把变量赋值为undefined。

其实这里用于赋值的undefined不是一个值,它是一个属性名,undefined是全局对象的一个属性,也就是说,它是全局作用域的一个变量,即window.undefined,而window.undefined这个属性的值才是前面所说的原始值undefined。

data = undefined;这就相当于把一个变量window.undefined的值赋值给另一个变量data,这个值就是原始值undefined。

console.log(window.undefined); //原始值undefined

undefined的判断

如何判断一个变量是否为undefined呢? 这里有两种方法

1. 就是前面所说的使用严格相等符 === 

2. 使用typeof,严格来说,需要以下方式

var data;
console.log(data === void 0); //true

 因为void运算符,会对给定的表达式求值,然后返回undefined,因此我们可以使用void 0,来代替undefined来进行判断。

(function() {
    var undefined = 'not is undefined';
    console.log(undefined); //"not is undefined"
    console.log(typeof undefined) // "string"
})()

undefined的值是可以改变的,所以直接使用undefined会不安全。

Null类型

Null类型是第二个只有一个值的数据类型,这个特殊的值就是null。值 null 是一个字面量,它不像undefined 是全局对象的一个属性。

但是为什么typeof null 的返回类型确实object呢? 原因有两个:

            一方面从逻辑角度来看,null值表示一个空对象指针,它代表的其实就是一个空对象,所以使用typeof操作符检测时返回”object”也是可以理解的。

           另一方面,其实在JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了”object”。在ES6中,当时曾经有提案为历史平凡, 将type null的值纠正为null, 但最后提案被拒了,所以还是保持”object”类型。

null使用

一般会在两个地方使用:

初始赋值为null,表示该声明的变量将要赋值为对象

结束前为null,表示将该对象变成垃圾对象,被垃圾回收器回收。

 

以上就是我对JS数据类型的理解,如果有不对的地方,请大家及时指出!!!

猜你喜欢

转载自blog.csdn.net/qq_44313091/article/details/105389435