JavaScript中字符串类型检查:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

“这是字符串吗?”——困扰每个JavaScript开发者的问题



你正在编写代码,突然停了下来。变量本应包含一个字符串,但万一它变成了null?或者数字?更糟糕的是,undefined?



熟悉吗?如果是——你并不孤单。“Check if a variable is a string in JavaScript” 这个问题是Stack Overflow上最热门的问题之一,拥有数万次浏览。这并非偶然:JavaScript是一种动态类型语言,与类型相关的错误即使是有经验的开发者也会遇到。



在本文中,我们将解析所有可能的检查变量是否为字符串的方法。你将了解到:

  • 为什么typeof是你最好的朋友(但并非总是如此)
  • instanceof何时会失效
  • “狙击手”方法Object.prototype.toString如何工作
  • 以及如果你使用库时该怎么办


开始吧!🚀



方法 #1:typeof —— 经典之作



最简单快捷的方法是typeof运算符。它返回一个包含类型名称的字符串:



const name = "Алиса";const age = 25;const isAdmin = true;

console.log(typeof name); // "string"console.log(typeof age); // "number"console.log(typeof isAdmin); // "boolean"


检查字符串的方式如下:



if (typeof variable === "string") {  console.log("是的,这是一个字符串!");}


优点:

  • 运行速度快
  • 无需导入
  • 可读性强


缺点:

  • 无法区分原始字符串"строка"和对象new String("строка")
  • 对于null返回"object"(JavaScript的历史错误)


顺便说一下,关于null——这是语言的一个已知bug,为了不破坏旧网站,已经不会再修复。所以typeof null === "object"是正常的。



那 new String() 呢?



在JavaScript中有两种字符串:原始类型(普通)和对象类型(通过new String()创建)。实际上你几乎永远不会使用new String(),但了解一下还是值得的:



const primitiveString = "Привет";const objectString = new String("Привет");

console.log(typeof primitiveString); // "string"console.log(typeof objectString); // "object"


如果你的代码中有人(或某物)传递了对象字符串,typeof会欺骗你。但别担心:在实际项目中这种情况很少见。



方法 #2:instanceof —— 用于对象字符串



instanceof运算符检查一个对象是否是特定类的实例:



const str = new String("Тест");console.log(str instanceof String); // true

const str2 = "Тест";console.log(str2 instanceof String); // false — 因为这是原始类型


如你所见,instanceof不适用于原始字符串。因此它很少被使用——只有当你确切知道你在处理对象时才会用到。



什么时候可能有用?如果你在编写一个同时接受原始类型和对象的库。但对于99%的情况,typeof就足够了。



方法 #3:Object.prototype.toString.call() —— 万能战士



这个方法就像一名狙击手。它适用于任何数据类型,并且从不出错:



function isString(value) {  return Object.prototype.toString.call(value) === "[object String]";}

console.log(isString("Привет")); // trueconsole.log(isString(new String("Привет"))); // trueconsole.log(isString(123)); // falseconsole.log(isString(null)); // falseconsole.log(isString(undefined)); // false


博客

书籍推荐