Javascript核心读书有感之类型、值和变量(8)

这个属性自然不存在,表示结果undefined,这段代码说明了读取字符串、数组和布尔值的属性值(或方法)时,表现的像对象一样,但如果你试图给其属性赋值。则会忽略这个操作;修改只是发生在临时对象身上。而这个临时对象并未保留下来。

需要注意的是,可以通过String(),Number(),Boolean()构造函数来显示创造包装对象:

复制代码 代码如下:


            var s = "test",
                n = 1,
                b = true;
            var S = new String(s);
            var N = new Number(n);
            var B = new Boolean(b);

javascript会在必要的时候将包装转换为原始值,因此上段代码中的对象S N B常常——但不总是——表现的值和s n b一样,"=="等于运算符将原始值和其包装对象视为相等。

但"==="全筹运算符将它们视为不等,通过typeof运算符可以看到原始值和其包装的对象的不同。

7.不可变的原始值和可变的对象引用。

javascript的原始值(undefined null 布尔值 数字和字符串)与对象(包括数组和函数)有着根本的区别,原始值是不可更改的;任何方法都无法(或突变)一个原始值。对数字和布尔值来说显然如此———改变数字的值本身就说不通,而对字符串来说就不那么明显,因为字符串看起来由字符组成的数组。我们期望可以通过指定的索引来修改字符串中的字符。实际上javascript是禁止这样做的。字符串中所有的方法看上去返回了一个修改后的字符串,实际上是返回一个新的字符串。

复制代码 代码如下:


var s = "hello world";
            s.toUpperCase(); //返回"HELLO WORLD"并没更改s的值
            s //=> "hello world" 原始的字符串并未改变

原始值的比较是值的比较,只有在他们的值相当时它们在才相等。这对数字、布尔值、null和undefined来说听起来有点难,并没有其他办法来比较他们。同样,对于字符串来说则不那么明显;如果比较两个单独的字符串,当且仅当他们的长度相等且每个索引的字符都相等时,javascript的才认为相等。

复制代码 代码如下:


var o = {x:1} //定义一个对象
        o.x = 2  //通过修改对象的属性来改变对象
        o.y = 3 //再次更改这个对象,给它增加一个新属性
        var a =[1,2,3] //数组也是可以修改的
        a[0]=0;  //更改数组中的一个元素
        a[3]=4; 给数组增加一个新元素

对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,他们也是不相等的,各个索引元素完全相等的两个数组也不相等

复制代码 代码如下:


   var o ={x:1}, p={x:1}//两个具有相同属性的两个对象
                   o === p ;//=>false 两个单独的对象永不相等( o == p ; =>false)
             var a =[],b=[]; //两个单独的空数组
              a === b ; //=>false两个单独的数组永不相等

我们通常将对象称为引用类型(reference type),以此来和javascript的基本类型区分开来。依照术语的叫法,对象都是引用(reference),对象的比较均是引用的比较;当且当它们应用同一个基对象时,它们才相等。

复制代码 代码如下:


    var a = []; //定义一个引用空数组的变量a
            var b = a; //变量b引用同一个数组
            b[0] = 1;
            a[0] //=>1  变量a也会修改
             a === b //=>true a和b引用同一个数组,因此他们相等。

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

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