Почему массив имен называется & ldquo; name & rdquo; make .length метод print неправильное значение В JavaScript? [Дубликат]

Проблема с ImageIO.read заключается в том, что она очень медленная. Все, что вам нужно сделать, это прочитать заголовок изображения, чтобы получить размер. ImageIO.getImageReader является идеальным кандидатом.

Вот пример Groovy, но то же самое относится и к Java

def stream = ImageIO.createImageInputStream(new ByteArrayInputStream(inputStream))
def reader = ImageIO.getImageReader(getReaderByFormat(format))
reader.setInput(stream, true)

println "width:reader.getWidth(0) -> height: reader.getHeight(0)"

. Производительность была такой же, как с использованием java-библиотеки SimpleImageInfo.

https://github.com/cbeust/personal/blob/master/src/main/java/com/beust/SimpleImageInfo.java

16
задан Bergi 2 December 2015 в 15:57
поделиться

3 ответа

window.name имеет специальную цель и предполагается, что это строка. Кажется, что Chrome явно передал его в строку, поэтому var name = {}; фактически заканчивает тем, что дает глобальную переменную name (т.е. window.name) значение "[object Object]". Поскольку это примитив, свойства (name.FirstName) не будут «прилипать».

Чтобы обойти эту проблему, не используйте name в качестве глобальной переменной.

18
ответ дан Bergi 19 August 2018 в 02:24
поделиться
  • 1
    Хороший улов ... Я вообще не обращал внимания на имя переменной. – Felix Kling 9 May 2012 в 22:12
  • 2
    @FelixKling Я почти рассматриваю name как зарезервированное слово, так как некоторые хосты предоставляют функции свойство name также (я был укушен этим раньше), закрытие не будет его уменьшать и т. Д. – Dagg Nabbit 9 May 2012 в 22:24
  • 3
    Да, с этой проблемой было несколько вопросов, насколько я помню ... – Felix Kling 9 May 2012 в 22:34

Ваша name переменная на самом деле window.name, поскольку переменные верхнего уровня, объявленные с помощью var, привязаны к глобальному объекту.

Спецификация HTML5 требует, чтобы window.name a DOMString . Это означает, что значение window.name может быть только последовательностью символов , а не объектом.

В Chrome попытка использовать window.name для хранения чего-либо, кроме примитивная строка будет принуждать значение к примитивной строке. Например:

window.name = {};
window.name === "[object Object]"; // true

Вы можете избежать этой проблемы, используя переменную name, которая не находится в области верхнего уровня:

(function() {
    var name = {};
    // this `name` is not `window.name`
    // because we're not in the top-level scope

    console.log(name);
})();
6
ответ дан Ry- 19 August 2018 в 02:24
поделиться

window.name используется для установки имени окна, а так как имя окна может быть только строкой, все, что вы установите на window.name, преобразуется в строку. И строки, как примитивные значения, не могут иметь свойств. Решение состоит в том, чтобы использовать другое имя переменной или другую область.

В качестве альтернативы вы можете использовать window.name, как вам нравится, если у вас есть этот код в первую очередь. Я не рекомендую это вообще, но, как доказательство концепции:

(function () {
    var _name;
    window.__defineGetter__('name', function () {
        return _name;
    });
    window.__defineSetter__('name', function (v) {
        _name = v;
    });
})();

Кроме того, вместо new Object вы должны использовать {}. Кроме того, что он более краток, он также более эффективен и более ясен.

0
ответ дан st-boost 19 August 2018 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: