JavaScript语言精粹

262 阅读5分钟

对象 (objects)

  • 简单数据类型

    1. 数字(number):

      let num = 1,f =1.0;

      console.log(typeof num,typeof f); 向控制台输出 不区分整型和浮点型(js是不适合用来做高精确运算的语言) 例如:

           console.log(0.1+0.2);  其值可能会等于0.300000000004(精度有问题)
      
                   let lastName = name[0](获取字符串第一个字符的长度)
                   name.substring(1,name.length);   //相当于[1,name.length)
      
    2. 字符串(String):

      例如:

      let name = '我是谁';

      console.log(typeof name, name.length); //面向对象的写法 name.lenght(获取字符串长度)

      在JavaScript中可以使用console.log(1 + name) //可以使用数字 + 字符串

    3. 布尔值(boolean):

      ture or false

    4. 未定义(undefined):

      console.log(typeof gf); //返回值为undefined gf 未定义

    5. 空值(null):

      let gf = null; //声明了,但没有值

      但是在用 typeof 输出类型时,其可能不会显示 null ,因为JS typeof 是有点错位的(JS 是一周设计出来的)

  • 复杂数据类型(引用数据类型)

    1. 对象(object):

      object JS 一切皆是对象

      { } 、 [ ] 、 () => { } object array function reg

      const obj = { //const 表示常量

       name:'我是谁',
       isString:true
      

      }

      console.log(obj); // 常量对象的属性可以修改

  • typeof 运算符,可以得到变量类型

  • JS数据类型分为简单数据类型和复杂数据类型,使用 typeof 关键字可以得到变量的数据类型。

    The Bad parts(有问题的):

      1. null ,浮点数, array 在意料之外。
    
      2. let a = 1;
          a = "name"; //可以覆盖
    
  • JS是一门脚本语言(不需要编译可以直接运行)、全栈语言(在命令行运行)、动态弱类型语言

对象字面量

(如果属性名是合法的,则并不强制要求用引号括住属性名,反之则需要例如: "first-name") 属性名可以是包括空字符串在内的任何字符串。

var empty_object = { };

除了基本数据类型,只有对象 数组是对象、函数是对象,正则表达式也是对象,对象自然也是对象

检索

  • 要检索对象里包含的值,可以才用在 [ ] 后缀中括住一个字符串表达式的方法 (属性名不合法的情况下) 合法的情况下可以使用 . 表示法代替

    例如:

     stooge["first-name"]    //"Jerome"
    
     flight.departure.IATA    //"SYD"  表示为取出对象flight中嵌套的departure对象中的IATA属性   (这就说明对象是可以嵌套的)
    

    在检索过程中如果尝试检索对象中不存在的成员属性的值,则会返回undefined(未定义)

    尝试从undefined的成员属性中取值将会导致TypeError异常 可以通过 && 运算符来避免错误

     flight.equipment   //undefind
    
     flight.equipment.model   //throw "TypeError"
    
     flight.equipment && flight.equipment.model  //undefind
    

更新

  • 赋值语句更新对象
    1. 如果赋值的属性名已经存在在对象中 则当赋值时 原属性值会被替换掉

    2. 如果对象没有拥有这个属性名时,则该属性会被添加到对象中

引用

  • 对象通过引用来传递,他们永远都不会被复制

    例如:

      var x = stooge;
    
      x.nickname = 'Curly';
    
      var nick = stooge.nickname;    //nick为'Curly'
    
      var a = { }, b = { }, c = { }; //a ,b ,c 每个都引用了一个不同的空对象
    
      a = b = c = { };  //引用了相同的空对象
    

原型

  • 每个对象都连接到一个原型对象,并且它可以从中继承属性。

  • 原型连接在更新时是不起作用的。当我们对某个对象做出改变时,不会触及该对象的原型。

  • 如果我们添加一个新的属性到原型中,该属性会立即对所有基于该属性创建的对象可见(意思就是成为原型属性的分子)

反射

  • constructor //每个对象都含有,其始终指向创建当前对象实例(构造)函数

  • toString() //返回以字符串表示的Number对象值。如果方法有两个参数,返回用第二个参数指定基数表示的第一个参数的字符串表示形式 例如:

      var num = 15;
      var n = num.toString();   //n输出为15    其为字符串
      var b = num.toString(2);  //将15转化为二进制    1111
    
  • 原型链中的任何属性都会产生值。

    例如:

      typeof flight.toString    // 'function'
      typeof flight.constructor  //'function'
    

    有两种方法去处理这些不需要的属性

      1. 让程序做检查并丢弃值为函数的属性
      2. 使用hasOWNproperty方法,如果对象拥有独有的属性,它将返回true//该方法不会检查原型链
    

枚举

  • for in 语句用来遍历一个对象中的所有属性名。

    例如:

      var name;
      for (name in another_stooge){
          if (typeof abother_stooge[name] !== 'function'){
              document.writeln(name + ':' + another_stooge[name]);
          }
      }
    

通过该方法遍历出来的属性名的顺序是不确定的(类似于集合)

  • 创建数组 用下标来查找需要的属性名

    例如:

      var i;
      var properties = [
          'first-name',
          'middle-name',
          'last-name',
          'profession'
      ];
      for (i = 0;i <properties.lenght; i++ ){
          document.writeln(properties[i]+ ':' + another_stooge[properties[i]]);
      }
    

通过for 可以得到我们想要的属性

删除

  • delete运算符可以用来删除对象的属性
  • 删除对象的属性可能会让来自原型链中的属性透视出来(对象的属性可能来自原型链)

减少全局变量污染

两种方法

  1. 为应用只创建一个唯一的全局变量:(把全局性资源都纳入一个名称空间下,你的程序与其他应用程序、组件或类库之间发生冲突的可能性就会显著降低)

     var MYAPP ={ }
    
     MYAPP.stooge = {
         "first-name":"Joe",
         "last-name":"Howard"
     };
    
     MYAPP.flight = {
         airline:"Oceanic",
         number: 815,
         departure:{
             IATA: "SYD",
             time: "2004-09-22 14:55",
             city: "Sydney"
         },
         arrival:{
             IATA: "LAX",
             time: "2004-09-23 14:55",
             city: "Los Angeless"
         }
     };
    
  2. 用闭包来进行信息隐藏 (函数 和 函数内部能访问到的变量(也叫环境)的总和,就是一个闭包) //局部变量