思考一个问题:字符串在js中属于基本数据类型,为什么会有属性呢?
在js中只要引用了字符串s的属性,js就会将字符串值通过new String(s)的方式转换成对象,这个对象继承了字符串的方法,并用来处理属性的引用。一旦引用结束,这个新创建的对象就会销毁(具体实现未必是销毁,表现形式是这样的)
var s = "test"; s.len = 4; var t = len此时的t又是什么值?答案是undefined,因为临时对象并没有保留下来。
存取字符串、数字、布尔值的属性时创建的临时对象,称为包装对象。
注意:null和undefined没有包装对象,访问他们的属性会造成一个类型错误
可以用String()、Number() 、Boolean()构造函数来显示创建包装对象
==运算符将原始值和其包装对象视为相等,但是===运算符将他们视为不等,通过typeof运算符可以看到原始值和其他包装对象的不同。
不可变得原始值和可变的对象引用
js中的原始值(undefined、null、布尔值、数字、和字符串)与对象(包括数组和函数)有着根本区别。
原始值是不可更改的,任何方法都无法更改一个原始值。
var s = "hello"; s.toUpperCase(); s // 'hello' 上面的代码中s的值并没有被修改,只是返回了一个新的字符串。
原始值得比较是值得比较:只有在他们的值相等的时候他们才相等。
对象的比较并非值得比较,而是引用的比较:即使两个对象包含同样的属性及相同的值,他们也是不想等的。当且仅当他们引用同一个基对象时他们才相等。
var a = []; var b = a; b[0] = 1; a[0] // 此时也等于1 a === b //true如果想比较进行两个数组值得比较必须依次比较属性值:
function equalArrays( a, b){ if(a.length != b.length) return false; for( var i = 0; i <a.length; i ++){ if(a[i] !== b[i]){ if( typeof a[i] === "object" && typeof b[i] === "object"){ if( ! equalArrays(a[i], b[i])){ return false; } } else{ return false; } } } return true; }