- 我都记录了两者,他们返回了相同的结果,但是必须有一个轻微的区别。
不,没有区别,除非有人对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()
中,结果是一样的,我对此很齐心协力。
啊!这是另一回事,原因有两个:
-
name
可能不是字符串。很多东西都有length
属性  mdash;字符串,功能,基本数组,键入数组,DOM集合,任何数量的脚本定义对象... -
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的原型不建立的对象实例(。