Javascript严格平等陌生

时间:2015-07-12 04:24:19

标签: javascript prototype prototype-programming

如果我这样做:

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' 吗?

3 个答案:

答案 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();

你会看到"这个"是一个对象。