Pull to refresh
11
0

Пользователь

Send message

Пример в статье был приведен для случая с IE.
С другой стороны, в него закралась ошибка: пример справедлив для всех случаев, когда объект создается через Object.create().
Исправил.


Спасибо за развернутые замечания.

В то время как обычное равенство при наличии null в сравнении всегда возвращает false.

Согласен, это был странный пассаж, ведь речь шла о числах. Спасибо, исправил.


Относительно проверки собственный свойств.
По идее, метод getOwnPropertyNames должен быть действительно быстрее: он не обходит свойства прототипов.
К тому же, метод доступен IE9+


Но если продолжать тему "пальбы по ногами", следует упомянуть, что свойства объектов могут обладать разными параметрами дескрипторов.
Так, например, некоторые свойства могут быть неитерируемыми enumerable = false.


var obj = Object.create(
    {}, 
    {
        "enum-0": { 
            value: "1",
            enumerable: true
        },
        "not-enum-1": { value: "0" },
        "not-enum-2": {
            value: "1",
            enumerable: false
        }
    }
);

Object.keys(obj); // => ["enum-0"]
Object.getOwnPropertyNames(obj); // => ["enum-0", "enum-1", "enum-2"]
Object.getOwnPropertyNames([1, 2, 3]); // => ["0", "1", "2", "length"]

Как можно заметить, метод Object.getOwnPropertyNames() выводит все ключи без разбора. Вероятно, целесообразней использовать Object.keys(), но это зависит от требований к программе.


Ко всему прочему, мне показалось, что из обсуждения выпал случай, когда мы проверяем собственное свойство объекта вне циклов — выборочно.


Относительно строгости сравнения, не готов сейчас ступать на "тонкий лед": на вскидку, мне тяжело сейчас вспомнить случай, когда последний раз нестрогое сравнение ломало программу.
Но случай когда вовремя неприведенные к нужному типу данные — вчера.


// образный пример
var uid = this.getAttribute("data-uid");
stash[uid + 1] = true; // вместо 1 я получил "01"
// можно легко забыть сделать stash[+uid + 1]

Спасибо за развернутый комментарий.

new iframe.contentWindow.Array() instanceof Array // => false
Array.isArray(new iframe.contentWindow.Array()) // => true
Object.prototype.toString.call(new iframe.contentWindow.Array()) // => "[object Array]"

Экземпляры массива созданные внутри фреймов и других окон будут иметь разные экземпляры конструкторов


Кстати говоря, MDN предлагает в качестве полифила toString решение

Наследование может быть, но не от Object.


var fake = Object.create(null);

fake.key_a = "value_a";

fake.hasOwnProperty = function() {
    return true;
}

var obj = Object.create(fake);

Object.prototype.isPrototypeOf(obj); // => false
obj.hasOwnProperty("key_a"); // => true
Object.prototype.hasOwnProperty.call(obj, "key_a"); // => false
"key_a" in obj; // => true
Object.keys(obj); // => []

Поправьте, если ошибся.

Information

Rating
Does not participate
Registered
Activity