javascript标准对象与包装对象

标准对象

在JavaScript的世界里,一切都是对象。

但是某些对象还是和其他对象不太一样。为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串:

typeof 123; // ‘number‘ typeof NaN; // ‘number‘ typeof ‘str‘; // ‘string‘ typeof true; // ‘boolean‘ typeof undefined; // ‘undefined‘ typeof Math.abs; // ‘function‘ typeof null; // ‘object‘ typeof []; // ‘object‘ typeof {}; // ‘object‘

可见,number、string、boolean、function和undefined有别于其他类型。特别注意null的类型是object,Array的类型也是object,如果我们用typeof将无法区分出null、Array和通常意义上的object——{}。

包装对象

除了这些类型外,JavaScript还提供了包装对象,熟悉Java的小伙伴肯定很清楚int和Integer这种暧昧关系。

number、boolean和string都有包装对象。没错,在JavaScript中,字符串也区分string类型和它的包装类型。包装对象用new创建:

var n = new Number(123); // 123,生成了新的包装类型 var b = new Boolean(true); // true,生成了新的包装类型 var s = new String(‘str‘); // ‘str‘,生成了新的包装类型

虽然包装对象看上去和原来的值一模一样,显示出来也是一模一样,但他们的类型已经变为object了!所以,包装对象和原始值用===比较会返回false:

typeof new Number(123); // ‘object‘ new Number(123) === 123; // false typeof new Boolean(true); // ‘object‘ new Boolean(true) === true; // false typeof new String(‘str‘); // ‘object‘ new String(‘str‘) === ‘str‘; // false

所以闲的蛋疼也不要使用包装对象!尤其是针对string类型!!!

如果我们在使用Number、Boolean和String时,没有写new会发生什么情况?

此时,Number()、Boolean和String()被当做普通函数,把任何类型的数据转换为number、boolean和string类型(注意不是其包装类型):

var n = Number(‘123‘); // 123,相当于parseInt()或parseFloat() typeof n; // ‘number‘ var b = Boolean(‘true‘); // true typeof b; // ‘boolean‘ var b2 = Boolean(‘false‘); // true! ‘false‘字符串转换结果为true!因为它是非空字符串! var b3 = Boolean(‘‘); // false var s = String(123.45); // ‘123.45‘ typeof s; // ‘string‘

是不是感觉头大了?这就是JavaScript特有的催眠魅力!

总结一下,有这么几条规则需要遵守:

  • 不要使用new Number()、new Boolean()、new String()创建包装对象;
  • 用parseInt()或parseFloat()来转换任意类型到number;
  • 用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
  • 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...};
  • typeof操作符可以判断出number、boolean、string、function和undefined;
  • 判断Array要使用Array.isArray(arr);
  • 判断null请使用myVar === null;
  • 判断某个全局变量是否存在用typeof window.myVar === ‘undefined‘;
  • 函数内部判断某个变量是否存在用typeof myVar === ‘undefined‘。

最后有细心的同学指出,任何对象都有toString()方法吗?null和undefined就没有!确实如此,这两个特殊值要除外,虽然null还伪装成了object类型。

更细心的同学指出,number对象调用toString()报SyntaxError:

123.toString(); // SyntaxError

遇到这种情况,要特殊处理一下:

123..toString(); // ‘123‘, 注意是两个点!
(123).toString(); // ‘123‘

不要问为什么,这就是JavaScript代码的乐趣!

时间: 2024-12-22 00:30:54

javascript标准对象与包装对象的相关文章

浅谈javascript中的包装对象

javascript中的对象类型分为内置类型和对象类型,其中内置类型包括sting number boolean null undefined五种:对象类型包括Array Function regExp Date 等等,统称为Object类型.我们知道在一个对象中包含一系列属性名/属性值的集合,可以通过"."来访问对象的属性或方法,如: 1 window.onload=function(){//可执行代码} 但我们常常可以看到这样的代码: 1 var str="hello w

javascript之包装对象

var s = "hello world!";             var word = s.substring(s.indexOf(" ")+1,s.length); 字符串既然不是对象,为什么它会有属性呢?只要引用了字符串s的属性,javascript就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用.一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而

javascript类型系统——包装对象

× 目录 [1]定义 [2]生存期 [3]显式创建[4]转型函数[5]比较运算 前面的话 javascript对象是一种复合值,它是属性或已命名值的集合.通过'.'符号来引用属性值.当属性值是一个函数时,称其为方法.通过o.m()来调用对象o中的方法.我们发现,字符串也同样具有属性和方法 var s = 'hello world'; console.log(s.length);//11 字符串既然不是对象,为什么它会有属性呢?这就引出了今天介绍的内容——包装对象 定义 包装对象是特殊的引用类型.

Javascript中让人迷惑的一些基本数据类型跟内置包装对象

数据类型跟对象的区别: 基本的数据类型是没有 属性 和 方法的,但是对象有:就像是java中的基本数据类型跟引用类型一样: 看个例子: var s= "      xxxx" var xxxx=s.substring(s.lastIndexOf(" ")+1,s.length); 首先得明白在js中字符串可是基本类型,与数字类型一样.对比java,它的基本类型会有这种方法调用么?当然没有.java的String可是个对象,才能这么调.换成是int肯定不行. 我们可以

JavaScript包装对象(转)

转自:http://www.cnblogs.com/dolphinX/p/3280340.html JavaScript是面向对象的语言,使用”.”操作符可以访问对象的属性和方法,而对于基本类型(null, undefined, bool, number, string)应该是值类型,没有属性和方法,然而 var s='this is a string'; alert(s.length); alert(s.indexOf('is')); 结果很简单,但是仔细想想还真奇怪,string不是值类型吗

JavaScript基础学习之-JavaScript权威指南-3.6包装对象

JavaScript对象是一种复合值,是已知属性或是命名值的集合. 我们看到字符串也同样有属性和方法. var s = "Test"; var len=s.length; 我们知道在JavaScript中像上面这样声明的字符串不是对象,但既然这里的s不是对象,为什么会有length的属性呢? 原因是在JavaScript中只要引用了字符串(数字.布尔值也是一样的)的属性,JS就会将字符串通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引

javascript包装对象

  javascript对象是一种复合值,它是属性或已命名的值的集合,通过符号"."来引用属性值,当属性值是一个函数的时候,我们称之为方法.我们看到字符串也具有属性和方法: var s="hello,world!"; var word=s.substring(s.indexof("")+1,s.length); 字符串既然不是对象,为什么它又有属性呢,只要引用了字符串s的属性,javascript就会将字符串值通过调用new String(s)的

包装对象——JavaScript中原始类型拥有属性的原因

我们先看段代码: var s = "Test"; var len=s.length; 我们知道在JavaScript中像上面这样声明的字符串不是对象,但既然这里的s不是对象,为什么会有length的属性呢? 原因是在JavaScript中只要引用了字符串(数字.布尔值也是一样的)的属性,JS就会将字符串通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用.一旦属性引用结束,这个新创建的对象就会销毁(真实实现并不一定是这样,但整个过程看起

__x__(75)1012第十三天__ JavaScript 包装对象

包装对象 所谓“包装对象”,就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象 这三个原生对象可以把原始类型的值变成(包装成)对象 var v1 = new Number(123); var v2 = new String('abc'); var v3 = new Boolean(true); typeof v1 // "object" typeof v2 // "object" typeof v3 // "obj