这里发生了什么?就在我认为我内外都知道JS的时候,这个宝石出现了。
String.prototype.doNothing = function() {
return this;
};
alert(typeof 'foo'.doNothing()) // object
alert(typeof 'foo') // string
这打破了一些期望字符串的东西,例如jQuery的.text(str)
方法。
答案 0 :(得分:33)
要确保您总是收到字符串,请尝试使用此代码:
String.prototype.doNothing = function() {
return this.toString();
};
alert(typeof 'foo'.doNothing())
alert(typeof 'foo')
在原始代码中,this
作为字符串对象而不是实际字符串返回。
答案 1 :(得分:23)
this
关键字的Here's a thorough overview。基本上,JavaScript将其转换为对象(如果不是一个对象)。
执行以下步骤时 控制进入执行上下文 用于包含的功能代码 函数对象F,提供的调用者 thisValue和调用者提供 argumentsList:
- 如果功能代码是严格代码,请将ThisBinding设置为 thisValue。
- 否则,如果thisValue为null或未定义,则将ThisBinding设置为 全球对象。
- 否则如果Type(thisValue)不是Object,则将ThisBinding设置为 ToObject(thisValue)。强>
- 否则将ThisBinding设置为thisValue
醇>
同样的事情发生在Numbers和Booleans身上。类似的DoNothing
函数将返回一种对象。
答案 2 :(得分:5)
以strict
模式运行代码以获得预期结果!
答案 3 :(得分:1)
我相信这又是字符串文字和字符串之间的区别吗?我曾经在SO:Property value of a String object in JavaScript
中回答了一个问题答案 4 :(得分:1)
你也可以使用constructor
属性:
'foo'.constructor === String; //=>true
'foo'.doNothing().constructor === String; //=>true
另请参阅this SO question和此jsFiddle
如果String.prototype.doNothing()
打破期望字符串值的内容,我会使用return String(this)
或this.toString()
(this.valueOf()
也可以在这里工作)。
答案 5 :(得分:0)
为了更好地了解正在使用的控制台日志,请尝试使用控制台日志:
String.prototype.doNothing = function() {
console.log(this);
return this;
};
console.log(typeof 'foo'.doNothing());
console.log(typeof 'foo');
这些是我在Firefox中得到的结果:
foo { 0="f", 1="o", more...}
object
string
因此,在原型中,字符串表示为对象/字符数组(确实有意义。)
在我看来,你是否应该使用toString(由McHerbie建议)或者作为类型String(由mellamokb建议)进行转换,取决于你打算如何处理这个值。我个人倾向于把它作为一个字符串。
答案 6 :(得分:0)
尝试以下方法:
return this + '';
答案 7 :(得分:0)
function print() {
let str = this;
console.log(str);
}
String.prototype.print = print;
let a = "hello";
a.print();//output:"hello"
答案 8 :(得分:-1)
尝试使用return String(this);
代替return this;