这个属性自然不存在,表示结果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引用同一个数组,因此他们相等。