javascript类型转换分析(Effective javascript笔记)

来源:互联网 发布:淘宝账户怎么修改名字 编辑:程序博客网 时间:2024/05/21 21:01
基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象(Array,Object)。

在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。

有5种基本数据类型值:Undefined、Null、Boolean、Number和String。这5种基本数据类型是按值访问的(但是不可以改变他们的值),因为可以操作保存在变量中的实际的值。

引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。早操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

在此我列举2个Example,虽然很小,但很能说明问题,用心看,和思考

1 复制基本类型变量值

   在从一个变量向另一个变量复制基本类型值和引用类型值时,也存在不同。如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。来看一个例子:
var num1=5;
var num2 = num1;
在此,num1中保存的值是5.当使用num1的值来初始化num2时,num2中也保存了值5.但是这里要注意的一点是,num2中的5与num1中的5是完全独立的,该值只是num1中5的一个副本。此后,这两个变量可以参与任何操作而不会相互影响

2 复制引用类型变量值
   当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量,具体列子如下:

var obj1 = new Object();
var obj2 = obj1;
obj1.name= "Nicholas";
alert(obj2.name)           // "Nicholas"

这之后还要注意的一点就是ECMAScript中所有函数的参数都是按值传递的。




到这里就可以引入一些原型的概念了,简而言之,因为对象是引用类型,为此,引用类型的值是按引用类型访问的。
所以当我们想在继承一个对象的基础上还能实现与原有对象的隔离(sperate),我们就需要使用prototype属性!

方法如下:

function cloneObject(obj)
{
      var clone = function() {};
      clone.prototype = obj;
      return new clone();
}
因为每个构造函数的实例中都会有一个内部属性[prop],它是一个指针,指向对象的原型链(prototype)。

今天还学习了NAN(Not a Number) ,有一个标准把它定义为不等于自身,判定该方法可以封装为:

 function isReallYNaN(x){
   if(x!==x){
       return true;
    }
}