原始字符串值和String
对象之间存在差异。
'foo' // primitive
new String('foo') // object
当您在字符串原语上调用 String 成员函数时,它会被包装在一个 String 对象中,该对象成为this
函数内的值。(下面有更多关于这种行为的信息。)
因此,inremoveExtension
是this
一个String
对象。另一方面,内置函数this.substr
返回一个原语;这就是它的定义。因此,当您返回this
( String
object ) 与this.substr
(string original ) 的结果时,您会看到不同的东西。如果要返回this
对象的字符串原始版本,只需使用this.toString
.
您会看到与任何原语相同的包装行为,例如Number
s:
Number.prototype.returnThis = function() { return this; }
typeof 2; // 'number'
typeof (2).returnThis() // 'object' (a Number object, specifically)
如果你真的想知道为什么会发生这种情况,它在 ECMAScript 规范中:
10.4.3 输入功能码
当控制进入函数对象 F 中包含的函数代码的执行上下文、调用者提供 thisArg 和调用者提供 argumentsList 时,将执行以下步骤:
- 如果功能码是严格码,设置
ThisBinding
为thisArg
.
- 否则,如果 thisArg 为 null 或未定义,则将 设置
ThisBinding
为全局对象。
- 否则,如果
Type(thisArg)
不是 Object,则将 设置ThisBinding
为ToObject(thisArg)
。
- ……
第 3 点很重要:在原始值(即非对象)上调用函数将它们强制转换为相应的对象形式。