JavaScript 对象是一种复合值:它是属性或已命名值的集合。通过“.”符号来引用属性值。当属性值是一个函数的时候,称其为方法。通过o.m()
来调用对象o中的方法。
我们看到字符串也同样具有属性和方法:
| var s = "hello world!"; |
| var word = s.substring(s.indexOf(" ")+1, s.length); |
字符串既然不是对象,为什么它会有属性呢?只要引用了字符串 s 的属性,JavaScript 就会将字符串值通过调用new String(s)
的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样)。
同字符串一样,数字和布尔值也具有各自的方法:通过Number()
和Boolean()
构造函数创建一个临时对象,这些方法的调用均是来自于这个临时对象。null 和 undefined 没有包装对象:访问它们的属性会造成一个类型错误。
看如下代码,思考它们的执行结果:
| var s = "test"; |
| s.len = 4; |
| var t = s.len; |
| var s = "test"; |
| s.len = 4; |
| var t = s.len; |
| console.log("输出s字符串:"); |
| console.log(s); |
| console.log(""); |
| console.log("输出s.len属性:"); |
| console.log(s.len); |
| console.log(""); |
| console.log("输出t变量:"); |
| console.log(t); |
| [Running] node "e:\HMV\JavaScript\JavaScript.js" |
| 输出s字符串: |
| test |
| |
| 输出s.len属性: |
| undefined |
| |
| 输出t变量: |
| undefined |
| |
| [Done] exited with code=0 in 0.181 seconds |
当运行这段代码时,t 的值是 undefined。第二行代码创建一个临时字符串对象,并给其 len 属性赋值为 4,随即销毁这个对象。第三行通过原始的(没有被修改过)字符串值创建一个新字符串对象,尝试读取其 len 属性,这个属性自然不存在,表达式求值结果为 undefined。这段代码说明了在读取字符串、数字和布尔值的属性值(或方法)的时候,表现的像对象一样。但如果你试图给其属性赋值,则会忽略这个操作:修改只是发生在临时对象身上,而这个临时对象并未继续保留下来。
存取字符串、数字或布尔值的属性时创建的临时对象称做包装对象,它只是偶尔用来区分字符串值和字符串对象、数字和数值对象以及布尔值和布尔对象。通常,包装对象只是被看做是一种实现细节,而不用特别关注。由于字符串、数字和布尔值的属性都是只读的,并且不能给它们定义新属性,因此你需要明白它们是有别于对象的。
需要注意的是,可通过String()
,Number()
或Boolean()
构造函数来显式创建包装对象:
| var s = "test", n = 1, b = true; |
| var S = new String(s); |
| var N = new Number(n); |
| var B = new Boolean(b); |
| var s = "test", n = 1, b = true; |
| var S = new String(s); |
| var N = new Number(n); |
| var B = new Boolean(b); |
| console.log("输出字符串s:"); |
| console.log(s); |
| console.log(""); |
| console.log("输出字符串对象S:"); |
| console.log(S); |
| console.log(""); |
| console.log("输出数值对象N:"); |
| console.log(N); |
| console.log(""); |
| console.log("输出布尔对象B:"); |
| console.log(B); |
| [Running] node "e:\HMV\JavaScript\JavaScript.js" |
| 输出字符串s: |
| test |
| |
| 输出字符串对象S: |
| [String: 'test'] |
| |
| 输出数值对象N: |
| [Number: 1] |
| |
| 输出布尔对象B: |
| [Boolean: true] |
| |
| [Done] exited with code=0 in 0.195 seconds |
JavaScript 会在必要时将包装对象转换成原始值,因此上段代码中的对象S、N和B常 常一一但不总是——表现的和值s、n和b一样。"==
”等于运算符将原始值和其包装对象视为相等,但“===
”全等运算符将它们视为不等。
| var s = "test", n = 1, b = true; |
| var S = new String(s); |
| var N = new Number(n); |
| var B = new Boolean(b); |
| console.log("判断字符串和字符串对象是否相等:"); |
| console.log(s == S); |
| console.log(""); |
| console.log("判断字符串和字符串对象是否严格相等:"); |
| console.log(s === S); |
| console.log(""); |
| console.log("判断数字和数值对象是否相等:"); |
| console.log(n == N); |
| console.log(""); |
| console.log("判断数字和数值对象是否严格相等:"); |
| console.log(n === N); |
| console.log(""); |
| console.log("判断布尔值和布尔对象是否相等:"); |
| console.log(b == B); |
| console.log(""); |
| console.log("判断布尔值和布尔对象是否严格相等:"); |
| console.log(b === B); |
| [Running] node "e:\HMV\JavaScript\JavaScript.js" |
| 判断字符串和字符串对象是否相等: |
| true |
| |
| 判断字符串和字符串对象是否严格相等: |
| false |
| |
| 判断数字和数值对象是否相等: |
| true |
| |
| 判断数字和数值对象是否严格相等: |
| false |
| |
| 判断布尔值和布尔对象是否相等: |
| true |
| |
| 判断布尔值和布尔对象是否严格相等: |
| false |
| |
| [Done] exited with code=0 in 0.196 seconds |
通过 typeof 运算符可以看到原始值和其包装对象的不同。
| var s = "test", n = 1, b = true; |
| var S = new String(s); |
| var N = new Number(n); |
| var B = new Boolean(b); |
| console.log("判断s的数据类型:"); |
| console.log(typeof s); |
| console.log(""); |
| console.log("判断S的数据类型:"); |
| console.log(typeof S); |
| console.log(""); |
| console.log("判断n的数据类型:"); |
| console.log(typeof n); |
| console.log(""); |
| console.log("判断N的数据类型:"); |
| console.log(typeof N); |
| console.log(""); |
| console.log("判断b的数据类型:"); |
| console.log(typeof b); |
| console.log(""); |
| console.log("判断B的数据类型:"); |
| console.log(typeof B); |
| [Running] node "e:\HMV\JavaScript\JavaScript.js" |
| 判断s的数据类型: |
| string |
| |
| 判断S的数据类型: |
| object |
| |
| 判断n的数据类型: |
| number |
| |
| 判断N的数据类型: |
| object |
| |
| 判断b的数据类型: |
| boolean |
| |
| 判断B的数据类型: |
| object |
| |
| [Done] exited with code=0 in 0.189 seconds |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?