// 对象: Object
// 构造函数 Object :
  var obj = new Object();
  obj.id = 9;
  obj.name = "lucy";
  obj.age = 16;
  obj.gender = "male";
  console.log(obj);      //  输出结果: { id: 9, name: 'lucy', age: 16, gender: 'male' }

// 对象字面量
  var obj = {
    id:9,
    name:"lucy",
    age:16,
    gender:"male"
  }
  console.log(obj);      //  输出结果:{ id: 9, name: 'lucy', age: 16, gender: 'male' }
 

// 函数
// 函数声明
  function test(){
    console.log(" 我是函数声明!");      //   输出结果:我是函数声明!
  } 

// 构造函数
  var test = function(){
    console.log(" 我是构造函数!");      //  输出结果:我是构造函数!
  } 
// 函数调用   function sayHello(){     console.log("hello world");      // 输出结果: hello world   }   var info = sayHello;   info();      // 第一次调用sayHello,输出一次 hello world   var obj = {     test:info   }   obj.test();      // 第二次调用sayHello,输出一次 hello world // 数组:Array // 构造函数 Array:   var arr = new Array();   arr[0] = 1;   arr[1] = "tom";   arr[2] = 16;   arr[3] = "male";   console.log(arr);      // 输出结果:[ 1, 'tom', 16, 'male' ]   /* 注意: 如果Array构造函数传递的是数值,则会按照该数组创建包含给定项数的数组,即只定义数组长度,但是没有值.但是,此数组和 var arr = [];不一样,arr是空数组,长度为0 */   var arr1 = new Array(3);   console.log(arr1);      // 输出结果:[ <3 empty items> ]  即数组arr是空数组,其长度为3 // 数组字面量   var arr = [1,"tom",16,"male"];   console.log(arr);      // 输出结果:[ 1, 'tom', 16, 'male' ] // 数组的访问   var arr = [1,"tom",16,"male","hello world"];   var result1 = arr[3];   var result2 = arr[0];   var result3 = arr[6];   console.log(result1);      // 输出结果:male   console.log(result2);      // 输出结果:1   console.log(result3);      // 输出结果: undefined // 数组的属性: length      /* 1、length不是只读的,即可以动态的改变 2、可以使用length给数组移除项或者添加新项 3、如果length设置为小于数组长度的项,会移除数组的项 */   var arr = [1,"tom",16,"male","hello world"];   console.log(arr.length);      // 输出结果:5   // length小于数组原本的长度 ==> 移除项   arr.length = 2;   console.log(arr);      // 输出结果:[ 1, 'tom' ]   //length大于数组原本的长度 ==> 新增项,但是值是undefined   arr.length = 6;      // 由于前面执行了arr.length = 2;故其数组已经改变,执行arr.length = 6;实则新增了四项空项,故输出结果如下   console.log(arr);      // 输出结果:[ 1, 'tom', <4 empty items> ]   console.log(arr[5]);      // 输出结果:undefined // 数组的遍历   // 定义数组   var arr = [5,4,3,2,1];    // 使用for循环遍历数组的值,注意:i不能<=arr.length,如果小于等于,就相当于访问了arr[5];值是undefined   for(var i=0;i<arr.length;i++){     console.log(arr[i]);         }          /* 输出结果:                     5                     4                     3                     2                     1             */ // 模拟push,重构myPush    实现将 原打印数组长度和新数组 变成 打印新数组和原数组   Array.prototype.myPush = function(){     // 创建一个空的 arr 数组     var arr = [];     // 将原来 arr=[1,2] 数组里的值复制到空的 arr 数组里     for(var i=0;i<this.length;i++){       arr[i] = this[i];     }     console.log(arr);      // 输出结果为:[1,2]     var len = arr.length;      // 表示将 arr.length 的值赋值给 len,此时 len=2     for(var key in arguments){       var item = arguments[key];      // 第一次循环表示 item = arguments[0] ,即item = 'terry' 第二次 item = arguments[1] = 'larry' 第三次 item = arguments[2] = 'tom'       arr[len+(+key)] = item;       // 第一次循环表示 arr[2+0] = item,即 arr[2] = 'terry' 第二次 arr[2+1] = arr[3] = 'larry' 第三次 arr[2+2] = arr[4] = 'tom'     }     console.log(arguments);      // 输出结果为:[Arguments] { '0': 'terry', '1': 'larry', '2': 'tom' }     return arr;   }   var arr = [1,2];   var result = arr.myPush("terry","larry","tom")      // 将创建出来的新 arr 数组赋值给 result,调用 myPush 方法将 "terry","larry","tom" 插入到新数组末尾,故原 arr 数组不变   console.log(result,arr);    // 打印 result 即新 arr 数组和原来的 arr 数组,输出结果为: [ 1, 2, 'terry', 'larry', 'tom' ] [ 1, 2 ]   var arr2 = [1,2];   var result2 = arr2.push("terry","larry","tom");    // 将arr 数组赋值给 result2,调用 Push 方法将 "terry","larry","tom" 插入到 arr2 数组末尾,故原 arr2 数组已改变   console.log(result2,arr2);      // 打印 result2 数组长度和原来的 arr2 数组,输出结果为: 5 [ 1, 2, 'terry', 'larry', 'tom' ]