В чем преимущество angular.dedeined?

В чем преимущество angular.isdefined сверх foo === undefined?

Я не могу сразу думать о выгоде.

Ответ 1

Доступ к действительно переменной undefined любым способом в Javascript, за исключением typeof, выдает ошибку. Вы можете использовать только Angular.isDefined со свойствами. Например, это будет нормально работать:

angular.isDefined(window.obj);

Потому что obj - это свойство undefined окна.

Примеры ожидаемого поведения:

var foo;
var bar = 42;

typeof foo !== 'undefined'; // false
typeof bar !== 'undefined'; // true
typeof baz !== 'undefined'; // false

angular.isDefined(foo); // false
angular.isDefined(bar); // true
angular.isDefined(baz); // ReferenceError

Ответ 2

Вот источник:

function isDefined(value) {return typeof value !== 'undefined';}

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

Ответ 3

Как сказал Камрул, угловатое:

function isDefined(value) { return typeof value !== 'undefined'; }

Это означает, что "тип этого var undefined"... в вашем примере вы сравниваете содержимое переменной равно неопределенному и угловому проверяет тип переменной.

В js типы являются динамическими, поэтому до тех пор, пока вы не присвоите значение переменной, у которой нет типа... поэтому isDefined сообщит вам обоим, если существует объявление переменной, и если эта переменная имеет какой-либо контент.

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

Вы можете попробовать этот код:

var a;
var b = 'asd';
var c = null;

console.log('a: ' + typeof a);
console.log('b: ' + typeof b);
console.log('c: ' + typeof c);
console.log('d: ' + typeof d);

И вы увидите следующее в консоли:

a: undefined
b: string 
c: object 
d: undefined

Так,

a) var существует, но не имеет значения, поэтому не определено

b) var существует и имеет значение.. это значение является строкой, поэтому это ее тип

c) var существует, но имеет значение null, тип не может быть помечен, поэтому его тип является объектом

d) var не был объявлен так... он не определен

Главное - различие между "a" и "d"... поэтому попробуйте следующее:

console.log('a is undefined? ' + a === undefined);
console.log('d is undefined? ' + d === undefined);

В консоли вы увидите следующее:

false
Uncaught ReferenceError: d is not defined

Что... является большой проблемой, потому что:

а) говорит вам, что это не является неопределенным, если это неверно

d) поднять исключение, так что... код не сработает

Заключение

Использование определяется, когда вы хотите проверить, существует ли переменная и была ли она инициализирована значением, но будьте осторожны с нулевыми значениями, потому что null - это объект (так это определенный var).

Если вы хотите проверить, существует ли переменная и имеет какое-либо действительное значение (это не так), вы можете просто сделать что-то вроде:

if (myvar) {
  console.log('myvar is defined and is not null');
} else {
    console.log('myvar is undefined or null');
}

Другим хорошим трюком является инициализация до некоторого значения, если var не определен с помощью ||

myvar = myvar || 'some init value';

Вышеприведенный код принимает значение myvar, если определено, а не null, и если не инициализировать его некоторым значением.

Поскольку @TonyBrasunas надел свой комментарий, если myvar оценивается как false, будет назначено "некоторое значение инициализации". Учитывайте это, прежде чем использовать этот трюк.

Это хорошо в функциях, например:

function split(input, charToSplit) {
  charToSplit = charToSplit || ' ';
  return input.split(charToSplit);
}

Затем по умолчанию вы можете разделять пробелы: var input = 'asd asd'; var split = split (вход); / / -> splited = ['asd', 'asd']

Или... с другим символом:

var input = 'asd|asd';
var splited = split(input, '|');
// --> splited= ['asd', 'asd']

Ответ 4

Я могу только догадываться, но я думаю, что моя догадка довольно хорошая.

Эти два выражения функционально эквивалентны:

typeof foo !== 'undefined'

angular.isDefined(foo)

Преимущества последних включают:

1) Вероятно, это меньше умственного напряжения, чтобы спросить, определено ли что-то, чем спросить, не что-то не undefined.

2) angular.isDefined(foo), возможно, намного менее "шумно", чем typeof foo !== 'undefined', и поэтому он быстрее понимает, что происходит.

Примечание. Это не мои аргументы в пользу превосходства angular.isDefined. То, что я пытаюсь передать, - это мое предположение о том, почему команда Angular хотела создать angular.isDefined и почему они думали, что это лучше, чем простая альтернатива JavaScript.