Я новичок в JavaScript, и я обнаружил, что в моем коде есть ошибка, когда я набираю length как lenght. Однако уведомления об этой ошибке или синтаксической ошибке не поступают. На отладку у меня ушло много времени. Интересно, как такое могло случиться? Если lenght приемлем для JavaScript?

var totalFruit = function(tree) {
    
    let windowStart = 0;
    let dict = {};
    maxLength = 0;
    for (let windowEnd = 0; windowEnd < tree.length; windowEnd++) { 
        currentFruit = tree[windowEnd];
        if (!(currentFruit in dict)) {
            dict[currentFruit] = 0;
        }
        dict[currentFruit] += 1; 
        while (Object.keys(dict).lenght > 2) {
            leftFruit = tree[windowStart];
            dict[leftFruit] -= 1;
            if (dict[leftFruit] == 0) {
                delete dict[leftFruit]
            windowStart += 1;
            }
        }
        maxLength = Math.max(maxLength, windowEnd - windowStart + 1);     
    }
    return maxLength;
};
0
Jaden 14 Сен 2020 в 17:42

2 ответа

Лучший ответ

Совершенно законно получить доступ к свойствам, которых нет в объекте. По аналогичным причинам следующее не вызывает ошибку:

const obj = {
  prop1: 'val1'
};

console.log(obj.prop2);

Если свойство не существует для объекта, но к нему осуществляется доступ, это приведет к возврату undefined, но не к ошибке времени выполнения.

JavaScript не может отличить вашу попытку получить доступ к возможно существующему свойству от вашей опечатки.

Если вы хотите избежать ошибок такого рода (в конце концов, они не такие уж редкие), подумайте об использовании чего-нибудь строго типизированного, например Typescript, который может превратить такие раздражающие при отладке ошибки времени выполнения в легко исправляемые ошибки времени компиляции. (Я считаю, что TS необходим для нетривиальных проектов, он экономит так много времени на отладку.) Другой вариант - использовать IDE с автозаполнением intellisense (например, VSCode), что затрудняет выполнение подобных ошибок.

3
CertainPerformance 14 Сен 2020 в 14:45

Если длина приемлема для JavaScript?

Да. Если вы пытаетесь получить доступ к несуществующему свойству, JavaScript вернет значение undefined:

var obj = {length: 1};
console.log(obj.lenght)
console.log(obj.lenght > 2)

Однако уведомления об этой ошибке или синтаксической ошибке не поступают. На отладку у меня ушло много времени. Интересно, как такое могло случиться?

Это не синтаксическая ошибка. Синтаксическая ошибка - это когда ваш код настолько «сломан», что синтаксический анализатор не может обработать его как действительную программу JavaScript. Наличие опечатки в имени свойства не является синтаксической ошибкой (как синтаксический анализатор должен знать, правильное слово или нет? Для него это просто последовательность букв.)

Приведет ли опечатка к ошибке времени выполнения , зависит от контекста. Доступ к несуществующему свойству возвращает undefined, но в вашем случае это не было проблемой, потому что сравнение undefined с числом - допустимая операция.

С другой стороны, если вы попытаетесь получить доступ к другому свойству по значению undefined, вы получите ошибку:

var obj = {};
console.log(obj.foo.bar);

Из-за того, что ошибки легко пропустить, существуют такие инструменты, как Typescript и даже eslint. Они пытаются выявить проблемы во время разработки.

1
Felix Kling 14 Сен 2020 в 14:51