js中的原始值和包装对象

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值