JavaScript漫谈之理解类型操作符typeof
在本文中,将简述JavaScript类型系统和数据类型,以及如何使用
typeof操作符执行类型检查。还讲解了使用
typeof操作符进行某些数据类型检查是不完善的,并介绍其他几种类型检查的方法。更多内容欢迎关注GitHub
每种编程语言都有自己的类型系统和数据类型,但各种编程语言的数据结构常有不同之处。使用JavaScript时,其引擎会在脚本执行期间隐式强制转换执行值的类型。类型检查对于编写可预测的JavaScript程序是非常有必要的。
JavaScript中的
typeof操作符就是用于基础的类型检查
typeof操作符返回字符串,表示未经计算的操作数的类型(来自MDN)
一、JavaScript的数据类型
在此之前,需要了解JavaScript有哪些数据类型,最新标准定义了8种数据类型:
7种原始类型:
BooleanNullUndefinedNumberStringBigIntSymbol
其他为引用类型:
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中,使用let或const声明的块级作用域变量在初始化之前与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的更多相关文章
- JavaScript的三种类型检测typeof , instanceof , toString比较
1.typeof typeof是js的一个操作符,在类型检测中,几乎没有任何用处. typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number. ...
- JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱
JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...
- 玩转JavaScript OOP[1]——复杂类型
概述 在JavaScript中,我们可以使用函数.数组.对象,以及日期.正则等一些内置类型的实例,它们都是复杂类型的表现.从本质上讲,这些复杂类型都是Object类型.本篇将主要介绍三种Object类 ...
- 玩转JavaScript OOP[0]——基础类型
前言 long long ago,大家普遍地认为JavaScript就是做一些网页特效的.处理一些事件的.我身边有一些老顽固的.NET程序员仍然停留在这种认知上,他们觉得没有后端开发肯定是构建不了系统 ...
- JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
- 前端知识体系:JavaScript基础-变量和类型
前端工程师自检清单 1. JavaScript规定了几种语言类型 2. JavaScript对象的底层数据结构是什么 3. Symbol类型在实际开发中的应用.可手动实现一个简单的 Symbo 4. ...
- JavaScript判断对象的类型
JavaScript判断对象的类型 最近阅读了一些关于JavaScript判断对象类型的文章.总结下来,主要有constructor属性.typeof操作符.instanceof操作符和Object. ...
- [JS]js中判断变量类型函数typeof的用法汇总[转]
1.作用: typeof 运算符返回一个用来表示表达式的数据类型的字符串. 可能的字符串有:"number"."string"."boolean&q ...
- JS类型判断typeof PK {}.toString.call(obj)
参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...
随机推荐
- python多线程与多进程及其区别
个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...
- sublime text 3 15个常用插件介绍
1.ColorPicker 功能:调色板(需要输入颜色时,可直接选取颜色) 使用:快捷键Windows: ctrl+shift+c 2.Emmet 功能:编码快捷键,前端必备 使用:在输入代码段后,按 ...
- 世界十大OTA公司盘点
世界十大OTA公司盘点 文/刘照慧(执惠旅游联合创始人,首发百度百家) 全球在线旅游公司(OTA)经过多年发展,已经形成较为成熟的商业模式,各大巨头跑马圈地,格局初现, 这两篇文章就梳理出全球按市值( ...
- Python连载30-多线程之进程&线程&线程使用举例
一.多线程 1.我们的环境 (1)xubuntu 16.04(2)anaconda(3)pycharm(4)python 3.6 2.程序:一堆代码以文本的形式存入一个文档 3.进程:程序运行的一个状 ...
- python基础知识 01
一.计算机基础知识 计算机有硬件+操作系统+软件应用组成 cpu:人的大脑 内存:人的临时记忆 硬盘:人的永久记忆 操作系统 控制计算机硬件工作的流程 应用程序 安装在操作系统上的软件 二.Pytho ...
- 微信小程序如何动态增删class类名达到切换tabel栏的效果
微信小程序和vue还是有点差别的,要想实现通过动态切换class来达到切换css的效果,请看代码: //wxml页面: <view class="tab"> <v ...
- 基于Visual C#的AutoCAD开发——一些网址
https://blog.csdn.net/xwebsite/article/details/5578446 http://www.cadgj.com/?p=1504
- pip安装第三方库
不是所有的第三方Python包都能通过pip来安装,只能是发布在pypi.org上面的才能通过pip安装. pypi是什么? pypi是一个仓库,上面存放了大量的Python第三方软件包,是由Pyth ...
- Nginx安装之源码安装
nginx部署 1. 安装依赖 yum install gcc gccc++ pcre pcre-devel zlib zlib-devel openssl openssl-devel-y 2. 下载 ...
- aabccd统计每个字符出现的次数,结果显示{ a: 2, b: 1, c: 2, d: 1 };去掉重复的字符,使结果显示abcd
遍历字符串的方式和遍历数组的方式有点相似,或者说就是相同的.在学习数组的遍历方法之前,可以通过for循环去遍历数组,同样,字符串也可以:字符串跟数组都有一个length的属性.下面代码奉上,个人思路! ...