摘要

作者: k丶one | 来源:发表于2020-04-15 16:02 被阅读0次

    网道

    1.什么是 JavaScript 语言?

    JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script language),指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序(比如浏览器)的“脚本”。

    对象

    1.4 表达式还是语句?

    对象采用大括号表示,这导致了一个问题:如果行首是一个大括号,它到底是表达式还是语句?

    {foo:123}
    

    JavaScript 引擎读到上面这行代码,会发现可能有两种含义。第一种可能是,这是一个表达式,表示一个包含foo属性的对象;第二种可能是,这是一个语句,表示一个代码区块,里面有一个标签foo,指向表达式123。

    为了避免这种歧义,JavaScript 引擎的做法是,如果遇到这种情况,无法确定是对象还是代码块,一律解释为代码块。

    {console.log(123) }// 123
    

    上面的语句是一个代码块,而且只有解释为代码块,才能执行。

    如果要解释为对象,最好在大括号前加上圆括号。因为圆括号的里面,只能是表达式,所以确保大括号只能解释为对象。

    ({foo:123})// 正确
    ({console.log(123) })// 报错
    

    这种差异在eval语句(作用是对字符串求值)中反映得最明显。

    eval('{foo: 123}')// 123eval('({foo: 123})')// {foo: 123}
    

    上面代码中,如果没有圆括号,eval将其理解为一个代码块;加上圆括号以后,就理解成一个对象。

    2.5 属性是否醉在:in 运算符

    in运算符用于检查对象是否包含某个属性(不是键名),包含返回true,否则返回false。

    var obj = { p: 1 };
    'p' in obj // true
    'toString' in obj // true
    

    in不能识别

    2.6 属性的遍历:for...in 循环
    • 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
    • 它不仅遍历对象自身的属性,还遍历继承的属性。

    如果继承的属性是可遍历的,那么就会被for...in循环遍历到。但是,一般情况下,都是只想遍历对象自身的属性,所以使用for...in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。

    var person = { name: '老张' };
    
    for (var key in person) {
      if (person.hasOwnProperty(key)) {
        console.log(key);
      }
    }
    // name
    

    3.with 语句

    with (对象) {
      语句;
    }
    

    它的作用是操作同一个对象的多个属性时,提供一些书写的方便。

    // 例一
    var obj = {
      p1: 1,
      p2: 2,
    };
    with (obj) {
      p1 = 4;
      p2 = 5;
    }
    // 等同于
    obj.p1 = 4;
    obj.p2 = 5;
    
    // 例二
    with (document.links[0]){
      console.log(href);
      console.log(title);
      console.log(style);
    }
    // 等同于
    console.log(document.links[0].href);
    console.log(document.links[0].title);
    console.log(document.links[0].style);
    

    注意,如果with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。

    var obj = {};
    with (obj) {
      p1 = 4;
      p2 = 5;
    }
    
    obj.p1 // undefined
    p1 // 4
    

    中,对象obj并没有p1属性,对p1赋值等于创造了一个全局变量p1。正确的写法应该是,先定义对象obj的属性p1,然后在with区块内操作它。

    这是因为with区块没有改变作用域,它的内部依然是当前作用域。这造成了with语句的一个很大的弊病,就是绑定对象不明确。

    with (obj) {
      console.log(x);
    }
    

    单纯从上面的代码块,根本无法判断x到底是全局变量,还是对象obj的一个属性。这非常不利于代码的除错和模块化,编译器也无法对这段代码进行优化,只能留到运行时判断,这就拖慢了运行速度。因此,建议不要使用with语句,可以考虑用一个临时变量代替with。

    with(obj1.obj2.obj3) {
      console.log(p1 + p2);
    }
    
    // 可以写成
    var temp = obj1.obj2.obj3;
    console.log(temp.p1 + temp.p2);
    

    相关文章

      网友评论

          本文标题:摘要

          本文链接:https://www.haomeiwen.com/subject/zstdactx.html