2016-04-14 6 views
3

Учится о typeof ключевом слове и нуждается в уточнении:Поведения TYPEOF ключевого слово

В то время как поиск и устранение неисправностей Я выводимое этот код к консоли:

console.log(typeof object.prop[someNum - 1]); 

(в данном случае sumNum === 0)

консоль распечатала undefined, что и ожидалось, потому что индексная позиция [someNum - 1] в массиве prop[] не существует (так я думал). Однако, когда я делаю что-то вроде этого:

if(typeof object.prop[someNum - 1]) 
    //some code 
else 
    //other code 

Он оценивает, как верно и работает //some code, но когда я делаю это:

if(object.prop[someNum - 1]) 
    //some code 
else 
    //other code 

Он оценивает как ложь и работает //other code.

У меня создалось впечатление, что undefined считается falsy value и оценил бы false в if statement. Почему утверждение if(typeof object.prop[someNum - 1]) оценивается как истинное? Также может кто-то указать мне в правильном направлении, где я могу узнать больше об отрицательных индексационных массивах в js? Они обрабатываются одинаково на нескольких языках, таких как c#, c++, java, & php. Я подумал, что при оценке отрицательного array индексного номера будет underfined или выбросить ошибку.

+6

'undefined' - это не то же самое, что' 'undefined ''. – SLaks

+0

Поскольку вы изучаете ключевое слово 'typeof', здесь [MDN docs] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof) на нем (только в дело). –

+0

Если вы проверяете наличие свойства, вам действительно не нужно 'typeof'. Вы можете сделать '(someNum-1) в object.prop' или если вы беспокоитесь о наследуемых свойствах,' object.prop.hasOwnProperty (someNum-1) '. Использование 'typeof' не будет различать свойство, имеющееся с параметром' undefined', и свойство, не существующее. –

ответ

5

typeof всегда возвращает строку.

Таким образом, вы пишете if ("undefined").

Поскольку непустые строки являются правдивыми, это будет работать.

1

Как говорит Слакс, вы оцениваете, является ли строка «неопределенной» правдой, какой она есть.

Если вы хотите увидеть, если объект имеет свойство, называемое «someNum - 1», то вы можете использовать в оператора:

if ((someNum - 1) in object.prop) 

, которая возвращает истину, если object.prop имеет такие свойство в любом месте на себя или его [[Prototype]] цепи, или:

if (object.prop.hasOwnProperty(someNum - 1)) 

для проверки свойства непосредственно на объекте.

+0

, имеет массив объектов, поэтому '(someNum - 1) был индексом массива. с этим сказано, что такое '.prop' в' object.prop', ссылаясь на? – webDev

+0

Используется оператор [* in *] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in), чтобы проверить, существует ли свойство. Скобки вокруг '(sumNum-1)' mean 'сначала оценивают это выражение, а затем используют результат во внешнем выражении ". ;-) – RobG

+0

gotcha. Большое спасибо. вы были большой помощью – webDev

1

Как указывалось в других ответах, typeof возвращает строку, и она всегда будет правдой, потому что она никогда не возвращает пустую строку. Если вы хотите проверить, есть ли тип undefined, вам нужно сравнить строку.

if (typeof object.prop[someNum - 1] == "undefined") { 
    // some code 
} else { 
    // some code 
} 

Вы также можете просто проверить, является ли значение undefined:

if (object.prop[someNum - 1] === undefined) { 
    // some code 
} else { 
    // some code 
} 

Убедитесь, что вы используете ===, а не ==, поэтому он не сообщит матч, если object[someNum - 1] является null.

Смежные вопросы