字符串和正则表达式
检查非空字符串
如果想确变量是一个字符串(而不仅是一个可以转换为字符串的变量),可以使用 typeof
操作符:
if (typeof myVar === 'string') {
// myVar 是一个字符串
}
如果想检查是否有一个非空字符串,可以像这样加上一个条件:
if (typeof myVar === 'string' && myVar.length > 0) {
// myVar 是一个非空字符串
}
或者想拒绝仅由空格组成的字符串,可以使用 trim()
方法:
if (typeof myVar === 'string' && myVar.trim().length > 0) {
// myVar 是一个不为空或仅由空格组成的字符串
}
要小心如果字符串是由String()
创建的,它的typeof
值是object
,而不是string
。
if (typeof myVar === 'string' || String.prototype.isPrototypeOf(myVar)) {
// myVar 是一个原型类型(primitive type)的,或者是一个由 String() 构造的字符串
}
有一些老旧的字符串验证技术像这样验证字符串是否为空:
if (myVar) {
// myVar 是一个非空字符串
}
因为在JavaScript
中,null
、undefined
和空字符串会被判定为false
。
但是这样子做有一个盲点,就是数字0
也会被判定为false
。
就是说明明想判定if('0')
为true
,但是却成了if(0)
为false
。
最好的方法是将数字转换为字符串,然后再检查是否为空。
将数字转换为字符串
JavaScript 是一种松散类型语言,它会在需要时自动将任何值转换为字符串,例如,如果您将数字与字符串进行比较或使用运算符将数字连接到字符串。事实上,JavaScript 开发人员用于将数字转换为字符串的最简单技巧之一就是简单地将空字符串连接到值开头或结尾:
const myNum = 123;
const myString = '' + myNum; // myString = '123'
现代的做法更倾向于使用显示转换。每个JavaScript
对象都有一个内置的toString()
方法,它将对象转换为字符串。对于数字,您可以使用toString()
方法,包括Number
。你可以像这样使用它:
const myNum = 123;
const myString = myNum.toString(); // myString = '123'
通常,你还需要自定义数字的字符串表示形式。例如,你可能需要固定数量的小数位(例如30.00
而不是30
)。
JavaScript
中内置了三种实用方法,可以帮助你处理数字类型,它们都会创建数字的字符串表示形式:
Number.toFixed()
:允许你指定小数点后要保留的位数。Number.toExponential()
:使用科学计数法,并允许你指定小数点后要保留的位数。Number.toPrecision()
:允许你指定要保留的有效位数,而无需考虑数字的大小。
const myNum = 1242.0055;
const fixedStr = myNum.toFixed(2); // '1242.01'
const precisionStr = myNum.toPrecision(5); // '1242.0'
const scientificStr = myNum.toExponential(2); // '1.24e+3'
如果想要更多的控制,可以使用Intl.NumberFormat
对象,它允许你指定小数点分隔符、千位分隔符、货币符号等。
比如要将数字格式化为美元:
const formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
});
const myNum = 1234.56;
const moneyStr = formatter.format(myNum); // '$1,234.56'
Intl.NumberFormat
对象支持多种选项。您可以更改负数的显示方式、设置最小和小数位数、显示百分比,并在某些语言中选择不同的编号系统。您可以在Mozilla Developer Network
参考中找到全面的信息。
在一些老旧的技术里你可能会看到Number.toLocaleString()
来格式化货币:
const myNum = 1234.56;
const moneyStr = myNum.toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
}); // '$1,234.56'
这种方法也可以,但是如果你要格式化一系列数字,创建并重用一个Intl.NumberFormat
对象将具有更好的性能。
One-Liner
字符串转换为大写
const capitalized = 'hello world'.toUpperCase();
// or
const capitalized = str => str.charAt(0).toUpperCase() + str.slice(1);
字符串反转
const reverseString = str => str.split('').reverse().join('');
// or
const reverseString = str => [...str].reverse().join();
将字符串转换为数字
const toNumber = str => Number(str);
// or
const toNumber = str => +str;
将字符串转换为字符数组
const toCharArray = str => str.split('');
// or
const toCharArray = str => [...str];
// or
const toCharArray = str => Array.from(str);
// or
const toCharArray = str => Object.assign([], str);
将 Snake 大小写转换为 Camel 大小写
const snakeToCamel = str =>
str.toLowerCase().replace(/(_\w)/g, word => word.toUpperCase().substr(1));