学习javascript笔记

使用 var 声明:

       如果var出现在函数体内,是一个局部变量,如果出现在顶层,是一个全局变量,全局变量是全局对象的一个属性,和其他全局对象不同的是:用var声明的变量是无法通过 delete 删除的。

      如果var语句中变量没有指定初始化表达式,这个变量初始化为 undefined.

      变量声明语句会被提前到脚本或者函数的顶部。但是初始化操作还是在原来var语句的位置执行。在初始化之前的变量值是undefined。这里要注意的是在for中定义的变量同样会提前并在整个函数中可见。注意多次声明同一个变量是无所谓的。

function :

      两种声明方式的不同:通过var变量声明只有变量提前,通过函数声明语句声明的函数,函数名称和函数体都被提前。

switch :

     case表达式判断是通过 "===" 运算符进行比较的。

for/while :

     在包含continue语句的情况下,while不能安全模拟for,因为在执行continue后for会进行增量++。

术语 :

     内置对象(native object) : 是由ECMAScript规范定义的对象或类.例如:数组、函数、日期和正则表达式。

     宿主对象(host object) : 是由javascript解释器所嵌入的环境( 如web浏览器 )定义的.如HTMLElement对象。

原型 :

    对象创建方式 : {}、new object()、Object.create()。

    {}创建的对象具有同一个原型对象,可以通过Object.prototype获取原型对象的引用。

    通过new 构造函数调用创建的对象的原型就是构造函数的prototype属性的值。

    使用new 构造函数调用时如果不传参数可以省去() 如 : new Object() 可以写成 new Object。

    Object.create()创建一个新对象,第一个参数是这个对象的原型,第二个参数(可选)用以对对象的属性进行描述。

    Object.create(null); //会创建一个没有原型的对象。

类属性 :

    对象的类属性是一个字符串,用以表示对象的类型信息。对象默认的toString()方法返回对象的类信息如:[object Class]。但是对象继承的toString()方法被重写了的话,为了获取类信息,必须间接调用Function.call()方法如 : Object.prototype.toString().call()。

数组 :

    delete 数组元素,并不影响数组的长度。也不会将元素从高索引处移下来填充已删除属性留下的空白,而是变成稀疏数组。

this :

     var o = {

         m : function(){

             f();

            function f(){

                  console.log( this );  // this 是全局对象 或 undefined

            }

         }

     }

     o.m();

arguments :

      function f(x){

           x = 1;  // 也会改变arguments[0] 的 值 取决于调用方法的方式

          console.log(x); // f(1) : 1,  f() : 1

          console.log(arguments[0]);  // f(1) : 1 , f() : undefined

           arguments[0] = 3; //也会改变 x 的值 取决于调用方法的方式

           console.log(x);  // f(1) : 3, f() : 1 

           console.log(arguments[0]);  // f(1) : 3 , f() : 3

      }

函数length :

     

        function check(args){
             var actual = args.length;
             var ex = args.callee.length;
             console.log(ex +','+actual);  // 3,2
         }
         function f(x,y,z){
              check(arguments);
         }

         f(1,2);

Function() 构造函数 :

         var scope = 'global';
         function cf(){
              var scope = 'local';
              return new Function('return scope');
         }
         cf()();  // "global"  Function 创建的函数体代码的编译总是会在顶层函数执行

constructor属性 :

         每个js函数都自动有一个prototype属性。这个属性的值是一个对象,这个对象包含唯一一个不可枚举的属性

         constructor。constructor属性的值是一个函数对象:

         var F = function(){};  // 这是一个函数对象

         F.prototype.constructor === F;  // true

        构造函数的原型中存在constructor属性,这意味着对象继承的constructor指代它的构造函数。

        var o = new F();  //创建类F的一个对象

        o.constructor === F;  // true :  对象从原型继承的constructor属性指代他的构造函数

        一个例子:

        function R( name ){

              this.name = name;

        }

         // 指定一个新对象原型

       R.prototype = {

             toString:function(){}

        };      

      var r = new R('ss');

      console.log( r.constructor );  // function Object()

      例子中这个新原型对象不含有constructor属性,因此R的实例对象也不含有constructor属性,可以通过设置函数的

     的反向引用来补救。

     R.prototype = {

         constructor : R  // 显示设置构造函数的反向引用

    }
    另一个解决方法是使用预定义的原型对象,该对象包含constructor属性,然后给原型对象添加方法.

    R.prototype.toString = function(){};

你可能感兴趣的:(学习javascript笔记)