求助:解析String扩展方法中处理arguments的关键代码逻辑
拆解JavaScript字符串格式化工具中的参数处理逻辑
先贴出你复制的完整字符串格式化代码:
module.exports=function(){ String.prototype.FormatPlus = String.prototype.FormatPlus || function(){ "use strict"; let str = this.toString(); if (arguments.length) { let t = typeof arguments[0]; let key; let args = ("string" === t || "number" === t) ? Array.prototype.slice.call(arguments) : arguments[0]; for (key in args) { str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]); } return str; } } }
你疑惑的这行代码,核心是让这个格式化函数支持两种不同的传参方式,下面逐段拆解:
let args = ("string" === t || "number" === t) ? Array.prototype.slice.call(arguments) : arguments[0];
1. 条件判断部分:("string" === t || "number" === t)
- 这里的
t是之前代码中typeof arguments[0]的结果,也就是判断第一个传入的参数是否为字符串或数字类型。
2. 三元运算符的两个分支
三元运算符? :会根据前面的条件结果,选择执行对应的代码:
- 当条件为真(第一个参数是字符串/数字):执行
Array.prototype.slice.call(arguments)arguments是JS函数里自带的类数组对象,它能获取到所有传入函数的参数,但不能直接使用数组方法。Array.prototype.slice.call(arguments)的作用是把这个类数组转换成真正的数组,比如传入"张三", 20,转换后得到["张三", 20],后续就能通过索引0、1对应字符串里的{0}、{1}占位符。
- 当条件为假(第一个参数是对象):直接取
arguments[0]- 这时候用户传入的应该是一个键值对对象,比如
{name: "张三", age: 20},直接取这个对象后,后续就能通过键名name、age对应字符串里的{name}、{age}这类命名占位符。
- 这时候用户传入的应该是一个键值对对象,比如
整体作用
这行代码让FormatPlus函数同时支持两种调用场景:
- 场景1:
"我叫{0},今年{1}岁".FormatPlus("张三", 20) - 场景2:
"我叫{name},今年{age}岁".FormatPlus({name: "张三", age: 20})
内容的提问来源于stack exchange,提问作者Devepation
相关产品推荐
相关产品推荐

