这个系列的前面几篇文章中有谈到在一个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的相关方法有点古怪,小陌生,但同时也可以很强大。希望本文简短的介绍对你在日常开发中有所帮助。 感谢您的阅读,文中不妥之处还望批评指正。如果你感觉本文对你有所帮助,请点赞!

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

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

    [源码下载] 速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array 作者:webabcd 介绍速战速决 之 PHP 数据类型 boo ...

  2. Object、Function、String、Array原生对象扩展方法

    JavaScript原生对象的api有些情况下使用并不方便,考虑扩展基于Object.Function.String.Array扩展,参考了prototype.js的部分实现,做了提取和修改,分享下: ...

  3. Javascript中String、Array常用方法介绍

    string和array作为javascript内置对象,其中许多方法无论是在开发过程中,还是在面试的时候都有机会被面试官问到,这里对经常用到的方法做一个介绍,这些方法都有过很多的实际应用场景,所以对 ...

  4. [Swift通天遁地]五、高级扩展-(6)对基本类型:Int、String、Array、Dictionary、Date的扩展

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. JavaScript---网络编程(3)-Object、String、Array对象和prototype属性

    本节学习JavaScript的对象和方法(函数)~ Object 对象 提供所有 JScript 对象通用的功能. obj = new Object([value]) 参数 obj 必选项.要赋值为 ...

  6. JavaScript之Number、String、Array常用属性与方法手册

    Number isFinite函数 Number.isFinite() 方法用来检测传入的参数是否是一个有穷数(finite number). 语法: Number.isFinite(value) 例 ...

  7. JS中String与Array的一些常用方法

    真是恨透了这些类似于substring substr slice 要么长得像,要么就功能相近的方法... 1⃣️string 1.substring(start开始位置的索引,end结束位置索引) 截 ...

  8. Cracking the Coding Interview(String and array)

    1.1实现一个算法判断一个字符串是否存在重复字符.如果不能利用另外的数据结构又该如何实现? My solution: /** *利用类似一个hash table的计数 *然后检查这个hash tabl ...

  9. 内置对象(Math、Date、String、Array、基本包装类型)

    一.内置对象 js中三种对象:内置对象.自定义对象.浏览器对象 实例对象是指通过构造函数创建出来,然后实例化的对象(new关键字) 静态对象是指不需要创建,直接调用的对象,可以在整个JS里调用的公共对 ...

随机推荐

  1. Java-Runoob-高级教程-实例-字符串:06. Java 实例 - 字符串查找

    ylbtech-Java-Runoob-高级教程-实例-字符串:06. Java 实例 - 字符串查找 1.返回顶部 1. Java 实例 - 字符串搜索  Java 实例 以下实例使用了 Strin ...

  2. innodb引擎对自增字段(auto_increment)的处理

    原文地址:https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increme ...

  3. jQuery ajax 当async为false时解决同步操作失败的问题

    jQuery的ajax,当async为false时,同步操作失败.解决方案,jqueryasync 最近做项目遇到jQuery的ajax,当async为false时,同步操作失败的问题,上网搜索下,得 ...

  4. MySql-5.7.17 -winx64的安装配置

    一.下载软件 1. 进入mysql官网,登陆自己的Oracle账号(没有账号的自己注册一个),下载Mysql-5.7.17,下载地址:http://dev.mysql.com/downloads/my ...

  5. 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?

    ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断 ...

  6. 温故而知新-XML和WEB服务器

    1 xml除了空元素外都是有开始标记和结束标记的 2 XML可以设置自己的标记

  7. MPI n 体问题

    ▶ <并行程序设计导论>第六章中讨论了 n 体问题,分别使用了 MPI,Pthreads,OpenMP 来进行实现,这里是 MPI 的代码,分为基本算法和简化算法(引力计算量为基本算法的一 ...

  8. Cmder的安装

    Cmder把conemu,git-for-windows和clink打包在一起,让你无需配置就能使用一个真正干净的Linux终端!性感的外观,强大的功能!代替了Windows原生的Cmd 1. 安裝 ...

  9. Redis Windows环境安装

    1.下载Windows 版本 Redis: https://github.com/ServiceStack/redis-windows 2. 解压文件: F:\开源代码学习\01_Redis 打开 目 ...

  10. MobaXterm 错行,乱码

    最近使用MobaXterm ssh,发现进入ssh显示中文没问题.但如果用VIM编辑文件时如果有中文,修改插入操作有时就会有串行乱码情况,改vim编码也不行.都没有完美解决.最后发现只需要在MobaX ...