Javascript 数组+;查拉特问题

Javascript 数组+;查拉特问题,javascript,arrays,Javascript,Arrays,以下代码输出ak[i]。字符不是函数错误。奇怪的是,如果不是ii,而是将一个数字k[1].charAt(0),则没有错误,结果是正确的。与indexOf相同 for (i = 0; n < arguments.length; i++) { k[i] = arguments[i]; if (k[i].charAt(0) == "["){ k[i] = eval(k[i]); } } (i=0;n

以下代码输出a
k[i]。字符不是函数
错误。奇怪的是,如果不是
i
i,而是将一个数字
k[1].charAt(0)
,则没有错误,结果是正确的。与
indexOf
相同

for (i = 0; n < arguments.length; i++) {
    k[i] = arguments[i];
    if (k[i].charAt(0) == "["){
        k[i] = eval(k[i]);
    }
}
(i=0;n{ k[i]=参数[i]; 如果(k[i].字符(0)==“[”){ k[i]=eval(k[i]); } }
这个代码有点模棱两可

  • 参数
    表示作为类似数组的对象提供给函数的所有参数

  • charAt
    是在
    String.prototype

  • 因此,
    if(x.chatAt(0)='['){…}
    仅在
    x
    是字符串时才起作用,否则您将得到如上所述的错误

    总而言之(在es6中):

    所以你可以做两件事:

  • 在运行测试之前,将每个参数转换为字符串:
    if(''+arg.charAt(…))…
    ,或
    if(arg.toString().charAt())

  • 如果参数不是字符串,则引发错误。可以找到测试变量是否为字符串的步骤


  • 假设您移交的参数是字符串,那么我建议使用带有检查的映射,并避免使用
    eval

    函数转换(){
    返回Array.prototype.map.call(参数,函数(a){
    返回一个[0]='['?JSON.parse(a):a;
    });
    }
    console.log(转换('a',1',[1,2,3]');

    .as控制台包装{最大高度:100%!重要;顶部:0;}
    什么是
    k
    ?你的代码没有包含你对
    k
    的定义。什么是
    n
    ?你有没有试过自己用
    console.log
    来调试它?你似乎没有在循环中更新n,所以取决于它最初是什么,这可能会进入无限循环。此外,你对
    k的定义也是如此
    n
    。n是一个键入错误,即使随i改变,结果也不会改变。k是一个全局数组,在开始时用var k=[]定义,那么您应该在问题中解释这一点,以减少歧义并获得更好的响应
    const foo = (...args) => {
      for (let arg of args) {
        if (arg.chatAt(0) == '[') { … }
      }
    } 
    
    foo({}) // Error
    foo('[', {}) // Error, because arg2 is not a string
    foo('[', ']') // No Errors, because each arg is a String