Javascript严格相等性的奇怪行为

4
如果我执行以下操作:
!isNaN('2') && parseInt('2').toString() === '2'    // returns 'true'

我有下面这个JavaScript函数:

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'

这里有什么差异?this === '2' 不应该成立吗?

3
这里的问题不是? true : false是否多余,而是什么。 - nnnnnn
几个小时前我已经喝完了咖啡,但我仍然想今晚写这段代码。这是一个危险的组合... - JustAskin
3个回答

7

这个应该不等于 '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();

返回已翻译文本:return !isNaN(this) && parseInt(this).toString() === this.toString() ? true : false; - Jaromanda X

2

在你的.isDigit()方法中,this是一个字符串对象(不是字符串原始类型),并且使用===进行对象比较只有当两个操作数完全相同才为真,而不仅仅是具有相同值或者一个是对象另一个是原始类型。

因此,在你的方法中:

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();
}

1
尝试打开控制台并执行以下操作:
String.prototype.this = function() { return this; };
"2".this();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接