如何确定变量是字符串还是JavaScript中的其他变量?


当前回答

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

我在这里看到了:

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/

其他回答

表演

今天2020.09.17我在Chrome v85、Safari v13.1.2和Firefox v80上对MacOs HighSierra 10.13.6进行了测试,以确定所选的解决方案。

后果

对于所有浏览器(以及两个测试用例)

解决方案类型||instanceof(A,I)和x===x+''(H)是快速/最快的解决方案_.isString(lodash-lib)是中等/快速的解决方案B和K是最慢的

更新:2020.11.28我更新了x=123 Chrome列的结果-对于解决方案I,之前可能有一个错误值(=69M太低)-我使用Chrome 86.0重复测试。

细节

我为解决方案执行2个测试用例A.BCDEFGH我JKL

当变量为字符串时,可以在此处运行当变量不是字符串时-可以在此处运行

下面的代码片段显示了解决方案之间的差异

// https://stackoverflow.com/a/9436948/860099函数A(x){return(typeof x==“string”)||(x instanceof string)}// https://stackoverflow.com/a/17772086/860099函数B(x){return Object.pr原型.toString.call(x)==“[对象字符串]”}// https://stackoverflow.com/a/20958909/860099函数C(x){return _.isString(x);}// https://stackoverflow.com/a/20958909/860099函数D(x){return$.type(x)==“string”;}// https://stackoverflow.com/a/16215800/860099函数E(x){返回x?。constructor==字符串;}// https://stackoverflow.com/a/42493631/860099函数F(x){返回x?。charAt!=无效的}// https://stackoverflow.com/a/57443488/860099函数G(x){return字符串(x)==x}// https://stackoverflow.com/a/19057360/860099函数H(x){返回x===x+''}// https://stackoverflow.com/a/4059166/860099函数I(x){返回类型x==“string”}// https://stackoverflow.com/a/28722301/860099函数J(x){返回x===x?。到字符串()}// https://stackoverflow.com/a/58892465/860099函数K(x){返回x&&typeof x.valueOf()==“string”}// https://stackoverflow.com/a/9436948/860099函数L(x){return x字符串实例}// ------------------//演示文稿// ------------------console.log('不同输入的解决方案结果\n\n');console.log(“'abc'Str‘‘‘‘1‘‘0‘1 0{}〔〕true false null undef”);let tests=['abc',new String(“abc”),'','','1','0',1,0,{},[],true,false,null,undefined];[A,B,C,D,E,F,G,H,I,J,K,L]映射(F=>{控制台日志(`${f.name}`+测试.map(v=>(1*!!f(v))).join``)})<script src=“https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js“></script><script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js“integrity=”sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==“crossrorigin=”匿名“></script>此shippet只显示性能测试中使用的函数,而不执行测试本身!

下面是铬的示例结果

isString()使用可选链接和最新标准检查传递的参数是否为字符串:

const isString = (value) => { 
    return value?.constructor === String;
}

一个简单的解决方案是:

var x = "hello"

if(x === x.toString()){
// it's a string 
}else{
// it isn't
}

最佳方式:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

其中的每一个都是由其相应的类函数构造的,如“new Object()”等。

此外,鸭子打字:“如果它看起来像鸭子,走路像鸭子,闻起来像鸭子,那一定是一个阵列”意思是,检查它的财产。

希望这有帮助。

编辑12/05/2016

记住,你也可以使用各种方法的组合。以下是使用类型为的内联操作映射的示例:

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

下面是一个更“真实”的使用内联映射的示例:

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

该函数将使用[custom]“类型转换”,而不是“类型-/-值映射”,来确定变量是否实际“存在”。现在,你可以在0和0之间分割那讨厌的头发了!

很多时候你甚至不在乎它的类型。另一种避免键入的方法是组合Duck Type集合:

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

Number.prototype和String.prototype都有.toString()方法。您只需确保与数字等效的字符串相同,然后确保将其作为数字传递给http函数。换句话说,我们甚至不在乎它的类型。

希望能给你更多的工作机会:)

这是对我有用的:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else