勿进

该文章还在构思中!!!

https://juejin.im/post/5b0b9b9051882515773ae714

https://www.zhihu.com/question/35442532

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function

本文是无意间的一次思考,

前言

JavaScript 中,有7种数据类型,它们分别是:

  • Number
  • String
  • Boolean
  • Object
  • Null
  • Undefined
  • Symbol

等等,怎么少了一些,Array 呢?Function 呢?没错,它们也可以算作是一种类型,但是其实它们都是特殊的 Object。所以 JavaScript 中数据类型应该包括这些:

  • Number (数字)
  • String (字符串)
  • Boolean (布尔)
  • Object (对象)
    • Array (数组)
    • Function (函数)
    • Date (日期)
    • RegExp (正则)
  • Null (空)
  • Undefined (未定义)
  • Symbol (符号)

那么问题来了:

  1. 身为弱类型的 JavaScript 该怎么判断变量的数据类型?
  2. 为什么 ArrayFunction 这些也算是 Object

ok,那接下来就来回答这两问题。

类型判断

JavaScript 为我们提供了关键字 typeof 来查询变量的类型,使用起来也很简单。

typeof 1;     // "number"
typeof "1"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol('bar'); // "symbol"

然而这个 typeof 也不是那么的令人满意,来看看下面的情况:

typeof {};    // "object"
typeof null; // "object"
typeof []; // "obejct"
typeof function() {} // "function"

你说 {}object 我是完全认同的,你说 []object 我也接受,毕竟前文说了 Array 也是特殊的 Object ,但是 typeof null 返回的是 object 算怎么一回事?还有 typeof function() {} 为什么不是 object

emmm… 先说一下第一个问题吧,为什么 typeof null 返回的是 object

在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了”object”。(reference)

ECMAScript提出了一个修复(通过opt-in),但被拒绝。这将导致typeof null === ‘object’。

简单的说就是 JavaScript 在存储数据的时候,用机器码 0 表示对象,但是由于设计的原因,null 的机器码也是 0 ,所以 typeof null 就是 object 了。这是 JavaScript 遗留的历史问题。

第二个问题,为什么 typeof function() {} 不是 object

首先我们来看一下 typeof 的具体作用到底是什么,
JavaScript 中的类型可以分为 原始类型对象类型,如果有其它语言基础,可以暂时将其理解为 值类型引用类型。其中,对象类型 对应的数据类型是 Obejct原始类型 对应的则是剩下的六种(String, Number, Boolean, Null, Undefined, Symbol)数据类型。

原始类型 是不可变的,此处的 不可变 是指值本身不可变,而不是变量.

var flag = false;
flag = true;

flag 是变量,对应的值是 false,我们可以把 flag 的值修改为 true,也可以修改为 1,这个过程我们改变的是 flag 对应的值, 而不是 falsefalse 永远是 false,是 不可变 的。

new String(1)
String(1)

JavaScript 数据类型和数据结构

typeof

【JS】类型检测

JS 类型判断 typeof PK {}.toString.call(obj);

由Object.prototype.toString.call( )引发关于toString( )方法的思考