Что случилось с определением переменных JavaScript, в если блоки?

Я немного изменил код выше. для меня 0! == false и null! == undefined . Если вам не нужна такая строгая проверка, удалите один « = » знак « this [p]! == x [p] » внутри кода.

Object.prototype.equals = function(x){
    for (var p in this) {
        if(typeof(this[p]) !== typeof(x[p])) return false;
        if((this[p]===null) !== (x[p]===null)) return false;
        switch (typeof(this[p])) {
            case 'undefined':
                if (typeof(x[p]) != 'undefined') return false;
                break;
            case 'object':
                if(this[p]!==null && x[p]!==null && (this[p].constructor.toString() !== x[p].constructor.toString() || !this[p].equals(x[p]))) return false;
                break;
            case 'function':
                if (p != 'equals' && this[p].toString() != x[p].toString()) return false;
                break;
            default:
                if (this[p] !== x[p]) return false;
        }
    }
    return true;
}

Затем я проверил это со следующими объектами:

var a = {a: 'text', b:[0,1]};
var b = {a: 'text', b:[0,1]};
var c = {a: 'text', b: 0};
var d = {a: 'text', b: false};
var e = {a: 'text', b:[1,0]};
var f = {a: 'text', b:[1,0], f: function(){ this.f = this.b; }};
var g = {a: 'text', b:[1,0], f: function(){ this.f = this.b; }};
var h = {a: 'text', b:[1,0], f: function(){ this.a = this.b; }};
var i = {
    a: 'text',
    c: {
        b: [1, 0],
        f: function(){
            this.a = this.b;
        }
    }
};
var j = {
    a: 'text',
    c: {
        b: [1, 0],
        f: function(){
            this.a = this.b;
        }
    }
};
var k = {a: 'text', b: null};
var l = {a: 'text', b: undefined};

a == b ожидаемое истина; вернул true

a == c ожидал false; вернул ложь

c == d ожидал ложь; вернул ложь

a == e ожидал ложь; вернул false

f == g ожидал true; вернул true

h == g ожидал false; вернул false

i == j ожидал true; вернул true

d == k ожидал false; вернул ложь

k == я ожидал ложь; вернул false

12
задан Mark 22 July 2009 в 01:40
поделиться

4 ответа

Вот реализация с использованием string :: find и string :: insert, не уверен, что она быстрее, вам придется это выяснить! Вот оно:

std::string src = "hey there i have \" all \" over the f\"in pla\"ce\"";
size_t n = 0;
while ( (n=src.find("\"",n)) != std::string::npos )
{
    src.insert(n,"\\");
    n+=2;
}   
std::cout << src << std::endl;

Что напечатано:

эй, у меня \ "все \" этот var будет определен независимо от того, выполняется ли условие оператора if.

Имейте в виду, что подъем не включает присваивание, поэтому, как указывали другие, объявления var будут перемещены наверх и останутся неопределенными, пока они не будут назначены позже.

Это пример функции, которая в то время могла показаться хорошей идеей, но оказалась скорее запутанной, чем полезной.

32
ответ дан 2 December 2019 в 03:10
поделиться

Это связано с тем, что в JavaScript переменные имеют разную область видимости только внутри функциональных блоков. В отличие от других языков, блоки if не имеют другой области видимости в JavaScript.

В вашем случае JSLint сообщит вам, что переменная уже определена, потому что возможно, что оба условия верны, и в этом случае вы перезаписываете свои переменные.

Вот пример того, как области видимости работают в JavaScript :

function Something() {
    var thing1 = "hello";

    (function() {
        var thing2 = "world";
    })();

    // This line will throw a ReferenceError because "thing2" is not defined in this scope
    // It only exists within the scope of the function executed above
    alert(thing1 + thing2);
}

function SomethingElse() {
    var thing1 = "hello";

    if(true) {
        var thing2 = "world";
    }

    // This line will work because thing2 is not limited to the if-block
    alert(thing1 + thing2);
}
12
ответ дан 2 December 2019 в 03:10
поделиться

Только функции создают внутреннюю область видимости. Это становится еще более опасным, как в этом примере.

var x = 2;
function foo() {
    alert(x); // will alert undefined?!?

    var x = 4;
}
foo();
alert(x); // will alert 2

В первом предупреждении фактически будет указано undefined. Почему? Поскольку все инициализации переменных, которые происходят в функции, инициализируются неопределенным значением в начале функции . Вот почему Крокфорд советует инициализировать все переменные как можно раньше.

Так что ваш код, вероятно, должен выглядеть так:

$("#container").click(function (event){ 
        var imagesrc;
        if ($(event.target).is('img.class1')) {
                imagesrc = $(event.target).attr('src');
                // Do something with imagesrc
        }

        if ($(event.target).is('img.class2')) {
                imagesrc = $(event.target).attr('src');
                // Do something with imagesrc
        }

        // This condition is mutually exclusive to the above 2
        if ($(event.target).is('img.class3')) {
                imagesrc = $(event.target).attr('src');
                // Do something with imagesrc
        }

        // This condition is mutually exclusive to 1 and 2 but not to 3
        if ($(event.target).is('img.class4')) {
                imagesrc = $(event.target).attr('src');
                // Do something with imagesrc
        }

});
6
ответ дан 2 December 2019 в 03:10
поделиться

Являются ли два условия if взаимоисключающими? Возможно, вы захотите использовать управляющую структуру «else»:

if (condition) {
    var variable = blah;
}
else if (differentcondition) {
    var variable = blah;
}

Это означает, что если первое условие истинно, то вторая часть кода никогда не будет выполнена.

В общем, лучше объявлять переменные внутри структура, в которой они используются. Если переменная должна существовать только в операторе if, то объявление ее там нормально, в противном случае переместите ее за пределы, например:

var variable;
if (condition) {
    variable = blah;
}
else if (differentcondition) {
    variable = blah;
}
// continue to use variable here...

Примечание: если вы используете отдельные if без else, тогда вы сначала нужно установить для переменной значение по умолчанию.

0
ответ дан 2 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

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