typeof "andrei" 和 typeof "andrei" .valueOf() 之间的区别


  1. 我都记录了两者,他们返回了相同的结果,但是必须有一个轻微的区别。

不,没有区别,除非有人对JavaScript环境做了愚蠢的事情。

"andrei"是字符串原始性,因此typeof "andrei""string"。如果您执行"andrei".valueOf(),则将字符串原始的启动到String对象(理论上*(,因为您正在访问其上的属性(valueOf(,然后询问该对象的原始值 ——这是一个原始的字符串,因此typeof "andrei".valueOf()"string"

当然,您可以将String.prototype.valueOf替换为除默认值以外的其他内容,该默认值通过返回数字或对象来打破String.prototype.valueOf合同。但这是在奇异的土地上。


*"从理论上" - JavaScript引擎可以自由优化操作,只要优化不能使事情以不按规格规格而行为。因此,JavaScript引擎可以在字符串原始性上优化拨打.valueOf(),因为String.prototype.valueOf仍然与其默认值相同(引擎可以很容易地意识到这一点(,因为结果与原始值相同。我不知道他们是否做,但是他们可以。


您对这个问题的评论:

 if((typeof name !="undefined") && (typeof name.valueOf()=="string") && (name.length>0))

在这个i deleted valueOf()中,结果是一样的,我对此很齐心协力。

啊!这是另一回事,原因有两个:

  1. name可能不是字符串。很多东西都有length属性  mdash;字符串,功能,基本数组,键入数组,DOM集合,任何数量的脚本定义对象...

  2. name可以是String 对象(尽管不太可能,除非人们通常不使用String对象,除非为String.prototype编写扩展方法,在这种情况下,this是指String对象(。

因此,删除typeof name.valueOf()=="string"零件会改变条件。RE .valueOf()部分:该代码的作者有点偏执,或者有理由期望name可以是String对象(因此其类型为"object",而不是"string"(。使用valueOf确保他/她正在检查原始。

令人惊讶的是,它们不够偏执(至少没有上下文(,因为null会在该代码中引起例外。

每个条件周围的()也完全不需要。

处理null也是如此:

if (name != null && typeof name.valueOf() == "string" && name.length > 0)

"string".valueOf()返回值与javascript中的 "string"之间没有实际差异,因为 String.prototype.valueOf()方法返回字符串 - 主要对象本身(as as as as and String.prototype.toString()dive(。

typeof "string" === typeof "string".valueOf() //true

使用(String).valueOf()(String)之间的唯一性能差异(由于conc徒而引起的(是,调用简单的(String)更快(当然,说(String)-是String class的原型不建立的对象实例(。

最新更新