ECMAScriptJavaScript中“基本项目”之争

前端面试中常被问到的题材之一就是“JavaScript的主导类型有三种?”。

局地答问“数字、字符串、布尔”,有的可能会再增加“Null、Undefined”。而有人或许以为“object”也是基本项目。到底是什么样呢?

 

所谓“基本项目(primitive
types)”的概念ECMAScript(V3,V5)中压根就从未有过,它只是将品种分为6种。

ECMAScript 1

ECMAScript只涉嫌类型,用types表示,在V3,V5整个文档搜关键字“primitive”也没见“primitive
type”,“primitive
value”倒是有,如true/false/0-9等。那表明规范压根就从不所谓的“基本类型”、“原始类型”一说(primitive
types)。即使非要说有那么object明显也是,即有6种为主项目。

 

部分书籍却日常应用这么些概念,如《JavaScript高级程序设计》第一版、第二版,第三版。

第一版涉嫌有5种原始类型,即Undefined、Null、Boolean、Number、String

ECMAScript 2

其次版和第三版又搞出了个simple data
type,翻译为简便数据类型(也称为基本数据类型),称对象为复杂性数据类型。

ECMAScript 3

 

另一本经典书《JavaScript权威指南(第6版)》第3章也提到了primitive types

ECMAScript 4

先分为焦点项目(primitive
types)和目的类型,基本类型又分为数字,字符串,布尔,及多个与众不一样null,undefined。

 

5年前JavaScript方面的图书还很少,那两本书就是其中之二,影响也很大,可谓经典。因而受此影响的JSer不乏少数。我想书小编把语言类型分为宗旨类型(元类型)和对象类型(复杂类型)也是契合学习逻辑的,复杂类型由不难类型组合而成。其它也是惨遭任何语言如Java的熏陶,它们也是把项目分为宗旨类型(8种)和目的类型。

但ECMAScript中从不所谓的primitive
types,就好比它从未类(class)的概念一样(具有其他语言能力的人仍旧喜欢在JavaScript使用名词“类”)。它其中涉及的就是项目,可以把它精晓成基本类型,但也应有是6种。那里的着力项目也不是Java中的基本项目,因为它含有了复杂数据类型-对象。

 

不是富有的书都以为JavaScript中挑大梁项目唯有5种(不包蕴对象),《JavaScript语言精髓与编程实践》认为是6种,如下

ECMAScript 5

它并未将null归为内部,却充实了function类型。
它的基于是typeof的结果唯有6种(仅含ES自身,不包涵宿主对象),如下

var a = 1, b = '2', c = true, d, e = null, f = function(){}

typeof a === 'number'; // true
typeof b === 'string';    // true
typeof c === 'boolean'; // true
typeof d === 'undefined'; // true
typeof e === 'object'; // true
typeof f === 'function'; // true

累计是6中项目,注意null的花色时object。有的书说null的贯彻是那时候的一个谬误,什么人知道啊。

 

大家来看wiki中基本数据类型的定义

  • a basic type is a data
    type
     provided by
    programming
    language
     as
    a basic building block. Most languages allow more complicated composite
    types
     to be
    recursively constructed starting from basic types.
  • a built-in type is a data type for
    which the programming language provides built-in
    support. **In most programming
    languages, all basic data types are built-in. In addition, many
    languages also provide a set of composite data types. Opinions vary
    as to whether a built-in type that is not basic should be considered
    “primitive”.

 

翻译以下

  • 主干类型是这般一种数据类型,它是由编程语言提供的最中央的构建块,多数语言还同意众多复杂的由基本项目组成的复合数据类型
  • 松手类型是由编程语言本身提供的品种,多数编程语中兼有的着力类型都是放置的。其余,很多语言还提供一组复合数据类型。一个停放类型是不是该认为是“原始的”的连串那些一向留存争议。

 

ES6新增了一种
Symbol花色,它是一种不可变的系列,表示无比的值。一般作为目的属性的标识符使用。ES6
此前的特性名都是字符串类型,会招致属性名的重写覆盖。ES6 提议 Symbol
类型后,JS的中坚类型即扩大到了 7 种。

上边是 Symbol 的为主采纳

var s1 = Symbol();
typeof s1; // "symbol"

var s2 = Symbol('andy');
s2; // Symbol(andy)