javascript总结集合

前言:下面的总结都是自己测试过的,绝大多数都是没问题的,但是不敢保证一定全面,还需要诸君自己独立思考;

1)基础:在nodejs里全局对象是global,而网页里js的全局对象是window;对于所有在全局范围内声明的var或非var变量如obj,都可以用global.obj/window.obj来引用;

对于全局范围里的变量用var和不用var是一样的,但是对于方法内的变量则var能够限定变量的scope只存在于该方法内,而非var的变量则仍然属于全局对象;(上述定义对于方法的归属和scope也是一样的)

2)对于1)的补充:如function test(){pro=33;};那么pro确实是属于window的,可以window.pro来引用,但是前提是先执行了一次test();

3)重要:如果有function test(){...;return result;};那么new test()产生的对象是根据result的类型来决定的,如果result是null/String/Boolean/Number这些基础的类型,则new test()获得的就是test类对象,如果result是复杂类型则new test()返回的是result;

4)重要:如果存在function test(){this.pro=33};但是却是以普通方法执行的如test();那么pro将会是全局对象的属性,因为test();等价于window.test();,如果是mm.test();则test方法内的this就是mm方法对象/类;

5)基础:对于function test(arg0){..};在调用test方法时是可以不指定形参值的如test();,此时在test方法内部arg0是一个undefined变量;但一般都用if(typeof arg0 === "undefined")来判断;

6)基础:对于function test(){...};虽然test没有声明参数列表,但是调用test方法时还是可以提供参数的如test(33,44);而test内部可以通过arguments来获取参数,如arguments[0]就是33;

7)基础:==和===的区别最大在于判断时还包括对类型的判断,如'33'==33为true而'33'===33为false;对于!=和!==也一样;

8)语法:可以用(function (arg0){})(33);在声明匿名方法后立刻执行此方法,而前面加上new关键字则是在声明此匿名类后立刻创建一个此类对象,有点像单例模式;

9)基础:js里也是所有的类都是Object的子类,prototype就是Object类的属性;js里也提供三目运算符和逗号运算符,它们和C++的用法一样;

10)基础:var a;那么a是undefined而非像java里的成员一样有默认值如null/0/false之类的;,另外undefined是只某个变量未初始化或声明(其实就是未初始化,因为直接用也是一种声明),而null是初始化了但是值为null;

11)基础:js提供void运算符,如var a, b, c;a = (b = 5, c = 8);那么a的值是8;而如果后面改成a = void(b = 5, c = 8);则a会是undefined,而且这个undefined就是void运算符返回的,即便a原来有值也会变为undefined;不能直接void或void();

12)基础:假设testa方法定义里会调用testb方法,testb方法是可以在testa方法后面定义的,但是调有testa方法时testb必须已经定义好;

13)其它:js里可以通过“静态”方法实现java里的包路径的:

  function me(){};
    me.silentdoer = function(){};
    me.silentdoer.common = function(){};
    me.silentdoer.common.TestTool = function () {};
    me.silentdoer.common.TestTool.print = function(msg){
        if(msg != undefined){
            alert(msg);
        }
    };
    window.me.silentdoer.common.TestTool.print("UUUUU");
来实现包名管理,注意不能直接me.silentdoer.common.TestTool.print = xxx;
如果用的时候不想每次输入这么长的“包名”,可以var TestTool = me.silentdoer.common.TestTool;(类似import)
然后就可以直接TestTool.print("sss");

14)基础:js里变量有var和无var的区别之一如:var a;那么不管前面是否有a变量这里都重新声明a变量且未初始化;而直接a则如果前面有a变量这里相当于是直接引用,因此a的值是老值,但是如果前面没有a变量则也是相当于声明了一个a变量为未初始化状态;

15)其它:js里可以a = undefined;但自己目前不清楚这样做的特殊用处是什么;

16)重要:有如下方法定义

var me = function (){
        function test() {
            alert("uuuu");
        }
        test();
    };
me();
me方法内部的test方法定义就像var test = function(){...};
即function aaa(){}是局部变量的范畴,因此不能window.test();
,每执行me()一次都会产生一次方法定义?;
注意test不是me的“静态方法”,如果要定义“静态方法”可以me.test = function(){..} 

17)重要:对于typeof result返回的值有:1.'object';2.'undefined';3.'function';4.'string';5.'number';6.'boolean';如果result是null/JSON对象或数组/new的对象(包括String等)都是"object",而如果result是字符串字面值则是"string",如果是方法或类则是"function"

18)基础:在js里除了数值能充当true/false,对于undefined和null同样可以;0和undefined和null都在if条件判断里都可以充当false;

19)基础:var a=8, b=9;那么a和b都是var的而非只有a是var声明的;

20)基础:对于类test的“实例属性”可以在prototype里定义,而“静态属性”则可以直接test.pro来定义;虽然test.prototype.pro=33;需要new test()才能调有pro(多实例不共享),但是也可以直接test.prototype.pro来调用(共享),prototype是一个特殊的存在;

21)基础:所有的“类”和对象都可以理解为JSON对象,因此test.prototype.pro = 33;的prototype是JSON对象,而这句代码就是给这个JSON对象添加新的属性pro值为33;因此可以test.prototype = {...}来一次性用新的JSON对象覆盖prototype的值;

22)待续。。

猜你喜欢

转载自www.cnblogs.com/silentdoer/p/8921837.html