Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   почему пишу так? (https://javascript.ru/forum/offtopic/46926-pochemu-pishu-tak.html)

cyber 30.04.2014 00:07

почему пишут так?
 
часть копаясь в чужом коде вижу
typeof variable == "undefined"

почему не так ?
variable === undefined

просто разный стиль кода, или я чего то не понимаю?

П.с просто вижу такую проверку наверное в 90% случаев...

Aetae 30.04.2014 00:22

alert(variable === undefined)

alert(typeof variable == "undefined")

Дзен-трансгуманист 30.04.2014 09:11

Цитата:

Сообщение от Aetae
alert(variable === undefined)

На локальных лучше сразу выловить исключение и обнаружить свои косяки, чем в случае с typeof рисковать насрать в глобал.
А глобальные, если они не прописаны в коде явно, никто так в здравом уме не проверяет.

Остальное - вопросы стиля и предпочтений, имхо.

kobezzza 30.04.2014 09:28

Цитата:

На локальных лучше сразу выловить исключение и обнаружить свои косяки, чем в случае с typeof рисковать насрать в глобал.
Юзай 'use strict' - там попытка создать переменную без указания ключевого слова приведёт к ошибке :)

Цитата:

А глобальные, если они не прописаны в коде явно, никто так в здравом уме не проверяет.
Я проверяю иногда :) Бывают случаи, когда нужно понять в каком окружении запущен скрипт: браузер, поток браузера, нода, аддон к фотошопу и т.д.

Цитата:

Остальное - вопросы стиля и предпочтений, имхо.
Согласен, я вообще делаю так:

isUndef(value)

Gozar 30.04.2014 09:36

https://developer.mozilla.org/en-US/...ects/undefined

Octane 30.04.2014 10:27

Цитата:

Сообщение от Gozar
https://developer.mozilla.org/en-US/...ects/undefined

Кстати интересный момент про пример оттуда:
Цитата:

Сообщение от MDN
var x;
if (x === undefined) {
   // these statements execute
}
else {
   // these statements do not execute
}

Если вдруг кто не знает: var x; не изменит значение x на undefined, если переменная x ранее определена.

Делая так в глобале, можно выстрелить себе в ногу, если не различать глобальные переменные и свойства/методы инстанса Window.
var FormData;
if (!FormData) {
    //все нормально, реализуем свой FormData
}

var postMessage;
if (!postMessage) {
    //в Chrome и IE мы только что убили глобальную ссылку на postMessage,
    //причем даже window.postMessage работать не будет
}

Дзен-трансгуманист 30.04.2014 10:39

Цитата:

Сообщение от kobezzza
Юзай 'use strict'

Это хорошая практика, но не все ее соблюдают. Даже я не всегда.)
Да вообще, бывает, вытаскиваешь из скрипта со стирктом сниппет и вставляешь туда, где стрикт не включен, или наоборот. Поэтому хочется ожидать, что поведение будет strict-независимым.

Цитата:

Сообщение от kobezzza
Я проверяю иногда Бывают случаи, когда нужно понять в каком окружении запущен скрипт

Не понял, ты пишешь window === undefined, что ли? Не верю. :)

Цитата:

Сообщение от kobezzza
isUndef(value)

А я так проверяю:
value === void 0
Потому что, на мой взгляд, это промах в дизайне языка, что у undefined нет своего литерала. Поэтому лично я undefined стараюсь избегать везде, где только можно.

kobezzza 30.04.2014 10:47

Цитата:

Не понял, ты пишешь window === undefined, что ли? Не верю.
Не:)

Могу написать:

typeof window === 'undefined'
typeof importScripts === 'undefined'


И т.д., но такое приходится делать редко :)

ЗЫ:

Цитата:

alert(variable === undefined)
Цитата:

А глобальные, если они не прописаны в коде явно, никто так в здравом уме не проверяет.
Перечитав понял, что изначально тебя не понял :D

Дзен-трансгуманист 30.04.2014 11:09

kobezzza,
Напиши, плиз, все проверки окружения, которые ты используешь. Ну, то есть, поделись опытом. :)

kobezzza 30.04.2014 11:26

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 309875)
kobezzza,
Напиши, плиз, все проверки окружения, которые ты используешь.

Ну собственно самые главные я уже написал:) Можно также проверить работоспособность eval, т.к. некоторые окружения (например аддон к браузеру) могут блокировать это.

var evalSupport = false;

try {
    evalSupport = eval('true');

} catch (ignore) {}


При написании плагинов к разному софту проверки уже очень специфичны.

Дзен-трансгуманист 30.04.2014 11:43

kobezzza,
Ну в частности меня интересует окно браузера/воркер/нода
function foo ( func ) {
  ???
}

foo( function ( global, envType ) {
  // global -> global object
  // envType -> 'window' / 'worker' / 'node'
});

Как сделать это максимально корректно?

kobezzza 30.04.2014 11:57

Ну, обычно хватает:

(function (global) {
})(this);


В окне и потоке this - это будет ссылка на глобальный объект.

В окружении ноды this - это ссылка на exports, а доступ к глобальному объекту доступен через ссылку global, но при написании модулей как правило нужен именно exports.

В node-webkit насколько мне известно вcё также, как и в окне браузера.

Варианты для логического определения:
var isWorker = typeof window === 'undefined' && typeof importScripts !== 'undefined';
var isNode = typeof window === 'undefined' && typeof global !== 'undefined';


Это не 100% гарантия, ибо в той же ноде можно сделать:

global.window = {};


И всё сломается, но тот, кто так делает - сам виноват :)

Octane 30.04.2014 13:12

Цитата:

Сообщение от kobezzza
В node-webkit насколько мне известно вcё также, как и в окне браузера.

В node-webkit зависит от способа подключения скрипта: с помощью <script> или как модуль Nodejs

<script>
typeof require → "function"

typeof setImmediate → "undefined"

typeof global.setImmediate → "function"

typeof postMessage → "function"


Модуль
typeof require → "function"

typeof setImmediate → "function"

typeof global.setImmediate → "function"

typeof postMessage → "undefined"

Дзен-трансгуманист 30.04.2014 13:23

Цитата:

Сообщение от kobezzza
var isWorker = typeof window === 'undefined' && typeof importScripts !== 'undefined';
var isNode = typeof window === 'undefined' && typeof global !== 'undefined';

Ок, спасибо за вариант.
Насчет глобального объекта нашел такое
Function('return this')()
А потом подумал: как я сам до этого не допер? :)

Цитата:

Сообщение от kobezzza
тот, кто так делает - сам виноват

Ну, не каждый, кто так или иначе сталкивается с JS, обязательно профи. Например, фотошопщик вряд ли будет досконально учить язык, если ему нужно всего-то слои выровнять. :)

kobezzza 30.04.2014 13:41

Цитата:

Function('return this')()
хакерство это :)

monolithed 30.04.2014 17:25

Цитата:

Сообщение от kobezzza
хакерство это

В чем?

kobezzza 30.04.2014 17:40

Цитата:

Сообщение от monolithed (Сообщение 309926)
В чем?

Во всём:)

Maxmaxmaximus100 30.04.2014 18:09

проверка на существование

if(value == null){
  
}



нубы.......

А реверенс исключения не надо избегать тайпофом, это плохой стиль.


Часовой пояс GMT +3, время: 14:23.