悟透JavaScript——第一天

《悟透JavaScript》作者李战,在博客园有文章。

今天学习了第一部分 JavaScript真经的1~8节,对自己的学习进行下总结。

1.JavaScript的基本类型:undefined,null,boolean,number,string;复杂类型object.

 typeof运算符可以获取一个javascript元素的类型,返回的结果是string类型的值,为“undefined”,“boolean”,“number”,"string","object"这5种之一

 注意:typeof(null)返回“object”

    typeof(NaN)和typeof(Infinity)返回“number”,NaN参与任何数值计算的结构都是NaN,而且NaN != NaN。Infinity/Infinity = NaN。

    undefined,null,"",0,false在逻辑上都为false,其他任何东西都为true。而这5个中只有undefined == null,其他之间互不相等。

    isNaN()函数测试一个变量是否未NaN

2.JavaScript种对象的创建

 (1)JSON创建对象  创建一个空对象:var o = {};

             创建一个对象并设置属性或方法及初始值: var speaker = {text:"Hello World", say:function(){alert(this.text)}};

 (2)new创建对象   function MyFunc() {}; var anObj = new MyFunc();

  其他:javascript中对象可以动态的添加或删除属性和方法 

function Sing()
{
with(arguments.callee)
alert(author + ":" + poem);
};
Sing.author = "李白";
Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归";
Sing();
Sing.author = "李战";
Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年";
Sing();

     遍历对象的所有属性和方法 for(var s in anObject);

3.javascript函数

  函数的建立有两种形式“定义式”和“变量时”

  javascript的“预编译”:1.所有var变量的创建(初始值为undefined)

             2.“定义式”函数优先“执行”

  以下是两个代码的区别:

   var myfunc = function ()
{
alert("hello");
};
myfunc(); //第一次调用myfunc,输出hello

myfunc = function ()
{
alert("yeah");
};
myfunc(); //第二次调用myfunc,将输出yeah
    function myfunc ()
{
alert("hello");
};
myfunc(); //这里调用myfunc,输出yeah而不是hello

function myfunc ()
{
alert("yeah");
};
myfunc(); //这里调用myfunc,当然输出yeah

  注意:var定义的是作用域的一个变量(在另外一个作用域[函数]该变量无定义undefined)

     而没有“var”的标示符却可能是全局根对象的一个属性(全局变量)。

  函数caller属性:假如为null则表示函数没有被调用或者被全局代码调用,否则输出被调用的函数(类似toString())

4.javascript中的this与call函数

   function WhoAmI()       //定义一个函数WhoAmI
{
alert("I'm " + this.name + " of " + typeof(this));
};
WhoAmI(); //此时是this当前这段代码的全局对象,在浏览器中就是window对象,其name属性为空字符串。输出:I'm of object
var BillGates = {name: "Bill Gates"};
BillGates.WhoAmI = WhoAmI; //将函数WhoAmI作为BillGates的方法。
BillGates.WhoAmI(); //此时的this是BillGates。输出:I'm Bill Gates of object

var SteveJobs = {name: "Steve Jobs"};
SteveJobs.WhoAmI = WhoAmI; //将函数WhoAmI作为SteveJobs的方法。
SteveJobs.WhoAmI(); //此时的this是SteveJobs。输出:I'm Steve Jobs of object
WhoAmI.call(BillGates); //直接将BillGates作为this,调用WhoAmI。输出:I'm Bill Gates of object
WhoAmI.call(SteveJobs); //直接将SteveJobs作为this,调用WhoAmI。输出:I'm Steve Jobs of object

BillGates.WhoAmI.call(SteveJobs); //将SteveJobs作为this,却调用BillGates的WhoAmI方法。输出:I'm Steve Jobs of object
SteveJobs.WhoAmI.call(BillGates); //将BillGates作为this,却调用SteveJobs的WhoAmI方法。输出:I'm Bill Gates of object
WhoAmI.WhoAmI = WhoAmI; //将WhoAmI函数设置为自身的方法。
WhoAmI.name = "WhoAmI";
WhoAmI.WhoAmI(); //此时的this是WhoAmI函数自己。输出:I'm WhoAmI of function

({name: "nobody", WhoAmI: WhoAmI}).WhoAmI(); //临时创建一个匿名对象并设置属性后调用WhoAmI方法。输出:I'm nobody of object

  像BillGates.WhoAmI()这种形式是传递this参数最常规的形式,此时的this就是函数所属的的对象本身。

  下面是百度知道中对call的一段分析

标准解释:call方法是将一个对象的方法在另一个对象的上下文环境中执行。
详细解释:你的例子中,myFun.call(myObject, 13, 3, 95)执行时是这样的:
1. 调用myFun函数
2. 将13,3,95三个参数传递给它(你的myFun方法中没有处理这些参数的代码,所以传了也没有用)
3. 将myFun函数中的所有this用myObject代替(同样,你的myFun函数中没有使用this,所以执行结果和直接调用myFun()是一样的)
修改一下你的例子,帮助你理解:
function myFun(p1, p2, p3)
{
this.para1 = p1;
this.para2 = p2;
this.para3 = p3;
}
var myObject = new Object();
alert(myObject.para1) //显示undefined
myFun.call(myObject,13,3,95); /*执行的时候,myFun方法中的this全部用myObject对象代替,所以在这个例子中,执行myFun方法和直接写下面的语句效果是一样的:
myObject.para1 = 13;
myObject.para2 = 3;
myObject.para3 = 95;
*/
alert(myObject.para1) //显示13