前端面试中常被问到的问题之一就是“JavaScript的基本类型有几种?”。

有的回答“数字、字符串、布尔”,有的可能会再加上“Null、Undefined”。而有人可能认为“object”也是基本类型。到底是什么样呢?

所谓“基本类型(primitive types)”的概念ECMAScript(V3,V5)中压根就没有,它只是将类型分为6种。

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

一些书籍却经常使用这个概念,如《JavaScript高级程序设计》第一版、第二版,第三版。

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

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

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

先分为基本类型(primitive types)和对象类型,基本类型又分为数字,字符串,布尔,及两个特殊null,undefined。

5年前JavaScript方面的书籍还很少,这两本书就是其中之二,影响也很大,可谓经典。因此受此影响的JSer不乏少数。我想书作者把语言类型分为基本类型(元类型)和对象类型(复杂类型)也是符合学习逻辑的,复杂类型由简单类型组合而成。另外也是受到其它语言如Java的影响,它们也是把类型分为基本类型(8种)和对象类型。

但ECMAScript中没有所谓的primitive types,就好比它没有类(class)的概念一样(具有其它语言能力的人仍然喜欢在JavaScript使用名词“类”)。它里面提到的就是类型,可以把它理解成基本类型,但也应该是6种。这里的基本类型也不是Java中的基本类型,因为它包含了复杂数据类型-对象。

不是所有的书都认为JavaScript中基本类型只有5种(不包括对象),《JavaScript语言精髓与编程实践》认为是6种,如下

它没有将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 a 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)

JavaScript中“基本类型”之争相关推荐

  1. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别

    [Java教程]JavaScript中值类型和引用类型的区别 0 2017-02-24 00:00:35 JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和 ...

  2. 在javascript中判断类型

    String 一个字符串始终是一个字符串,所以这一块是很容易.除非使用new(new String)调用,否则typeof将返回"object".所以也要包含那些可以使用的字符串i ...

  3. 如何处理javascript中var类型有效数据极限值问题(超大数据)

    最近在做web项目中遇到一个从来未遇到的问题,这个问题相信做为web开发的程序员来说遇到的可能性比较小!那么这个问题是怎么样出现的呢?我们有该如何解决这个问题呢? 由于javascript是弱类型语言 ...

  4. (总结版)Javascript中的类型转换规则 以及 JS加法运算中的类型转换规则

    一.其他值到布尔类型的值的转换规则 以下这些是假值: • false • undefined • null • +0.-0 和 NaN • "" 假值的布尔强制类型转换结果为 fa ...

  5. 为什么要在JavaScript中使用静态类型? (使用Flow进行静态打字的4部分入门)

    by Preethi Kasireddy 通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? (使用Flow进行静态打字的4部分入门) (Why use stati ...

  6. JavaScript中的强制类型转换规则

    JavaScript中的类型从来都不是在定义的时候就确定的,而是在运行期间确定的 JavaScript中的强制类型转换总是返回基本类型值 JavaScript中常见的转换就是向数字.字符串.布尔值进行 ...

  7. 理解JavaScript的原始类型

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript中的原始类型(primitive type)包括Undefined.Null.Number.Boolean ...

  8. JavaScript中的数组和字符串

    知识内容: 1.JavaScript中的数组 2.JavaScript中的字符串 一.JavaScript中的数组 1.JavaScript中的数组是什么 数组指的是数据的有序列表,每种语言基本上都有 ...

  9. 浅谈Javascript中的函数重载实现

    其它面向对象语言如Java的一个常见特性是:能够根据传入的不同数量量或类型的参数,通过"重载"函数来发挥不同的功用.但是这个特性在Javascript中并没有被直接支持,可是有很多 ...

  10. JavaScript 中 Property 和 Attribute 的区别

    转自:http://www.cnblogs.com/elcarim5efil/p/4698980.html property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(pro ...

最新文章

  1. AI语音交互芯片提供商“芯声智能”获千万级Pre-A轮融资
  2. 递归和循环:斐波那契数列
  3. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】
  4. Interference Signal 第八届
  5. springboot activiti工作流简单示例
  6. php将excel导入mysql,PHP实现将EXCEL文件导入到MYSQL
  7. 分类预测回归预测_我们应该如何汇总分类预测?
  8. bzoj 1488: [HNOI2009]图的同构
  9. 视频教程-cURL实战教程-PHP
  10. 南航理论计算机科学答案,专业认证理念下的计算机专业本科生培养管理模式研究——以南航计算机科学与技术专业为例...
  11. 微信小程序客服可以直接在手机回复吗,小程序客服功能怎么用手机回复,微信小程序客服手机版
  12. ubuntu 18.04 安装 wine5.0
  13. 24 - 面向对象1
  14. 计算机音乐奇迹再现乐谱,天谕手游奇迹再现乐谱代码分享
  15. 轻松在线绘制进化树和增加热图注释
  16. 手机按键触发事件--隐藏APP到任务后台
  17. Vue安装element ui踩坑
  18. 整理:用matlab创作歌曲(三)
  19. 浅谈SVG的两个黑魔法
  20. sqlite3数据库损坏修复方法(windows下)

热门文章

  1. (转)如何看待美国监管机构要求文艺复兴基金提交源码?
  2. 工作六年后,对软件开发的一些新观点
  3. 进阶之路:Java 日志框架全画传(下)
  4. 【感悟】放开那条大腿,让我来!
  5. 【优化覆盖】基于matlab改进的鲸鱼算法求解无线传感器WSN覆盖优化问题【含Matlab源码 XYQMDXP001期】
  6. 【预测模型】基于matlab模糊小波神经网络目标威胁评估【含Matlab源码 1621期】
  7. 【优化求解】基于matlab遗传算法求解仓库货位优化问题【含Matlab源码 1770期】
  8. 【烟雾检测】基于matlab背景模糊模型视频烟雾检测【含Matlab源码 153 期】
  9. 社会达尔文主义 盛行时间_新达尔文主义的心理理论
  10. 吃豆人 博弈_强化吃豆人