• Как сформировать условие с логическим оператором?

    @sgrogov
    const check = value => Object.hasOwnProperty.call(value, 'one') && value.one !== false;
    
    check({}); // false, one нет в объекте - всё верно
    check({ one: undefined }); // true, one есть в объекте и он не равен false - всё верно
    check({ one: true }); // true, one есть в объекте и он не равен false - всё верно
    check({ one: false }); // false, one есть в объекте, но он равен false - всё верно


    Всё ж работает, что не так?
  • Как сформировать условие с логическим оператором?

    @sgrogov
    Давайте по-порядку.

    Почему hasOwnProperty

    Первая часть задачи звучит как "Если есть в объекте one". То есть все следующие варианты подходят под это условие:
    [
    	{ one: true },
    	{ one: 1 },
    	{ one: 0 },
    	{ one: 'foo' },
    	{ one: '' },
    	{ one: [] },
    	{ one: {} },
    	{ one: NaN },
    	{ one: null },
    	{ one: undefined },
    ]

    но не подходит вариант, где в объекте нет ключа one, например
    { two: true }

    Если проверять как предлагаете вы через if (obj.one) {}, то результаты будут следующими:
    [
    	{ one: true }, 		// true
    	{ one: 1 }, 		// true
    	{ one: 0 },			// false
    	{ one: 'foo' },		// true
    	{ one: '' },		// false
    	{ one: [] },		// true
    	{ one: {} },		// true
    	{ one: NaN },		// false
    	{ one: null },		// false
    	{ one: undefined },	// false
    	{ two: true },		// false
    ]


    То есть if (obj.one) {} для того, чтобы проверить "Если есть в объекте one" не подходит.

    Поэтому для проверки наличия ключа в объекте используется именно Object.hasOwnProperty. Можно конечно использовать его так
    var obj = {
    	one: true,
    	...objData,
    };
    if (obj.hasOwnProperty('one')) {}


    но тогда всё сломается для объектов вроде
    {
    	one: true,
    	hasOwnProperty: 'foo',
    }


    Поэтому достаточно оптимальным и надёжным способом является именно Object.hasOwnProperty.call(object, property).

    Если парень не знает азов, а я ему пихаю hasOwnProperty.call/lodash

    Да не, не пихаю если честно :)
    Во-первых hasOwnProperty и call и есть те самые "азы", с которыми необходимо разобраться прежде чем использовать сравнения с приведением типа (if (obj.one) {} именно такой и является).
    Во-вторых lodash я предложил потому, что конструкция Object.hasOwnProperty.call действительно выглядит пугающе. Да и в реальных проектах очень часто используются всякие lodash, underscore и прочие.

    Условие должно быть не с И, а с ИЛИ

    В таком случае достаточно одной проверки if (obj.one) {}. Потому что любое значение obj удовлетворяющее условию if (obj.one) {} не удовлетворяет условию if (obj.one !== false) {}.

    Резюмируя

    1. if (obj.one) {} может подойти в ограниченном количестве случаев, но нужно быть предельно осторожным при использовании таких проверок. Как только вы присвоите obj.one любое falsy значение (0, '', NaN, null, undefined) проверка сработает не так, как задумывалось.

    2. Постарайтесь избегать хранения разных типов данных в одних и тех же переменных/свойствах объекта. Это также позволит сделать код более предсказуемым, а проверки простыми. Да JavaScript это позволяет, но появление таких инструментов как TypeScript и Flow ясно говорит о том, что в больших проектах с большими командами динамическая типизация приносит больше проблем, чем пользы.

    3. Разберитесь в основах языка. В частности, как именно работает неточное сравнение и к каким проблемам может может приводить неосторожное использование.
  • Как сформировать условие с логическим оператором?

    @sgrogov
    Ага, изи :) правда одним тут не обойтись
    if ((obj.one || obj.one === null || obj.one === undefined || obj.one === 0 || obj.one === NaN || obj.one === "") && obj.one !== false) {
      console.log('test');
    }
  • Как сформировать условие с логическим оператором?

    @sgrogov
    В случае
    var obj = {
      one: undefined, // или 0, или null и т.д.
    };

    условие сработает не так, как хотелось бы
  • Почему git shell работает с перебоями?

    @sgrogov Автор вопроса
    К сожалению недостаточно одного лишь расширения, мне нужно работать с репозиторием, а через браузер это невозможно.
  • Почему git shell работает с перебоями?

    @sgrogov Автор вопроса
    Да, винда. К сожалению с консолью я на вы и понятия не имею о mingw. Файла с конфигами у меня не было, недостаточно просто вручную в блокноте его создать?
  • Почему git shell работает с перебоями?

    @sgrogov Автор вопроса
    Поставил тор, в нём всё норм работает. Пишу в git shell " git config --global https.proxy socks5://localhost:9050", но всё остаётся по прежнему
  • Почему htaccess не обрабатывает css-файлы?

    @sgrogov Автор вопроса
    Так и есть, спасибо. К счастью в моём случае можно обойтись без перенастройки nginx.
  • Почему htaccess не обрабатывает css-файлы?

    @sgrogov Автор вопроса
    Нет, с файлов .php все в порядке, т.к. по урлам /site/?url=index.html и /site/?url=styles.css всё работает, как нужно. Не происходит именно редирект со /sites/styles.css на /site/?url=styles.css