2015-07-12 4 views
4

Если я:Javascript строгое равенство странности

!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

+0

Я выбежал из кофе пару часов назад, но я все еще хочу написать этот код сегодня вечером. Опасная комбинация ... – barron

ответ

6

В случае, если это не === ' 2 '?

Нет, на самом деле. В этом случае фактически является экземпляром String, который отличается от примитива строки '2'. this по существу равен new String('2'), и каждый экземпляр такого объекта уникален.

Вы можете использовать его в примитиве строк.

String.prototype.isDigit = function() { 
    var that = '' + this; 
    return !isNaN(that) && parseInt(that).toString() === that ? true : false; 
} 

'2'.isDigit(); 
+0

или 'return! IsNaN (this) && parseInt (this) .toString() === this.toString()? true: false; ' –

1

В вашем методе .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

Try открытие консоли и делать:

String.prototype.this = function() { return this; }; 
"2".this(); 

Вы увидите "это" объект.