Javascript Gotchas
这里包含的内容是我在学习JavaScript的时候遇到希望有人能告诉我的。可以说Javascript是一个比较简单的语言的,但是其中也有一些你意想不到的陷阱。
Map的key是String类型
一些术语:有些人称之为对象,有些称之为结合数组。我在这里称之为Map。因为在面向对象的风格中我们更喜欢把它当作Map来用,而不是对象。
Javascript只有少量的内置对象(boolean, float, string, object, array),而且你可以自由的在类型之间进行转换。乍一看下面的代码,你一定会认为:这会创建一个包含两个实体的Map。但是因为所有的key都会被转换成String类型。所以实际上Map中只有一个实体:
var a = 3 + 4; var b = "7";
var map = {};
map[a] = "entry 1";
map[b] = "entry 2";
alert(map[a]);
把一个对象附加给一个函数是没有意义的
在多数OO语言中一个方法是知道自己是属于哪个对象的。在Javascript中当你把一个对象附加给一个函数时,这个函数实际上是不关心自己正在被谁使用的。
你一定曾经误认为下面的代码的显示结果是"1 2"(数组中有几个元素显示几次)
{
var instance = "1";
this.member = "2";
array.sort(function(a1, a2) {
alert(instance + " " + this.member);
});
}
实际上并不像你想象的那样,你会得到一个错误。尽管对象知道自己包含的函数,但是函数并不在乎自己的出身。所以当你把这个函数传递给sort程序,它已经不知道自己是哪个对象的一部分了。所以this就变成了window对象。
解决方案是把变量做为闭包的一部分。
{
var instance = "1";
this.member = "2";
var cthis = this;
array.sort(function(a1, a2) {
alert(instance + " " + cthis.member);
});
}
这会结果是"1 2". this仍然会被忘记,但是cthis是闭包的一部分,所以我们可以在函数中访问到cthis。