js中的原始值和包装对象

xiaoxiao2021-02-28  101

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

转载请注明原文地址: https://www.6miu.com/read-30400.html

最新回复(0)