如何确定变量是字符串还是JavaScript中的其他变量?
当前回答
我发现这种简单的技术对字符串的类型检查很有用-
String(x) === x // true, if x is a string
// false in every other case
常量测试=x=>控制台断言(字符串(x)==x,`不是字符串:${x}`)测试(“某些字符串”)测试(123)//断言失败测试(0)//断言失败测试(/some regex/)//断言失败测试([5],6])//断言失败测试({a:1})//断言失败测试(x=>x+1)//断言失败
同样的技术也适用于Number-
Number(x) === x // true, if x is a number
// false in every other case
常量测试=x=>控制台断言(数量(x)==x,`不是数字:${x}`)test(“some string”)//断言失败测试(123)测试(0)测试(/some regex/)//断言失败测试([5],6])//断言失败测试({a:1})//断言失败测试(x=>x+1)//断言失败
对于RegExp-
RegExp(x) === x // true, if x is a regexp
// false in every other case
常量测试=x=>控制台断言(RegExp(x)==x,`不是正则表达式:${x}`)test(“some string”)//断言失败测试(123)//断言失败测试(0)//断言失败测试(/some regex/)测试([5],6])//断言失败测试({a:1})//断言失败测试(x=>x+1)//断言失败
与对象相同-
Object(x) === x // true, if x is an object
// false in every other case
NB、正则表达式、数组和函数也被视为对象。
常量测试=x=>控制台断言(对象(x)==x,`不是对象:${x}`)test(“some string”)//断言失败测试(123)//断言失败测试(0)//断言失败测试(/some regex/)测试([5,6])测试({a:1})测试(x=>x+1)
但是,检查Array有点不同-
Array.isArray(x) === x // true, if x is an array
// false in every other case
常量测试=x=>控制台断言(Array.isArray(x),`不是数组:${x}`)test(“some string”)//断言失败测试(123)//断言失败测试(0)//断言失败测试(/some regex/)//断言失败测试([5,6])测试({a:1})//断言失败测试(x=>x+1)//断言失败
但是,此技术不适用于函数-
Function(x) === x // always false
对于@Faither-
const fmt=JSON.stringify函数测试1(){常量a=“1”常量b=1console.log(`编号(${fmt(a)})==${mt(b)}`,编号(a)==b)//true}函数测试2(){常量a=“1”常量b=1console.log(`Number.isInteger(${fmt(a)})`,Number.isInteger(a))//falseconsole.log(`Number.isInteger(${fmt(b)})`,Number.isInteger(b))//true}函数测试3(){name=1//全局名称将始终为字符串console.log(fmt(名称))//“1”console.log(`字符串(${fmt(名称)})==${mt(名称)}`,字符串(名称)==名称)//true}函数测试4(){常量名称=1//本地名称console.log(fmt(名称))//1console.log(`字符串(${fmt(名称)})==${mt(名称)}`,字符串(名称)==名称)//false}测试1();test2();测试3();测试4()
其他回答
function isString (obj) {
return (Object.prototype.toString.call(obj) === '[object String]');
}
我在这里看到了:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
以下方法将检查任何变量是否为字符串(包括不存在的变量)。
const is_string = value => {
try {
return typeof value() === 'string';
} catch (error) {
return false;
}
};
let example = 'Hello, world!';
console.log(is_string(() => example)); // true
console.log(is_string(() => variable_doesnt_exist)); // false
我建议使用jQuery或lodash/Undercore中的内置函数。它们更易于使用和阅读。
任何一个函数都将处理上述DRAX的情况。。。也就是说,它们都检查(A)变量是字符串文本还是(B)它是string对象的实例。在这两种情况下,这些函数都将值正确地标识为字符串。
lodash/Undercore.js
if(_.isString(myVar))
//it's a string
else
//it's something else
jQuery
if($.type(myVar) === "string")
//it's a string
else
//it's something else
有关详细信息,请参阅_.isString()的lodash文档。
有关详细信息,请参阅$.type()的jQuery文档。
Typechecker助手:
function isFromType(variable, type){
if (typeof type == 'string') res = (typeof variable == type.toLowerCase())
else res = (variable.constructor == type)
return res
}
用法:
isFromType('cs', 'string') //true
isFromType('cs', String) //true
isFromType(['cs'], Array) //true
isFromType(['cs'], 'object') //false
此外,如果您希望它是递归的(像作为对象的数组),可以使用instanceof。
(['cs']对象实例//true)
这对我来说已经足够好了。
警告:这不是一个完美的解决方案。请看我帖子的底部。
Object.prototype.isString = function() { return false; };
String.prototype.isString = function() { return true; };
var isString = function(a) {
return (a !== null) && (a !== undefined) && a.isString();
};
你可以像下面这样使用。
//return false
isString(null);
isString(void 0);
isString(-123);
isString(0);
isString(true);
isString(false);
isString([]);
isString({});
isString(function() {});
isString(0/0);
//return true
isString("");
isString(new String("ABC"));
警告:在以下情况下,此操作不正确:
//this is not a string
var obj = {
//but returns true lol
isString: function(){ return true; }
}
isString(obj) //should be false, but true