var s = "hello world";
console.log(s) //11
思考一个问题:字符串在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;
}