JavaScript进阶:数据类型(2)

定义:在JavaScript中,“一切皆对象”,数组和函数本质上都是对象,就连三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。

通俗来讲:字符串,数值,字符串,这些单身狗看其它人都有对象,非常不爽,所以自己也搞了个对象,名字叫包装。

1.一般来说,只有对象是可以对属性进行读写操作的。但是聪明的骚年,你有没有发现,平时我们用得很多的字符串方法和属性,都是直接通过”.”操作符访问的。比如:

  console.log("hello world".length);
  console.log("this a string".indexOf("a"));

2.其实,在我们调用这些方法和属性时,JS内部已经隐式地帮我们帮创建了一个包装对象了,以上的实际的情形应该是这样的:

  console.log(new String("hello world").length);
  console.log(new String("this a string").indexOf("a"));

3.但是两者还是有区别的,
  区别1:
  浏览器自己隐式创建的包装对象和你显式创建的包装对象不严格相等。简单来说,虽然说表面JS对亲生的与领养的一样,但实际上,亲生的不等于领养的。

    var a1 = "test",
        a2=new String("test");
    console.log(a1 == a2);//true
    console.log(a1 === a2);//false

  区别2:
  隐式创建的包装对象,在使用完后之后就会被抛弃了。简单来说就是,一个大大的负心汉,上完我,就抛弃,还重新去找其他对象。
  拿我们开头的那道题来说:
    test.a = "hello";
  这里隐式创建了一个包装对象,所以这里赋值不会报错。
    console.log(test.a);
  这里之前的包装对象已经被抛弃了,但是使用了"."运算符,所以又创建一个新的包装对象,但是这个对象的属性a并没有赋值,所以属性a的值是undefined。

  说到实际运用中,有的浏览器性能不是很好,比如说低版本IE,当频繁处理字符串时,效率会很低。所以很多时候,我们还不如直接显式地创建包装对象,防止浏览器过多地创建隐式的包  装对象,提升性能。

    //不推荐使用种方法
    var example = "this is a example";  
    //推荐使用这种方法,提升性能。
    var example2 = new String("this is a example");

四、类型检测

  在js中检测类型的方法有很多,比如 typeof、instanceof、Object.prototype.toString、constructor、duck type

  1. typeof 运算符,有两种方式 typeof + 检测目标 或者 typeof (检测目标),该方法适用于基本数据类型和函数的检测(遇到null失效),返回的结果都是字符串

    typeof 100   “number”

    typeof true   “boolean”

    typeof("hello")  "String"

    typeof Function   “Function”

    typeof undefined  “undefined”

    typeof null  “Object”  历史遗留的问题,为了兼容

    typeof NaN  “number”   判断NaN的方法可以用isNaN(NaN)来判断,如果返回true就是NaN

    typeof new Object()   “Object”

    typeof [1,2]   "Object"

    大家可能注意到了,typeof在检测对象类型的时候是无法区分的,此时我们就要用第二种方法instanceof

  2.instanceof运算符(适用于自定义对象或者原生对象数据类型的检测),基于原型链的类型检测

    比如判断一个对象是不是数组: [1,2] instanceof Array 返回 true

    obj instanceof Object   :它期望左操作数obj 是一个对象,如果是一个数字1,2,3或者true,false时就会直接返回false。

                 它期望右操作数是一个函数对象或者是函数构造器,如果不是就会抛出Typeerror异常

    instanceof 工作的一个大概的原理就是它会判断左操作数这样一个对象的原型链上是否有右边这个构造函数的prototype属性

    我们举一个例子:

      function Person(){}

      function Student(){}

      Student.prototype = new Person();

      Student.protype.constructor = Student

      var a = new Person();

      var b = new Student();

      -----------------------------------------

      a instanceof Person   // true

      b instanceof Student   //true

      a instanceof Student   //false

      b instanceof Person   //true

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c669a1cc2de065607fc7c582da430731.html