35个答案
if(typeofmyVar==='string'||myVar instanceofString) //这是一根绳子 其他的 //这是另一回事
//测试此方法: 让isString=value=>typeofvalue==='string'||valueinstanceofString; let falseCase=[ [“null”,null], [“未定义”,未定义], [“对象”,{a:1,b:2}], [“数组”,[1,2,3]], ['数字',123], [“零”,0], [“RegExp”,新RegExp(“hello”)], [“number with valueOf returning string”,Object.assign(10,{valueOf:()=>“abc”})], ['伪装成字符串的对象',{constructor:string}] ]; 让trueCase=[ ['空文本字符串',''], ['unicode string literal',string.fromCharCode(10000)], ['空的装箱字符串',新字符串('')], [“unicode装箱字符串”,新字符串(string.fromCharCode(10000))], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:Array})], ['string with overrided“toString”',Object.assign('hi',{toString:123})], ['带覆盖“valueOf”'的字符串,Object.assign('hi',{valueOf:123})], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:RegExp})], [“代理字符串”,new Proxy(new string('hello'),{})], ]; console.log('负面测试:'); for(falseCases的let[name,val]){ console.log(`Test${name}:\n预期:false\n获得:${isString(val)}`); } console.log('\nPOSITIVE TESTS:'); for(let[name,val]of trueCases){ console.log(`Test${name}:\n期望:true\n得到:${isString(val)}`); }
-
172 -
127 @我记得。 在JavaScript中,可以有字符串的变量类型或字符串类的对象类型(相同的东西-都是字符串-但定义不同),这就是为什么要进行双重检查的原因。 – DRAX公司 评论 2012年4月26日10:04 -
59 var somevar=new String('somestring')console.log(typeof somevar)//对象 评论 2013年7月9日8:52 -
159 -1因为 运算符 检查这里是没有意义的噪音,除非你遵循一些 非常不寻常 编码实践,而这个答案并不能解释它做什么或为什么你会使用它。你需要它的唯一原因是如果你使用对象标记字符串,但对象标记字符串是一个没有价值的特性,没有人使用,谷歌和克罗福德都谴责这是一个糟糕的实践( google-styleguide.googlecode.com/svn/trunk/… , crokford.com/javascript/recommend.html ). – 马克·阿梅里 评论 2015年8月16日17:34 -
222 我强烈反对编写正确处理不太可能出现的情况的可靠代码是应该避免的。 检查两者 类型 和 运算符 如果你的代码可能被其他人调用,我觉得这是个好建议@ MarkAmery的 邮递信息 如果你问“我刚才是什么?” 邮递信息 d?天? “-但你应该在接口上处理,不允许传播。在其他地方,处理非弃用的编码方法似乎是正确的,即使一些JS美学专家不赞成它们。千万不要将代码注释为接受String,除非它真的接受了! – 德维·摩根 评论 2015年9月4日4:11
var booleanValue=true; var数值=354; var stringValue=“这是一个字符串”; var stringObject=new String(“这是一个字符串对象”); console.log(typeofbooleanValue)//显示“boolean” console.log(typeofnumericalValue)//显示“数字” console.log(typeofstringValue)//显示“string” console.log(字符串对象类型)//显示“对象”
//测试此方法: 让isString=value=>typeof value===“字符串”; let falseCase=[ [“null”,null], [“未定义”,未定义], [“对象”,{a:1,b:2}], [“数组”,[1,2,3]], [“数字”,123], [“零”,0], ['RegExp',新RegExp('hello')], [“number with valueOf returning string”,Object.assign(10,{valueOf:()=>“abc”})], ['伪装成字符串的对象',{constructor:string}] ]; 让trueCase=[ ['空文本字符串',''], ['unicode string literal',string.fromCharCode(10000)], [“空装箱字符串”,新字符串(“”)], [“unicode装箱字符串”,新字符串(string.fromCharCode(10000))], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:Array})], ['string with overrided“toString”',Object.assign('hi',{toString:123})], ['带覆盖“valueOf”'的字符串,Object.assign('hi',{valueOf:123})], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:RegExp})], [“代理字符串”,new Proxy(new string('hello'),{})], ]; console.log('负面测试:'); for(falseCases的let[name,val]){ console.log(`Test${name}:\n预期:false\n获得:${isString(val)}`); } console.log('\nPOSITIVE TESTS:'); for(let[name,val]of trueCases){ console.log(`Test${name}:\n期望:true\n得到:${isString(val)}`); }
谷歌JavaScript风格指南 说永远不要使用原始对象包装器 . 道格拉斯·克罗克福德 建议弃用基本对象包装器 .
-
54 -
226 -
8 -
12 -
6 如果它让你头疼,99.99%的时间是因为你没有正确地构造代码。 这并不是NaN存在和做它所做的事情的错,这是你下次处理可能产生它的代码时应该注意、学习和牢记的事情。 评论 2018年10月3日15:44
函数isString(x){ return Object.protype.toString.call(x)===“[Object String]” }
Object.prototype.toString.call(myVar)===“[Object String]”
['Arguments','Function','String','Number','Date','RegExp'].forEach( 函数(名称){ 窗口['is'+名称]=函数(obj){ return toString.call(obj)=='[对象'+name+']'; }; });
模块导出=[ “参数”, “函数”, “字符串”, “数字”, '日期', “RegExp” ].reduce((obj,name)=>{ obj['是'+name]=x=>toString.call(x)=='[对象'+name+']'; 返回对象; }, {});
const fn1=()=>new Promise((resolve,reject)=>setTimeout(()=>resolve({}),1000)) const fn2=async()=>({}) console.log('fn1',Object.prototype.toString.call(fn1)) console.log('fn2',Object.prototype.toString.call(fn2))
//测试此方法: 函数isString(x){ return Object.prototype.toString.call(x)===“[Object String]” } let falseCase=[ [“null”,null], [“未定义”,未定义], [“对象”,{a:1,b:2}], ['数组',[1,2,3], ['数字',123], [“零”,0], ['RegExp',新RegExp('hello')], [“number with valueOf returning string”,Object.assign(10,{valueOf:()=>“abc”})], ['伪装成字符串的对象',{constructor:string}] ]; 让trueCase=[ ['空文本字符串',''], ['unicode string literal',string.fromCharCode(10000)], [“空装箱字符串”,新字符串(“”)], [“unicode装箱字符串”,新字符串(string.fromCharCode(10000))], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:Array})], ['string with overrided“toString”',Object.assign('hi',{toString:123})], ['带覆盖“valueOf”'的字符串,Object.assign('hi',{valueOf:123})], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:RegExp})], [“代理字符串”,new Proxy(new string('hello'),{})], ]; console.log('负面测试:'); for(falseCases的let[name,val]){ console.log(`Test${name}:\n预期:false\n获得:${isString(val)}`); } console.log('\nPOSITIVE TESTS:'); for(let[name,val]of trueCases){ console.log(`Test${name}:\n期望:true\n得到:${isString(val)}`); }
-
22 你推荐underscore.js(出于什么奇怪的原因?)但你在这里不使用它。 此外,您还使用函数污染了全局命名空间。 在node.js中,您将创建一个具有所有这些功能的模块(您 可以 使用 全局窗口 而不是 窗口 但这对于解决一个你一开始就不应该遇到的问题来说是一个糟糕的方法。 – 本杰明·格伦鲍姆 评论 2013年7月21日12:13 -
24 @Benjamin Gruenbaum我来找OP问题的答案,但不喜欢任何答案。 因此,我检查了下划线的作用,认为它足够漂亮,可以进行一些提取和修改(以避免必须加载下划线库)。 我会澄清我的帖子。 – 亲欧派 评论 2013年8月3日0:06 -
35 -
7 -
11 我支持用“错误的答案”和“枪杆子式的答案”来更具体地指帖子,因为回复的数量已经过时了,然后解释为什么当你给出更好的答案时,这些答案是低劣的。 我的两分钱。 – 烟雾鸦667 评论 2019年11月26日22:13
if(_.isString(myVar)) //这是一根绳子 其他的 //这是另一回事
if($.type(myVar)===“字符串”) //这是一根绳子 其他的 //是别的东西
-
162 这是JS社区问题的本质所在——对基本类型的检查是一个单行程序,只涉及语言构造(基本类型之一),但您建议使用外部库。 如果有人已经使用了这些库中的一个,这可能是一个好主意,但下载它们只是为了这个目的,而不是简单地检查类型是一种过度技巧。 – 拉法·弗泽什茨 评论 2016年10月25日10:32 -
6 我会同意拉斐尔的观点。 我到处都看到,使用这些外部库之一可以提高“可读性”。 如果你知道JavaScript,那么它比你没有使用过的外部库更容易阅读。 _.每个() 一开始使用起来有点混乱,简单到 _.isBoolean() 混淆了我公司的开发人员。 开发人员错误地认为,如果值是布尔值且为false,则该值为false。 对我来说,英语比德语更容易阅读,因为我不懂德语。 学习JavaScript,一切都会有意义。 – 夏定忠 评论 2017年4月6日16:33 -
23 @RafałWrzeszcz这些库被广泛使用,并提供了许多有用的(经过测试的)功能。 尤其是洛达什。 我不建议有人下载这个库只用于这个解决方案。。。。 但我建议每个javascript开发人员下载这个库,看看他们遗漏了什么。) – 帕克尔 评论 2017年5月24日10:27 -
24 你们都错过了像Lodash这样的图书馆的要点:而不是速度。 不是“易于开发”。 原因 使用Lodash这样的库可以提供“防御能力”,防止出现会破坏js应用程序的问题。 当您尝试对对象执行字符串操作时会发生致命错误(反之亦然),Lodash为防止这些错误提供了巨大的价值。 – 随机用户名 评论 2017年10月17日21:15 -
14
const str='hello'; if(typeofstr==='string'){…}
自节点v4以来,以下内容已被弃用。
const-util=要求('util'); if(util.isString(myVar)){}
函数isString(obj){ return(Object.prototype.toString.call(obj)===“[Object String]”); }
-
4 -
1 -
三 @玲只是好奇,你为什么要用括号括起来 Object.prototype.toString.call(obj)===“[Object String]” ? 评论 2016年12月6日5:37 -
2 -
1 @JonathanH——如果你看一下亲欧人士的答案的编辑历史,当时 这 答案是这样写的,亲奥威尔说了一些相当复杂的话。 直到2016年,这个答案才被编辑成包含这一点。 所以凌应该获得荣誉! 评论 2021年7月10日21:57
var s=“字符串”; 变量a=[1,2,3]; var o={key:'val'}; (s.constructor===String)&&console.log('它是一个字符串'); (a.constructor===数组)&&console.log('它是一个数组'); (o.constructor===对象)&&console.log('它是一个对象'); (o.constructor===数字||s.constructor===布尔值)&&console.log('这不会运行');
编辑; 12/05/2016
var type={“number”:数学.sqrt.bind(数学),…}[数据类型];
功能是(基准){ var isnt=! {null:true,undefined:true,'':true,false:false,0:false}[datum]; 返回! 不是; } console.log(是(0),是(false),是[未定义],…);//>> 真-真-假
this.id=“998”;// 使用数字或等效字符串 函数get(id){ if(!id||!id.toString)return; if(id.toString()===this.id.toString())http(id||+this.id); //如果(+id===+this.id)。。。; }
-
1 您需要对普通旧数字进行其他检查,因为尝试获取其构造函数属性将失败: – 用户663031 评论 2013年6月17日5时18分 -
-
2 @torazaburo你可能想玩弄断言( (o.constructor===数字||s.constructor===布尔值) ). 传说中, 解析Int 和 NaN公司 是易碎但功能强大的工具。 只需记住,Not-a-Number不是Not-a-Nomber,并且可以定义undefined。 – 科迪 评论 2014年6月11日23:18 -
1 a.constructor===数组错误,有时可能会失败,请使用Array.isArray参见 web.mit.edu/jwalden/www/isArray.html – 阿克斯基比 评论 2014年9月17日11:06 -
1 同意,这是不安全的。 一个更好的方法是使用属性检查——这是目前唯一真正的故障安全方法。 例子: if(thing.call){“它是一个函数”;} 或 if(thing.defineProperties){'它是一个对象';} 谢谢你的输入,axkibe! – 科迪 评论 2014年9月29日19:31
if(类型str===“字符串”){ 返回42; }
const isString=thing=>Object.prototype.toString.call(thing)===“[Object String]”; console.log(isString('foo')); Object.prototype.toString=()=>42; console.log(isString('foo'));
-
4 -
三 @工具制造商Steve Fair。 你当然是对的。 有人可以很容易地改变所有的原生原型,但什么都不起作用。 我想我想说的是,在猴子修补仍然是常见做法的(JS)世界中,依赖这种技术充满了危险,当(更简单的)替代方案保证始终有效时,人们不应该暴露自己(AFAIK,你不能猴子修补 类型 ). 尽管如此,我们还是抓住了这一点。 谢谢您。 – 海关指挥官 评论 2021年7月10日22:33 -
1 这是一种权衡:考虑到这两种方法并不总是返回相同的答案。 所以这取决于你的“规格”——你所说的字符串是什么意思。 “充满危险” 在这种情况下似乎有点强硬。 如果有人修改 对象.原型.to字符串 从而返回不同的结果。。。 坦率地说,这是他们的问题! 我想,可能性不应该成为决定使用何种方法的一个因素。 (我个人不介意;我采用您展示的简单方法,但我不会编写库代码。) 评论 2021年7月12日16:03
性能
结果
解决 typeof实例 (A、I)和 x===x+'' (H) 速度快/最快 解决方案 _.is字符串 (lodash库)为中等/快速 解决方案B和K最慢
细节
// https://stackoverflow.com/a/9436948/860099 函数A(x){ return(typeofx=='string')||(xinstanceofString) } // https://stackoverflow.com/a/17772086/860099 函数B(x){ return Object.protype.toString.call(x)===“[Object String]” } // 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?。 构造函数===字符串; } // https://stackoverflow.com/a/42493631/860099 函数F(x){ 返回x?。 charAt!=字符 无效的 } // https://stackoverflow.com/a/57443488/860099 函数G(x){ 返回字符串(x)===x } // https://stackoverflow.com/a/19057360/860099 函数H(x){ 返回x===x+'' } // https://stackoverflow.com/a/4059166/860099 函数I(x){ 返回类型x==“字符串” } // https://stackoverflow.com/a/28722301/860099 函数J(x){ 返回x===x?。 toString() } // https://stackoverflow.com/a/58892465/860099 函数K(x){ return x&&typeof x.valueOf()===“字符串” } // https://stackoverflow.com/a/9436948/860099 函数L(x){ 返回字符串的x实例 } // ------------------ //演示文稿 // ------------------ console.log(“不同输入的解决方案结果”); 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=>{ 控制台.log( `${f.name}`+tests.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-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovwww==“crossorigin=”anonymous“></script> 这艘船只提供性能测试中使用的功能,它本身不执行测试!
-
你试过多次运行测试吗? 我对在Chrome上运行x=123的策略“I”表示强烈怀疑。 您得到69M,但对于案例A,您得到671M(这基本上是相同的代码,需要额外的测试)。 在这里,该策略在Chrome中以x=123获胜。 坦白地说,这并不是那么重要,但这只是一个提醒,性能微型基准测试很难做到正确。 – 詹姆斯 评论 2020年11月16日16:15 -
-
-
这非常非常有用-谢谢! 但一些定时测试可能是不正确的,例如。 x+''===x 使用创建的字符串失败 新字符串(“String”) 。也许它应该局限于正确的测试,或者至少为每个测试的结果添加列,例如。 无效的 , 未定义 , 123 , 新建对象() (所有人都应该给予 假 )和 "" , “abc” , 新字符串(“”) , 新字符串(“abc”) (所有人都应该给予 真实的 ). 评论 2021年7月11日8:16 -
-
-
typeof str===“string”||str字符串实例 (可以去掉我喜欢的括号 如果(..) 案例); 无论如何,检查第2条中的基本类型和对象类型是清楚和充分的。 无论如何,这些检查应该是“罕见的”。 评论 2019年1月22日20:48 -
1 -
1 是的,@MilaNautikus是唯一的问题 布尔值(str.charCodeAt) 解决方案是它不处理未定义/空的情况; 否则我会说 const isString=str=>str.charCodeAt!== 未定义 为了同样的表现 – 布兰德 评论 2020年10月5日18:27 -
请注意 运算符 在边缘情况下,可以返回误报和漏报。 例如 someFunction.prototype=字符串原型; 将使使用someFunction创建的任何新对象成为String的实例。换句话说 (字符串的新someFunction实例) 返回true。 如果对在不同全局环境中创建的字符串对象进行测试,则会得到假阴性结果。 因此,如果你需要100%确定这不是正确的方法。 – PHP专家 评论 4月26日21:06
var myString=“test”; if(myString.constructor===字符串) { //这是一根绳子 }
-
4 -
4 -
1 -
1 @MikeBeaton没问题: (mystring||false)&&mystring.constructor===字符串 。我使用了false,以防在必须返回布尔值的函数中使用它。 – 雅兰仕 评论 2020年4月24日16:59 -
如果x是字符串,则字符串(x)===x//true //其他情况下均为假
常数测试=x=> 控制台资产 (字符串(x)===x ,`不是字符串:${x}` ) 测试(“一些字符串”) 测试(123)//断言失败 测试(0)//断言失败 测试(/some regex/)//断言失败 测试([5,6])//断言失败 测试({a:1})//断言失败 测试(x=>x+1)//断言失败
如果x是数字,则数字(x)===x//为真 //其他情况下均为假
常量测试=x=> 控制台资产 (数量(x)===x ,`不是数字:${x}` ) test(“some string”)//断言失败 测试(123) 测试(0) 测试(/some regex/)//断言失败 测试([5,6])//断言失败 测试({a:1})//断言失败 测试(x=>x+1)//断言失败
如果x是RegExp,则RegExp(x)===x//为true //其他情况下均为假
常数测试=x=> 控制台资产 (RegExp(x)===x ,`不是regexp:${x}` ) test(“some string”)//断言失败 测试(123)//断言失败 测试(0)//断言失败 测试(/some regex/) 测试([5,6])//断言失败 测试({a:1})//断言失败 测试(x=>x+1)//断言失败
如果x是对象,则对象(x)===x//为true //其他情况下均为假
常数测试=x=> 控制台资产 (对象(x)===x ,`不是对象:${x}` ) test(“some string”)//断言失败 测试(123)//断言失败 测试(0)//断言失败 测试(/some regex/) 测试([5,6]) 测试({a:1}) 测试(x=>x+1)
Array.isArray(x)===x//true,如果x是数组 //其他情况下均为假
常数测试=x=> 控制台断言 (数组.isArray(x) ,`不是数组:${x}` ) test(“some string”)//断言失败 测试(123)//断言失败 测试(0)//断言失败 测试(/some regex/)//断言失败 测试([5,6]) 测试({a:1})//断言失败 测试(x=>x+1)//断言失败
函数(x)===x//始终为false
const fmt=JSON.stringify 功能测试1(){ 常数a=“1” 常数b=1 console.log(`数字(${fmt(a)})===${fmt(b)}`,数字(a)===b)//true } 函数test2(){ 常数a=“1” 常数b=1 console.log(`Number.isInteger(${fmt(a)})`,Number.is Intege(a))//false console.log(`Number.isInteger(${fmt(b)})`,Number.is Integer } 功能测试3(){ name=1//全局名称始终是字符串 控制台.log(fmt(名称))//“1” console.log(`String(${fmt(name)})===${fmt(name){`,String(name)===name)//true } 功能测试4(){ const名称=1//本地名称 控制台.log(fmt(名称))//1 console.log(`String(${fmt(name)})==${fmt(name)}`,String(name)==name)//false } 测试1(); 测试2(); 测试3(); 测试4()
-
var x=新字符串(x); 字符串(x)===x 返回false。 然而 ({}).toString.call(x).search(/String/)>0 总是为棘手的事情而回报 – 不同步的 评论 2020年1月3日12:53 -
1 函数isClass(x,re){return({}).toString.call(x).search(re)>0;}; isClass(“hello”,/String/) 或 是类(3,/Number/) 或 isClass(null,/null/) – 不同步的 评论 2020年1月3日13:12 -
-
-
2 @不同步不明显 新字符串(x) 应该 不过可以算作字符串。 它是一个包装器对象,与普通字符串具有不同的行为。除非您出于某种奇怪的原因对如何处理字符串包装器对象的检查有特定的要求(您可能没有这样的要求,因为根本就没有理由使用它们),否则这并不是对这个答案的反对。 – 马克·阿梅里 评论 2021年11月26日19:13
函数isString(val){ 返回类型val==='string'||((!!val&&typeof val=='object')&&object.prototype.toString.call(val)==='[object string]'); } console.log(isString('hello world!'));// 真实的 console.log(isString(新字符串('hello world'));// 真实的
-
1
var类型=函数(obj){ return Object.prototype.toString.apply(obj).replace(/\[对象(.+)\]/i,'$1').toLowerCase(); };
type('my string')==='string'//true type(new String('my String'))==='String'//true type(`my string`)==='string'//true type(12345)===“字符串”//false type({})===“字符串”//false
type(null)//空 类型(未定义)//未定义 类型([])//数组 类型({})//对象 type(function(){})//函数 类型(123)//编号 type(新编号(123))//编号 类型(/some_regex/)//regexp type(Symbol(“foo”))//符号
-
2 这是一个可爱的小功能,尽管我不会亲自使用它,而是根据需要进行特殊类型的检查,比如 foo===空 或 typeof foo==“字符串” .否决票 可以 因为1。 这可能有点不合习惯; 尽管使用 对象.原型.to字符串 是很常见的,我从未见过有人像你这样从结果中提取类型,只是与可能结果的精确值进行比较,例如 “[对象字符串]” 2.您没有解释regex的作用或原因,对于JavaScript新手来说,这可能非常不清楚。 目前尚不清楚为什么更喜欢这个答案而不是其他答案。 – 马克·阿梅里 评论 2021年11月26日18:22 -
一个荒谬的反例是 Object.assign('abc',{[Symbol.toStringTag]:'notAString'}) -它是一个字符串,但请尝试将其传递给 类型 ! – 格肖姆·梅斯 评论 2023年5月19日13:53
设x=“abc”; console.log(x.constructor.name===“String”);// 真实的 让y=新字符串('abc'); console.log(y.constructor.name===“String”);// 真实的
if(myVar===myVar+“”){ //它的字符串 }其他{ //是别的东西 }
-
5 -
1 -
5 -
1 不适用于 新字符串 创建一种类型的 对象 . w3schools.com/js/tryit.asp? 文件名=tryjs_string_object2 评论 2017年11月7日3:55 -
2
var a=新字符串('') var b=“” var c=[] 函数isString(x){ 返回x!== 空&&x!== 未定义&&x.constructor===字符串 } console.log(isString(a)) console.log(isString(b)) console.log(isString(c))
const is字符串=值=>{ 尝试{ return typeof value()===“字符串”; }捕获(错误){ 返回false; } }; 让示例=“你好,世界!”; console.log(is_string(()=>示例));// 真实的 console.log(is_string(()=>variable_doesnt_exist));// 假
-
-1; 这里的界面很奇怪。 从我期望的名字来看 是字符串(x) 告诉我是否 x个 是一个字符串,但它告诉我 x个 是一个可调用的 收益 字符串。为什么我想传入函数而不是直接传递值? – 马克·阿梅里 评论 2021年11月26日19:06 -
@MarkAmery这个 是字符串 函数用于检查变量是否存在且是否为字符串。传递的箭头函数允许传递一个不存在的变量,而通常,如果变量不存在,我们会收到错误消息:“Uncaught ReferenceError:variable is not defined”。 该用例类似于PHP中的错误控制操作符(即。, is_string(@$example) ). 这可能不是最好或最常见的做法,但有人可能会发现它很有用,这就是为什么这个答案与众不同的原因。 – 格兰特·米勒 评论 2021年11月27日2:35
函数isFromType(变量,类型){ if(typeof type=='string')res=(typeof variable==type.toLowerCase()) else res=(variable.constructor==类型) 返回res }
isFromType('cs','string')//true isFromType('cs',String)//真 isFromType(['cs'],数组)//真 isFromType(['cs'],'object')//false
Object.prototype.isString=函数(){return false;}; String.prototype.isString=函数(){return true;}; var isString=函数(a){ return(a!==null)&&(a!=未定义)&&a.isString(); };
//返回false isString(空); isString(void 0); isString(-123); isString(0); isString(true); isString(false); isString([]); isString({}); isString(函数(){}); isString(0/0); //返回true isString(“”); isString(新字符串(“ABC”));
//这不是字符串 var对象={ //但返回真实的lol isString:function(){return true;} } isString(obj)//应为false,但应为true
var x=“你好” 如果(x===x.toString()){ //这是一根绳子 }其他{ //不是这样的 }
-
1 -
7 -
5 -
1 -
真的? 这个解决方案对我来说太奇怪了,因为 toString() 方法可能会被重写并引发异常(由于某些特定的实现),您的检查肯定不会起作用。 主要思想是,您不应该调用与您想要获取的内容无关的方法。 我甚至没有谈到与 到字符串 方法。 投反对票。 评论 2020年1月28日4:59
设置类字符串变量 对它和实际字符串运行相同的字符串操作以比较输出(证明它们可以像字符串一样处理) 将类字符串转换为实际字符串以显示给您 duckyString() 规范需要实数字符串的代码的输入
text=“你好”; out(text.replace(/e/g,'e')+''+'hello there'.replace'(/e/g','e'')); out('是字符串?'+duckyString(text)+'\t“'+ducky字符串(text,true)+'”\n“); text=新字符串(‘h my’); out(text.toUpperCase()+''+'oh my'.toUperCase(())); out('是字符串?'+duckyString(text)+'\t“'+ducky字符串(text,true)+'”\n“); 文本=368; out((text+'是一个大数字')+“+('368'+'是个大数字’)); out('是字符串?'+duckyString(text)+'\t“'+ducky字符串(text,true)+'”\n“); text=['\uD83D','\uDE07']; out(文本[1]。charCodeAt(0)+“+” 😇' [1] .charCodeAt(0)); out('是字符串?'+duckyString(text)+'\t“'+ducky字符串(text,true)+'”\n“); 函数文本(){this.math=7;}; Text.protype={toString:function(){return this.math+3+'';}} text=新文本(); out(String.prototype.match.call(text,“0”)+“”+text.toString().match(“0””); out('是字符串?'+duckyString(text)+'\t“'+ducky字符串(text,true)+'”\n“);
hEllo thErE hEllo thErE 是字符串吗? 真的“你好” 噢我的噢我的 是字符串吗? 真的“哦,我的” 368是一个大数字368是个大数字 是字符串吗? 真“368” 56839 56839 是字符串吗? 真的” 😇 " 0 0 是字符串吗? 真“10”
函数duckyString(字符串,正常,不可接受){ var类型=空; if(!不可接受) 不可接受={}; if(字符串&&!unacceptable.chars&&unacceptanable.to==null) 不可接受.to=字符串.toString==数组原型.toString; if(字符串==空) ; //测试“字符串”是否只是字符串 否则,如果( ! 不可接受.is&& (字符串类型=='string'||string字符串实例) ) type=“is”; //测试“string+”或“/./”。 test(string)`有效 否则,如果( ! 不可接受.to&& string.toString&&typeof string.toString==“函数”&&string.toString!= 对象.原型.to字符串 ) type=“to”; //测试`[…string]`是否有效 否则,如果( ! 不可接受的.chars&& (字符串长度>0 | |字符串长度==0) ) { type='chars'; //对于每个字符 for(var index=0;键入&index<string.length;++索引){ var char=字符串[索引]; //有效地获得其长度 var长度=((duckyString(char,false,{to:true}))? 烧焦: duckyString(char,true)||{} ).长度; 如果(长度==1) 继续; //unicode代理pair支持 char=duckyString(char,true); length=String.prototype[Symbol&&Symbol.iterator]; if(!(length=length&&length.call(char))||length.next().done||! length.next().done) type=null; } } //如果不想自动转换为实际字符串,则返回true或false if(!(类型&&normalise)) //如果他们想知道为什么它是真的,则使用<type>/null返回true或falsy 返回(标准化==空)? 类型!= null:类型; //执行转换 开关(类型){ 案例“is”: 返回字符串; 大小写“to”: return string.toString(); 大小写“chars”: return Array.from(string).join(''); } }
询问哪个方法认为它是string-y 排除字符串检测方法(例如,如果您不喜欢 .toString() )
out(“边缘测试”) 功能测试(文本、选项){ var result=duckyString(文本,false,选项); text=duckyString(text,true,options); out(结果+“+(结果)?” “'+text+'”:文本); } 测试(“”); 测试(空); 测试(未定义); 测试(0); 测试({长度:0}); 测试({'0':'!',长度:'1'}); 测试({}); 测试(窗口); 测试(假); 测试([“hi”]); 测试(['\uD83D\uDE07']); 测试([['1'],2,新字符串(3)]); 测试([['1'],2,新字符串(3)],{chars:true});
所有阴性病例似乎都得到了解释 这应该在浏览器>=IE8上运行 支持字符串迭代器的浏览器上支持多字节的字符数组
边缘卡测试 是“” null null null null 至“0” 字符“” 字符“!” null null 字符“” 到“假” null null 字符“ 😇 " 字符“123” 至“1,2,3”
//获取标签.js const toString=Object.prototype.toString; /** *获取“value”的“toStringTag”。 * *@私人 *@param{*}value要查询的值。 *@returns{string}返回`toStringTag`。 */ 函数getTag(值){ if(值==空){ 返回值===未定义 ? “[对象未定义]” :“[object Null]”; } return toString.call(value); }
//isString.js格式 从“./getTag.js”导入getTag; /** *检查“value”是否分类为“String”原语或对象。 * *@自0.1.0起 *@类别Lang *@param{*}value要检查的值。 *@returns{boolean}如果`value`是字符串,则返回`true`,否则返回`false`。 *@示例 * *isString('abc') *//=>真 * *isString(1) *//=>假 */ 函数isString(value){ 常量类型=值的类型; 返回( type===“string”||(type==“object”&& 值!= 无效&& ! Array.isArray(值)&& getTag(value)==“[object String]”) ); } 导出默认值为String;
if(可能是A字符串到UpperCase) weHaveAString(可能是AString)
-
@Mike为什么会出错? 如果没有“toUpperCase”成员,那么将解析为undefined,这将像预期的那样无法通过条件测试,而不会抛出任何异常。 – 用户8104581 评论 2022年6月22日18:31 -
-
@Mike重新阅读答案并检查代码是否匹配。 提示: 将字符串转换成大写 与不同 至UpperCase() – 用户8104581 评论 2022年6月28日15:18 -
1 -
1
isNaN(“A”)=真; parseInt(“A”)=NaN; isNaN(NaN)=真;
让ignoreNumbers=“ad123a4m”; 让ign=ignoreNumbers.split(“”).map((ele)=>isNaN(parseInt(ele? ele:“”).连接(“”); console.log(ign);
让isType=(值,类型)=>{ if(type==null||value==null)返回值===type; return Object.getPrototypeOf(value??{}).constructor===type; } //以下所有工作均符合预期: isType('abc',String); isType(123,数字); isType(/abc/,RegExp); isType(null,null); isType(未定义,未定义);
让isString=value=>isType(value,String);
//测试此方法: 让isType=(值,类型)=>{ if(type==null||value==null)返回值===type; return Object.getPrototypeOf(value??{}).constructor===type; } 让isString=value=>isType(value,String); let falseCase=[ [“null”,null], [“未定义”,未定义], [“对象”,{a:1,b:2}], [“数组”,[1,2,3]], ['数字',123], [“零”,0], ['RegExp',新RegExp('hello')], [“number with valueOf returning string”,Object.assign(10,{valueOf:()=>“abc”})], ['伪装成字符串的对象',{constructor:string}] ]; 让trueCase=[ ['空文本字符串',''], [“unicode string literal”,string.fromCharCode(10000)], [“空装箱字符串”,新字符串(“”)], [“unicode装箱字符串”,新字符串(string.fromCharCode(10000))], ['带覆盖“constructor”的字符串',Object.assign('hi',{constructor:Array})], ['string with overrided“toString”',Object.assign('hi',{toString:123})], ['带覆盖“valueOf”'的字符串,Object.assign('hi',{valueOf:123})], 〔'带覆盖的“构造函数”的字符串',Object.assign('hi',{constructor:RegExp})〕, [“代理字符串”,new Proxy(new string('hello'),{})], ]; console.log('负面测试:'); for(falseCases的let[name,val]){ console.log(`Test${name}:\n预期:false\n获得:${isString(val)}`); } console.log('\nPOSITIVE TESTS:'); for(let[name,val]of trueCases){ console.log(`Test${name}:\n预期:true \n得到:${isString(val)}`); }