String调用Array相关方法——有点古怪

这个系列的前面几篇文章中有谈到在一个Object上使用apply、call等方法操作另一个Object的方法,今天我们来学习怎么样在String上调用Array相关方法。 在许多方面,字符串表现的好像字符数组,许多Javascript array相关方法也可以使用在String类型上,但是并不是所有的方法都可以。看下面示例:

var name = "Benjamin";

//Outputs: TypeError: [].push.call(...) is read-only
[].push.call(name, "is my name");

报错:提示Javascript中字符串是只读的,因此任何方法想改变字符串都将失败,因此可以排除掉数组的push、pop、shift、unshift、splice方法。 但是仍有一些数组的方法是可以使用在字符串上的,看下例:

var name = "Benjamin";

var res01 = [].some.call(name, function(val, index, arr) {
	//Outputs:String {0: "B", 1: "e", 2: "n", 3: "j", 4: "a", 5: "m", 6: "i", 7: "n", length: 8}
	console.log(arr);
	return val === "B";
});

var res02 = [].every.call(name, function(val, index, arr) {
	return val === "B";
});

var res03 = [].filter.call(name, function(val, index, arr) {
	return val < "e";
});

//Outputs: true
console.log(res01);

//Outputs: false
console.log(res02);

//Outputs: ["B", "a"]
console.log(res03);

详细了解some,every,filter方法的使用,请戳:Javascript Array.prototype.some()Javascript Array.prototype.every()Javascript Array.prototype.filter(),在字符串上操作数组方法是不是感觉挺棒的,但是大家要注意到filter方法返回的是一个数组,而不是一个字符串,而arr的输出值为一个json对象。但是细细想想,这也是有道理的,call和apply方法不会改变函数的逻辑,只改变它操作的值。 但是如果上例的filter方法需要我们返回字符串,我们可以使用链式操作:

var name = "Benjamin";

var res03 = [].filter.call(name, function(val, index, arr) {
	return val < "e";
}).join("");

//Outputs: ["B", "a"]
console.log(res03);

从上面来看,String是不能操作Array上的某些方法,但是我们该如何解决呢?解决此问题有一个相当简单的方式:我们可以先把字符串转换为字符数组,然后再转换为字符串。

var name  = "Benjamin",
	//TypeError: [].reverse.call(...) is read-only
	//res01 = [].reverse.call(name),
	res02 = [].slice.call(name).reverse().join("");

//Outputs: ["B", "e", "n", "j", "a", "m", "i", "n"]
console.log([].slice.call(name));

//Outputs: ["n", "i", "m", "a", "j", "n", "e", "B"]
console.log([].slice.call(name).reverse());

//console.log(res01);

// Outputs: nimajneB
console.log(res02);

res01处如果放开也会报read-only错误,关于slice方法的使用看看MDN的描述:

slice 不修改原数组,只会返回一个包含了原数组中提取的部分元素的一个新数组。原数组的元素会按照下述规则被拷贝("一级深拷贝"[one level deep]规则):

如果该元素是个对象引用 (不是实际的对象),slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。

如果被引用的对象发生改变,则改变将反应到新的和原来的数组中。 对于字符串和数字来说(不是 String 和 Number 对象),slice 会拷贝字符串和数字到新的数组里。在一个数组里修改这些字符串或数字,不会影响另一个数组。

如果向两个数组任一中添加了新元素,则另一个不会受到影响。

我们直接使用[].reverse.call转换没有成功,而借助slice方法来转换成字符串数组,并对其使用revserse方法,然后使用join方法再转换为字符串。 从上面的描述,有么有感觉到在String上使用Array的相关方法有点古怪,小陌生,但同时也可以很强大。希望本文简短的介绍对你在日常开发中有所帮助。 感谢您的阅读,文中不妥之处还望批评指正。如果你感觉本文对你有所帮助,请点赞!

时间: 2024-11-06 06:36:41

String调用Array相关方法——有点古怪的相关文章

String,Array等原生引用对象prototype问题(打X未解决,打勾已解决)

1.2014年6月29日 10:51:44    原型模式     疑问一:    String类型中,动态为其加入函数时候,可以通过String.prototype.[[functionname]] = function(){}方式或者直接string.[[functionname]] = function(){},但是遇到了一个问题,当创建一个实例时,只有前者可以运行,后者报错找不到该方法,如:var msg = 'hello world' ; msg.[[functionname]] ; 

String和Array的常用方法

String和Array几个常用方法需要掌握: String: slice(start, end):提取字符串的片断,并在新的字符串中返回被提取的部分.不包括end所在的字符,参数可以为负数,返回值:一个新的字符串 substr(start,length):从起始索引号提取字符串中指定数目的字符.index可以为负数,length可选返回长度,返回值:一个新的字符串 substring(start,stop):提取字符串中两个指定的索引号之间的字符.参数不能为负数,返回值:一个新的字符串 spl

Javascript中String、Array常用方法介绍

string和array作为javascript内置对象,其中许多方法无论是在开发过程中,还是在面试的时候都有机会被面试官问到,这里对经常用到的方法做一个介绍,这些方法都有过很多的实际应用场景,所以对它们的掌握还是非常有必要的. 1.Array数组常用方法? 先创建一个数组var abc = [1,2,3,4,5,6,7,8,9]; (1)pop(); 这个方法会删除数组的最后一项并返回删除掉的值. 比如:console.log(abc.pop());//9;    console.log(ab

速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 数据类型 bool, int, float, string, object, array 示例1.数据类型: bool, int, float, string, objectbasic/type1.php <?php /** * 数据类型: bool, int, float, string, object */ // 布尔类型(true, false 不分大小写) $b = true; if ($b) { echo "true&

string和array变量用到的那些函数(上)

在js中,字符串(string)和数组(array)是常用到的变量,js中也为这2种变量提供了各种强大的函数. 如果能较好的运用这些函数,在进行算法计算时可以说是事半功倍,但作为初学者,我们常常对这些函数感到眼花缭乱,下面将对string和array中常用到的函数进行盘点和比较. 一.string变量和array变量之间的转换      1)stringObject.split(separator,howmany); 作用:以separator为分割条件,用于将一个字符串分割为有howmany个

内置对象(Date String Math Array)

什么是对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方法:能够在对象上执行的动作.例如,表单的"提交"(Submit),时间的"获取"(getYear)等: JavaScript 提供多个内建对象,比如 String.Date.Array 等等,使用对象前先定义,如下使用数组对象: var objectName =new Ar

string和array变量用到的那些函数(下)

三.Array变量函数     1)arrayObjecr.push(newelement1,newelement2,... ...);         作用:向指定的数组对象的末尾添加一个或多个元素.该方法直接修改原数组,并返回新数组的长度. 该功能与arrayObject.unshift(newelement1,... ...)相对应.后者依次在数组的头部添加元素. 举例: <script> var arr = ["I","am","a&q

js内置对象,Date,String,Array知识点

1.Date Data对象中处理时间和日期的常用方法: (1)获取当前时间: 例:var d=new Date() 返回值为: (2)get/setYear() 返回/设置当前年份(两位数) (3)get/setFullYear() :返回/设置当前年份(四位数) (4)get/setMonth() :返回/设置当前月份 (0-11 0-月份 11-十二月) (5)get/setDate() :返回/设置日期,XX日(1-31) (6)get/setDay() :返回/设置星期(0-6 , 0:

LeetCode: Reverse Words in a String &amp;&amp; Rotate Array

Title: Given an input string, reverse the string word by word. For example,Given s = "the sky is blue",return "blue is sky the". https://leetcode.com/problems/reverse-words-in-a-string/ 思路:先将字符串全部逆转,在将每个单词逆转.具体实现,要注意空格,所以对字符串倒过来处理. cla