面向对象04

Array.isArray()方法

作用:判断某个对象是否是数组
语法:Array.isArray(对象),返回值为布尔值

注意点:兼容性问题(ES5)

面试题

    var o = {};
    var a ={};
    var b = {name:"张三"};

    o["a"] = "Test-a";
    o["b"] = "Test-b";
    o[b] = "Demo-b";
    o[a] = "Demo-a";

    console.log(o.a);      //  Test-a
    console.log(o.b);      //  Test-b
    console.log(o[a]);     //  Demo-a
    console.log(o[b]);     //  Demo-a
    console.log(o["a"]);   // Test-a
    console.log(o["b"]);   //  Test-b

    var arr1= [1,2,3];
    console.log( arr1.toString());  //字符串类型的1,2,3
    var func = function () {

    };

    console.log(typeof func.toString()); //string
    console.log(a.toString());   //[object Object]  [类型 构造函数]
    console.log(b.toString());  //[object Object] 
    console.log(o);
 当使用[]访问属性的时候,属性是字符串,如果属性不是字符串,会将    属性当做变量来处理,当变量的值为数组,会将数组的值转换成字符串样式;当变量的值为函数,会将函数转换成字符串样式的函数;当变量为对象,会将对象的值都转换为[object Object] 的字符串,以上皆默认使用toString方法

在使用[]语法设置对象的时候:

  • []中存放的是字符串,那么这个字符串就直接作为key
  • []中存放的不是字符串,那么就把[]中部分当成一个变量来处理,查找最近变量,获取其值,如果对应的值是字符串,那么就直接作为key;如果对应的值是对象,那么就尝试把这个对象转换为字符串(toString)

toString:
返回的是对当前对象的字符串描述。

Array.isArray()方法兼容性问题

思路:根据上述面试题,能否借用Object的原型对象上的toString方法将数组转换成[object Array] ,由此来判断是否是数组

代码示例

    var arr1 = [1,2,3];
    console.log(Object.prototype.toString.call(arr1));   //[object Array]
    var date = new Date();
    console.log(typeof date);         //[object Date]
    console.log(Object.prototype.toString.call(function () {
        
    }));                               //[object Function]
    //由以上代码执行的结果可以判断,借用Object的原型对象上的toString方法可以将对象转换成[object 构造函数]的字符串形式,从中可以观察到对象的构造函数 ,进而我们可以通过这个方法来判断是否是数组
    if (typeof Array.isArray !=‘function’){

    Array.isArray=function(arr){
    return Object.prototype.toString.call(arr)=='[object Array] ';
      }

    }

instanceOf补充

作用:
01 检查某个对象是否由某个构造函数创建出来的;
02 检查该对象的构造函数的原型对象是否在该对象的原型链上;

代码示例

    function Person() {

    }

    var p1 = new Person();
    console.log(p1 instanceof Person);  //true
    Person.prototype = {};      //原型对象被替换,
    console.log(p1 instanceof Person);  //false

基本包装类型

  • String
  • Number
  • Boolean

基本包装类型创建对象

  • new String/Number/Boolean()
  • new Object('字符串' | 数值 | 布尔类型的值)
  • Object('字符串' | 数值 | 布尔类型的值)
    注意:new Object()与Object()会根据传入的参数,内部会做一个判断来创建字符串对象/数值对象/布尔类型的对象

注意:通过构造函数()方法创建的不是对象,是基本数据类型的值(除了Object)

  var str1 = new String("demo01");
    var str2 = "demo01";
    var str3 = new Object("demo01");
    var str4 = Object("demo01");
    var str5 = String("demo01");  //字符串还是字符串对象?注意,通过构造函数()方法创建的不是对象,是基本数据类型的值

    console.log(typeof str1, typeof str2,typeof str3,typeof str4); //
    console.log(typeof str5);    //string

    var num1 = new Number(1);
    var num2 = 1;
    var num3 = new Object(1);
    console.log(typeof num1, typeof num2,typeof  num3);

    var bool1 = new Boolean(true);
    console.log(bool1);
    var bool2 = true;
    console.log(typeof bool1, typeof bool2);

基本包装类型注意点

  • 比较,等于与全等于
    var str1 = new String("demo01");  //ox11
    var str2 = "demo01";
    var str3 = new Object("demo01");  //0x22
    var str4 = Object("demo01");
    var str5 = String("demo01");  //字符串还是字符串对象?
    var str6 = "demo01";

    console.log(str2 == str6); //true  两个都是基本类型的值在比较的时候比较内容(demo01)
    console.log(str1 == str2); //true  类型不一样,内部有隐式的转换(对象.valueOf)
    console.log(str1 == str3); //false,存储的内容是地址
  • 基本类型的数据也可以访问属性和方法
var str01 = "string01";
    console.log(str01.length);   //8
    //var tmp = new String(str01);
    //tmp.length  ==>8
    //tmp = null;

    console.log(str01.substr(1, 2)); //tr
    var str02 = new String("sting02");
    str02.name = "默认的name";
    console.log(str02.name);   //默认的name

    str01.name = "测试的名称";
    console.log(str01.name);  //undefined

实际上,每当读取一个基本数据类型的值,后台就会创建一个对应基本包装类型的对象,从而能够使基本数据调用一些方法。

引用类型与基本包装类型的主要区别就在于对象的生命周期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,只存在于这一行代码的执行期(瞬间),然后立即销毁。这就意味着我们不能在运行时为基本数据类型添加属性和方法。

Number使用注意


你可能感兴趣的:(面向对象04)