在本文中,将简述JavaScript类型系统和数据类型,以及如何使用typeof操作符执行类型检查。

还讲解了使用typeof操作符进行某些数据类型检查是不完善的,并介绍其他几种类型检查的方法。

更多内容欢迎关注GitHub

每种编程语言都有自己的类型系统和数据类型,但各种编程语言的数据结构常有不同之处。使用JavaScript时,其引擎会在脚本执行期间隐式强制转换执行值的类型。类型检查对于编写可预测的JavaScript程序是非常有必要的。

JavaScript中的typeof操作符就是用于基础的类型检查

typeof操作符返回字符串,表示未经计算的操作数的类型(来自MDN

一、JavaScript的数据类型

在此之前,需要了解JavaScript有哪些数据类型,最新标准定义了8种数据类型:

  • 7种原始类型:

    • Boolean
    • Null
    • Undefined
    • Number
    • String
    • BigInt
    • Symbol
  • 其他为引用类型:

    • Object
    • 数组array()、函数function()、正则表达RegExp特殊的物体:

      • array是一种特殊的对象,它是一个有序的编号值集合
      • function是一种特殊类型的对象,具有与之关联的可执行脚本块有关

JavaScript还有几个对象类构造函数,用于创建其他类型的对象:

  • Date—用于创建日期对象
  • RegExp—用于创建正则表达式
  • Error—用于创建JavaScript错误

二、typeof功能

1、语法

typeof使用一元操作符(只需要一个操作数)的计算结果作为其操作数的类型结果字符串。

另一种替代语法就是将操作数放入括号中使用,这种对JavaScript表达式返回的值进行类型检查非常有用。

typeof 参数
typeof(参数)

参数:一个表示对象或原始值的表达式,其类型将被返回

typeof "sueRimn";        // 'string'
typeof 22; // 'number'
typeof NaN; // 'number'
typeof Infinity; // 'number'
typeof true; // 'boolean'
typeof false; // 'boolean'
typeof [1, 2]; // 'object'
typeof {age: 22}; // 'object'
typeof null; // 'object'
typeof undefined; // 'undefined'
typeof String; // 'function'
typeof Boolean; // 'function'
typeof Number; // 'function'
typeof Object; // 'function'
typeof Function; // 'function'
typeof person; // 'function'

undefined是它自己的JavaScript类型

在ES6之前,typeof不管操作数是否声明,总是返回一个字符串,即对于未声明的标识符,总是返回而不是抛出错误。

在ES6中,使用letconst声明的块级作用域变量在初始化之前与typeof操作符使用,将抛出错误。

原因是:块级作用域变量在被初始化之前一直保留在临时死区。

console.log(typeof name === 'undefined'); // ReferenceError
const name = 'sueRimn';

2、一般类型检查

JavaScript中执行类型检查主要使用typeof操作符

function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw '参数必须是数值'
}
return a + b;
}

以下是对类型检查的简单摘要:

类型
undefined "undefined"
null "object"
原始对象 "object"
所有数组 "object"
其他对象 "object"
true/false "boolean"
字符串 "string"
所有符号 "symbol"
所有函数 "function"
宿主对象 依赖于实现

检测值是否存在在不同环境是这样的:

if (typeof window !== 'undefined') {
// 浏览器
}; if (typeof process !== 'undefined') {
// Node.js
} if (typeof $ !== 'undefined') {
// jQuery
}

3、其他类型检查

对于某些值需要额外的类型检查才可以区分,例如null[]在使用typeof操作符执行type-check时都是"object"类型,但是区分它们需要额外的操作。

一些其他数据类型值检查方法

  • 使用instanceof
  • 检查对象的constructor属性
  • 使用对象的toString()方法检查对象类

(1)检测是否为空

使用typeof操作符检查值是否为空并不好,检查值是否为空的最佳方法是对值与关键字进行严格相等比较。

以上代码呈现的结果是不一样的,所以使用严格相等操作符是非常重要的。

(2)检测NaN

任何涉及NaN的算术运算都将对NaN求值,如果想为任何形式的算术运算使用值,那么需要确保该值不是NaN

使用typeof操作符检查NaN值是否返回"number"。要检查NaN值,可以使用全局函数isNaN(),或者ES6中的Number.isNaN()函数:

NaN值非常特殊,通过比较,它永远不等于任何其他值,包括它自己:


可以使用以下方法在非ES6环境下检测NaN

function isNan(value) {
return value !== value;
}

最后,你可以利用ES6中的Object.is()函数来测试值是否为NaN

以下函数作用是检查两个值是否相同:

function isNan(value) {
return Object.is(value, Number.NaN);
}

(3)检测数组

使用typeof检查数组将返回object。这里介绍几种检测数组的方法,并进行对比:

  • 使用constructor属性(不推荐)
function isArray(value) {
return typeof value == 'object' && value.constructor === Array;
}
  • 使用instanceof(不推荐,因为对象的原型可以更改)
function isArray(value) {
return value instanceof Array;
}
  • 使用Object.prototype.toString()(推荐,类似于ES6 Array.isArray()
function isArray(value) {
return Object.prototype.toString.call(value) === '[object Array]';
}

object.prototype.tostring()方法对于检查任何JavaScript值的对象类型都非常有用

  • 使用ES6 Array.isArray()

function isArray(value) {
return Array.isArray(value);
}
												

JavaScript漫谈之理解类型操作符typeof的更多相关文章

  1. JavaScript的三种类型检测typeof , instanceof , toString比较

    1.typeof typeof是js的一个操作符,在类型检测中,几乎没有任何用处. typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number. ...

  2. JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱

    JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...

  3. 玩转JavaScript OOP[1]——复杂类型

    概述 在JavaScript中,我们可以使用函数.数组.对象,以及日期.正则等一些内置类型的实例,它们都是复杂类型的表现.从本质上讲,这些复杂类型都是Object类型.本篇将主要介绍三种Object类 ...

  4. 玩转JavaScript OOP[0]——基础类型

    前言 long long ago,大家普遍地认为JavaScript就是做一些网页特效的.处理一些事件的.我身边有一些老顽固的.NET程序员仍然停留在这种认知上,他们觉得没有后端开发肯定是构建不了系统 ...

  5. JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)

    这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...

  6. 前端知识体系:JavaScript基础-变量和类型

    前端工程师自检清单 1. JavaScript规定了几种语言类型 2. JavaScript对象的底层数据结构是什么 3. Symbol类型在实际开发中的应用.可手动实现一个简单的 Symbo 4. ...

  7. JavaScript判断对象的类型

    JavaScript判断对象的类型 最近阅读了一些关于JavaScript判断对象类型的文章.总结下来,主要有constructor属性.typeof操作符.instanceof操作符和Object. ...

  8. [JS]js中判断变量类型函数typeof的用法汇总[转]

    1.作用: typeof 运算符返回一个用来表示表达式的数据类型的字符串.  可能的字符串有:"number"."string"."boolean&q ...

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

    参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...

随机推荐

  1. 夯实Java基础(六)——包装类

    1.包装类简介 我们都知道Java是面向对象编程语言,包含了8种基本数据类型,但是这8种基本数据类型并不支持面向对象的特征,它们既不是类,也不能调用方法.这在实际使用时存在很多的不便,比如int类型需 ...

  2. Scala集合(四)

    1. 集合 集合主要有三种: Sequence Map Set sequence是一种线性元素的集合,可能会是索引或者线性的(链表).map是包含键值对的集合,就像Java的Map,set是包含无重复 ...

  3. Streaming+Sparksql使用sql实时分析 rabbitmq+mongodb+hive

    SparkConf sparkConf = new SparkConf()//此处使用一个链接切记使用一个链接否则汇报有多个sparkcontext错误 .setAppName("Spark ...

  4. java封装 redis 操作 对象,list集合 ,json串

    /** * 功能说明: * 功能作者: * 创建日期: * 版权归属:每特教育|蚂蚁课堂所有 www.itmayiedu.com */package com.redis.service; import ...

  5. 洛谷 P1196 [NOI2002]银河英雄传说

    题意简述 有30000列,每列都有一艘战舰,编号1~30000 有2种操作: 1.将一列的战舰运到另一列 2.询问两个战舰是否在同一列,如果是,求出它们之间的距离 题解思路 并查集, 维护每个点x离自 ...

  6. (九)c#Winform自定义控件-树

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. 如何以python风格高逼格的改成购物车逻辑

    之前有一篇博文写到关于购物车的业务逻辑,分别运用cookie和redis存储未登录和登录用户的购物车数据,虽然已经很好的完成了业务逻辑,但是会发现代码的冗余很严重,也不够具有python特色,今天就让 ...

  8. Knative 基本功能深入剖析:Knative Serving 之服务路由管理

    导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...

  9. Java虚拟机详解(五)------JVM参数(持续更新)

    JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况.但是如果你想在有限的硬件资源下,部署的系统达到最大的运行效率,那么进行相关的JVM参数设置是必不可少的.下面我们就来对 ...

  10. 前端中的设计模式 JavaScript

    最近再准备秋招,然后顺便把过去空白的设计模式相关概念补一补,这些内容都是从<JavaScript设计模式与开发实践>一书中整理出来的 (1)单例模式 定义:保证一个类仅有一个实例,并提供一 ...