浅谈JavaScript中的string拥有方法的原因
JavaScript中的String类型与基本包装类型
在JavaScript中,我们知道数据类型分为基本类型和引用类型。基本类型包括Undefined、Null、Boolean、Number和String,这些类型的值是保存在栈内存中的简单数据段,是按值访问的。而引用类型主要是Object、Array、Function等,它们的值是保存在堆内存中的对象,是按引用访问的。对象可以拥有属性和方法,但为什么基本类型String也能拥有方法呢?这背后的原因,便是基本包装类型。
当我们尝试对字符串调用方法时,JavaScript会自动为字符串创建一个String对象(基本包装类型),在这个对象上调用方法,然后返回结果。这个过程就像是为基本类型值提供了一个临时的包装对象,让这个值能够像对象一样拥有方法。这个包装对象是临时的,一旦方法调用结束,这个包装对象就会被销毁。这就是为什么我们不能给基本类型值添加自定义属性和方法的原因。
举个例子,当我们执行如下代码:
```javascript
var realMessage = "Said I love you but I lied";
var myMessage = realMessage.substring(5, 15);
console.log(myMessage); // "I love you"
```
在这个过程中,JavaScript为我们做了以下事情:首先创建了一个String对象,然后在该对象上调用了substring方法,最后销毁了该对象。虽然我们的原始字符串realMessage没有改变,但我们可以通过调用方法来获取一个新的字符串。这就是基本包装类型的魔力所在。
要注意的是,基本包装类型的这种“临时”特性决定了我们不能在基本类型值上添加自定义属性和方法。例如:
```javascript
var me = "sunjing";
me.age = 18;
console.log(me.age); // undefined
```
尽管我们在字符串me上尝试添加了age属性,但由于基本包装类型的临时性,这个属性并不会持久存在。当我们为me赋值时,重新创建了一个新的String对象,这个新的对象并没有age属性。当我们试图访问me的age属性时,结果是undefined。所以我们可以说基本包装类型是“一次性”的,方法调用结束后就会被销毁。这种设计保证了基本类型值的不可变性,也简化了JavaScript的内存管理。基本包装类型与JavaScript中的String方法
在JavaScript中,基本包装类型如String、Number和Boolean,为我们操作这些基本类型提供了极大的便利。当我们读取这些基本类型的值时,后台会自动创建相应的包装类型实例,这些实例可以调用特定的方法,并在使用后立即销毁。这种短暂的生命周期决定了我们不能为基本类型添加自定义的属性和方法。
让我们深入一下JavaScript中的String类。除了后台自动创建String实例外,我们也能显式地创建。例如:
```javascript
var str = new String("hello");
var str2 = str.toUpperCase(); // str2的值为"HELLO"
```
当我们自己创建String实例时,与后台自动创建的实例有所不同。例如:
```javascript
var str1 = new String("hello"); // str1是一个对象
var str2 = "hello"; // str2是一个原始字符串类型
typeof str1 // 返回"object"
typeof str2 // 返回"string"
```
接下来,让我们聚焦于String类中的subString()方法和slice()方法。这两个方法在某些方面非常相似,它们都可以返回字符串的子串,接受一个或两个参数,表示子串的起始和终止位置。它们的用法和返回结果基本相同,例如:
```javascript
var strObj = new String("hello world");
alert(strObj.slice(3)); // 输出结果"ol world"
alert(strObj.subString(3)); // 输出结果也是"ol world"
```
尽管这两个方法的输出结果看起来完全相同,但它们在某些特定情况下处理参数的方式有所不同。特别是当参数为负数时,slice()方法会用字符串的长度加上参数,而subString()方法则将负参数视为0。例如:
```javascript
var strObj = new String("hello world");
alert(strObj.slice(-3)); // 输出结果"rld"
alert(strObj.subString(-3)); // 输出结果仍为整个字符串"hello world"
```
虽然slice()和subString()方法在大多数情况下表现相似,但在处理负参数时有所不同。理解这些差异有助于我们更有效地使用这些方法,从而更灵活地操作字符串。希望这些分享能加深你对JavaScript中基本包装类型和String方法的了解。
编程语言
- 浅谈JavaScript中的string拥有方法的原因
- AJAX应用中必须要掌握的重点知识(分享)
- ASP.NET防范SQL注入式攻击的方法
- JQuery手速测试小游戏实现思路详解
- js 判断各种数据类型的简单方法(推荐)
- 解读Bootstrap v4 sass设计
- PHP代码加密的方法总结
- asp.net导出excel数据的常见方法汇总
- Vue+axios实现统一接口管理的方法
- 以jQuery中$.Deferred对象为例讲解promise对象是如何处
- js实现按钮控制带有停顿效果的图片滚动
- 超精准的javascript验证身份证号的方法
- 如何编写适合FireFox的对话框?
- ubbcode简单实用
- PHP MYSQL实现登陆和模糊查询两大功能
- 修改PHP脚本使WordPress拦截垃圾评论的方法示例