2016-07-05 2 views
0

Предположим, я следующий обработчик события:Почему эти неопределенные переменные не равны javascript?

function handleCsvDump(e) { 
    console.log(e.currentTarget.getAttribute('download')); 
    e.currentTarget.download = undefined; 
    console.log(e.currentTarget.getAttribute('download')); 
    console.log(e.currentTarget.getAttribute('download') === undefined); 

информация записывается в консоль, когда соответствующая кнопка нажата является:

mycsv.csv 
undefined 
false 

Почему последнее значение false? Так как e.currentTarget.getAttribute('download') - undefined, не правда ли? Если это неправильный способ сделать это, как я могу проверить, не указана ли переменная?

+0

Посмотрите на [документации GetAttribute()] (HTTPS://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute): * getAttribute() возвращает значение указанного атрибута элемента. Если данный атрибут не существует, возвращаемое значение будет либо нулевым, либо «" (пустая строка); * –

+2

Вы уверены, что когда вы выполнили 'download = undefined', он не принуждал его к строке, и фактически установите значение '' undefined ''. Ваш журнал консоли похож на «mycsv.csv», «undefined», false' или «mycsv.csv», undefined, false'? –

+0

Джеймс, консольный журнал был похож на 'mycsv.csv'. 'undefined',' false'. Не было кавычек. –

ответ

1

Вы должны быть осторожны при настройке вещей таким образом, часто предполагается, что это строки, и если вы установите значение, которое не является строкой, оно сначала будет принудительно привязано к строке, а затем назначено.

download attribute действительно DOMString, что означает, что все, что вы присваиваете ему сначала будет приведен к строке, если это не уже, так что, когда вы назначаете undefined, это на самом деле первый принуждают "undefined" и хранится.

Когда вы получите его обратно, и сравнить его с undefined, вы на самом деле делает:

console.log("undefined" === undefined) 

Поэтому получение false. Если вы на самом деле хотите, чтобы удалить его, что подразумевается желание установить его undefined (или null), вы можете использовать вместо removeAttribute:

e.currentTarget.removeAttribute('download') 
Смежные вопросы