“这是字符串吗?”——困扰每个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
博客
书籍推荐
推荐阅读