JavaScript中的数据类型

91 阅读2分钟

JavaScript中的数据类型

JavaScript是一门动态类型的语言,所谓动态,是因为在JavaScript代码运行过程中存在着很多隐式的强制类型转化。 而对于那些静态类型语言来说,一个变量在声明的时候就已经确定了它的类型,后续赋值只能是限定的类型。

结论:JavaScript中变量是没有类型的,但是值却是有类型的,也可以说JavaScript中的数据有“类型”。

JavaScript中基本的数据类型:

  • null
  • undefined
  • boolean
  • number
  • string
  • object
  • symbol

数组、函数其实是特殊的对象,函数是一种可执行的对象。下边代码予以说明:

const fn = function (target, name) {};
const arr = [1, 2];

Object.getOwnPropertyNames(fn); // ["length", "name", "arguments", "caller", "prototype"]
Object.getOwnPropertyNames(arr); // ["0", "1", "length"]

可以看到函数是具有特殊属性 caller的对象;数组的属性为数值以及包含length属性。

const num = 123;
const str = '456';
const bool = true;
const obj = { name: 'zz' };
const sym = Symbol('des');
const fn = function () {};
const fn1 = () => {};
const arr = [];

console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof num); // number
console.log(typeof str); // string
console.log(typeof bool); // boolean
console.log(typeof obj); // object
console.log(typeof sym); // symbol
console.log(typeof fn); // function
console.log(typeof fn1); // function
console.log(typeof arr); // object

// 推荐使用下边的方式判断数据类型
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(num)); // [object Number]
console.log(Object.prototype.toString.call(str)); // [object String]
console.log(Object.prototype.toString.call(bool)); // [object Boolean]
console.log(Object.prototype.toString.call(obj)); // [object Object]
console.log(Object.prototype.toString.call(sym)); // [object Symbol]
console.log(Object.prototype.toString.call(fn)); // [object Function]
console.log(Object.prototype.toString.call(fn1)); // [object Function]
console.log(Object.prototype.toString.call(arr)); // [object Array]

在判断数据类型的时候有些JavaScript历史遗留问题,就是typeof null 返回的是object, 这个问题由来已久,估计是不会修复了。 同样判断数组的时候也不符合我们的预期。

因此判断一个数据类型是不是null的情况推荐使用下班的Object.prototype.toString来进行判断。

虽然说数组以及函数都是特殊类型的对象,但是Object.prototype.toString都返回了我们期望的结果。