Я немного изменил код выше. для меня 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
Вот реализация с использованием 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 будут перемещены наверх и останутся неопределенными, пока они не будут назначены позже.
Это пример функции, которая в то время могла показаться хорошей идеей, но оказалась скорее запутанной, чем полезной.
Это связано с тем, что в 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);
}
Только функции создают внутреннюю область видимости. Это становится еще более опасным, как в этом примере.
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
}
});
Являются ли два условия 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, тогда вы сначала нужно установить для переменной значение по умолчанию.