• javascript权威指南笔记--javascript语言核心(二)


    1.函数作用域:在函数内声明的所有变量在函数体内始终是可见的。这意味着在变量声明之前甚至已经可用。

      *“声明提前”:javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数的顶部。

      function test(o) {

        var i = 0;

        if(typeof(o) == "object") {

          var j = 0;

          for(var k=0; k<10; k++) {

            console.log(k);//0-9

          }

          console.log(k);//10

        }

        console.log(j);//0

      }

      var scope="global";

      function() {

        console.log(scope);//undefined

        var scope = "local";

        console.log(scope);//"local"

      }

      因为函数内变量scope的声明被提前,相当于:

      var scope = "global";

      function(){

        var scope;

        console.log(scope);

        scope = "local";

        console.log(scope);

      }

      (function(){

        testa();//testa

        testb();//undefined is not a function

        console.log(testd);//undefined

        function testa(){//被提前到外部函数作用域顶部

          console.log("testa");

        }

        var testb = function(){//变量的声明被提前,但赋值不会提前

          console.log("testb");

        }

        var testd = "testd";//变量的声明被提前,但赋值不会提前

      });

    2.当使用var声明一个全局变量的时候,实际上定义了一个全局对象的属性,这个变量无法通过delete删除(该变量不可配置)。给一个未声明的变量赋值,javascript会自动创建一个全局变量,且该变量可配置(可删除)。

      var truevar = 1;//声明一个不可删除的全局变量

      fakevar = 2;//创建全局对象一个可删除的属性

      this.fakevar2 = 3;//同fakevar

      delete truevar;//false

      delete fakevar;//true

      delete fakevar2;//true

    3.当javascript代码中出现了标识符,javascript会把它当成变量去查找它的值。变量名不存在,表达式的运算结果为undefined。

    4.数组直接量的列表逗号之间的元素可以省略,这时省略的空位会被填充undefined,直接量的元素列表结尾处可以留下单个逗号,此时不会创建一个新的值为undefined的元素。

      var matrix = [1,,,,3,]; 等价于 var matrix = [1,undefined,undefined,undefined,3];

    5.一元操作符、赋值、三元条件运算符都具有从右至左的结核性。

    6.b=(a++)+a;假设a等于1,b的运算结果为:3。

    7.“+”运算符:如果其中一个操作数是对象,则将对象转换成原始值再进行操作。在进行了对象到原始值的转换之后,如果其中一个操作数是字符串,则进行字符串连接操作。否则将两个操作数都转换成数字进行加法操作。

      1+2//3

      "1"+"2"//"12"

      "1"+2//"12"

      1+{}//=>1+"[object Object]"=>"1[object Object]"对象转换成字符串后进行字符串连接

      1+null//=>1+0=>0

      1+undefined//=>1+NaN=>NaN

    8.一元加法(+):一元加法运算符将操作符转换成数字(或NaN),并返回这个转换后的数字。

    9.一元减法(-):一元减法运算符将操作符转换成数字(或NaN)再求负。

    10.递增、递减(++,--):var i = 1; var j = i++;//i = 2,j=1

                 var i = 1;var j = ++i;//i=2,j=2

    11.关系表达式:

      (1).相等与不等运算符:==(相等)  ===(严格相等)  !=(不相等)  !==(不严格相等)

      (2).严格相等运算(===):首先计算其操作数的值,然后比较这两个值,过程中没有类型转换:

         类型不同,不严格等;

         null!==undefined;

         同为true或false,严格相等;

         NaN与其他任何值都不等,包括它本身;(通过x!==x来判断是否为NaN)

         如果两个为数字且数值相等,则他们相等;(-0严格等于0)

         如果两个引用值指向同一个对象、数组、函数,则他们严格相等;

         如果两个字符串的长度或内容不同,则他们不严格相等。

      (3).相等运算(==):如果两个操作数不是同一类型,则操作符尝试进行一些类型转换,然后再进行比较:

         如果操作数的类型相同,则和严格相等的比较规则一样;

         如果两个操作数类型不同,将和遵循如下规则和类型转换:

          null==undefined;

          字符串和数字进行比较,先将字符串转换成数字,再比较;

          如果其中一个值是布尔值,则先将布尔值转成0或1,再比较;

          如果一个值为对象,另外一个值是数字或字符串,则先将对象转换成原始值再进行比较;

          其他不同类型之间的比较均不相等。

      (4).比较运算符(>,<,>=,<=):比较数字的大小或字母表的先后顺序

          如果两个操作数都是字符串,才比较字母表的先后顺序,否则转换成数字进行比较。

          字符串的比较最好用String.localCompare()方法。

      (5).in运算符:该运算符希望它的左操作数是一个字符串或可以转换成字符串,右操作数是一个对象。

          var point = {x:1,y:2};

          "x" in pont;//true

          "z" in point;//false

          "toString" in point;//true,对象继承了toString方法

          

          var arr = [3,4,5];

          "0" in arr;//true

          1 in arr;//true,数字转换成字符串“1”

          3 in arr;//没有索引为3的元素

      (6).instanceof运算符:该操作符希望左操作数是一个对象,右操作数是标识对象的类。

                 如果左操作数不是一个对象,将返回false;如果右操作数不是函数,将抛出一个类型错误异常。

                 所有对象都是Object的实例。

    12.逻辑表达式:

      (1).&&逻辑与:首先计算左操作数。如果左操作数是假值,直接返回false,不去计算右操作数的值。如果左操作数是真值,那么“&&”将计算右操作数的值,并将其返回作为整个表达式的结果。

      (2).||逻辑或:首先计算左操作数。如果左操作数是真值,则直接返回左操作数的值。否则再计算右操作数的值,并将其返回作为表达式的结果。

             eg:function copy(o,p){//将o的成员属性复制到p中,并返回p

               return p = p || {};//如果没有向参数p传入任何的对象,则使用一个新创建的对象

               }

       (3).!逻辑非:总返回true或false。将操作数转换成布尔值再对其求反。

    13.赋值表达式:

      (1).=:要求左操作数是一个变量或对象,右操作数可以是任意类型的任意值。结合性:从右至左。

          x=y=z=0;//同时给x,y,z赋值为0

      (2).+=,-=,*=,/=,&=:即a op= b;等价于a= a op b;前者计算一次,后者计算两次。只有在a包含具有副作用的表达式的时候,两者才不等价。

          data[i++] *= 2;

          data[i++] = data[i++] * 2;

      (3).直接调用eval()其作用域是调用它的上下文作用域,eval()将改变该作用域内的变量。

        当通过别名调用eval()时,其作用域是全局代码,eval()将改变全局变量的值,但不会改变局部变量的值。eval()内执行的代码可能定义新的全局变量或全局函数。

        var x = "global";

        var y = "global";

        var geval = eval;

        function f() {

          var x = "local";

          eval("x+='changed';");

          return x;

        }

        function g() {

          var y = "local";

          geval("y+='changed';");

          return y;

        }

        console.log(f(),x);//localchanged global

        console.log(g(),y);//local globalchanged

    14.其他运算符:

      (1).条件运算符(?:),javascript中唯一一个三元运算符。

      (2).typeof运算符:

        typeof(undefined) => "undefined"

        typeof(null) => "object"

        typeof(true/false) => "boolean"

        typeof(数字/NaN) => "number"

        typeof(字符串) => "string"

        typeof(函数) => "function"

        typeof(内置对象(非函数)) => "object"

        typeof(宿主对象) => 由编译器各自实现的字符串

      (3).delete运算符:用来删除对象属性或数组元素。删除后并没有改变数组的长度,删除操作留下了一个“空洞”,再访问该属性、元素将返回一个undefined。

      (4).void运算符:一元运算符,操作数会照常计算,但忽略计算结果,返回undefined。常见应用:

              void 0 或 void(0)总是等于undefined;

              <a href="javascript:void(0)"></a>可阻止链接的默认跳转行为;

              <a href="javascript:void window.open(URL)"></a>//在新窗口打开URL,不会改变当前页面的内容

      (5).逗号运算符(,)   

      

  • 相关阅读:
    UVa 106
    UVa 111
    UVa 105
    UVa 104
    UVa 103
    UVa 102
    UVa 101
    UVa 100
    就决定是你了!
    阿姆斯特朗回旋加速喷气式阿姆斯特朗炮
  • 原文地址:https://www.cnblogs.com/rellame/p/4953913.html
Copyright © 2020-2023  润新知