如果我这样做:
console.log( p.x, p.y ); // prints 5, 7
p.x = 11;
console.log( p.x, p.y ); // prints 11, 7
我有以下JavaScript函数:
!isNaN('2') && parseInt('2').toString() === '2' // returns 'true'
然而:
String.prototype.isDigit = function() {
return !isNaN(this) && parseInt(this).toString() === this ? true : false;
}
此外,
'2'.isDigit() // returns 'false'
这里的差异是什么?不应该String.prototype.isDigit = function() {
return this === '2' ? true : false;
}
'2'.isDigit() // returns 'false'
吗?
答案 0 :(得分:6)
这不应该==='2'?
不,实际上。在这种情况下,this
实际上是String
的实例,它与字符串原语'2'
不同。 this
基本上等于new String('2')
,并且此类对象的每个实例都是唯一的。
您可以将其转换为字符串原语。
String.prototype.isDigit = function() {
var that = '' + this;
return !isNaN(that) && parseInt(that).toString() === that ? true : false;
}
'2'.isDigit();
答案 1 :(得分:1)
在.isDigit()
方法中,this
是一个String对象(不是字符串原语),只有两个操作数是完全相同的对象时,===
只有一个对象才是真的只有两个具有相同值或不相同的对象,一个对象和另一个基元。
所以,在你的方法中:
String.prototype.isDigit = function() {
console.log(typeof parseInt(this).toString()); // "string"
console.log(typeof this); // "object"
return !isNaN(this) && parseInt(this).toString() === this ? true : false;
}
并且,对于两个不同类型的操作数,===
永远不会成立。
您可以继续使用您的方法,但使用.valueOf()
来获取原语,因为将两个字符串基元与===
进行比较只是比较它们的值:
String.prototype.isDigit = function() {
return !isNaN(this) && parseInt(this).toString() === this.valueOf();
}
答案 2 :(得分:1)
尝试打开控制台并执行:
String.prototype.this = function() { return this; };
"2".this();
你会看到"这个"是一个对象。