charCodeAt() - 无法读取未定义

时间:2018-02-02 13:50:15

标签: javascript typescript

我需要一些建议来使用charCodeAt()方法。

我的代码如下:

doParity() {
var str = ["abcd", "efgh", "ijkl"];
var arr = str[0][0] + str[1][0] + str[2][0];    // arr = "aei"

var bin = [];
var par = [];
var parity;
var result = [];
 // line 8
 for (let j = 0; j < 3; j++) {
   bin[j] = this.toBin(str[j][0]);      // bin[j] is 8bit binary number
   par[j] = bin[j][0];                  // when j=0, str[j][0] = 'a',
                                        //           bin[j] = 01100001,
                                        //           par[j] = 0 
   if (j == 0) parity = par[j] ^ par[j + 1];
   else parity ^= parity[j + 1];
   alert(parity);
 }
//line 18
//for (let i = 0; i < 8; i++) {
//  for (let j = 0; j < 3; j++) {
//    bin[j] = this.toBin(str[j][i]);
//    par[j] = bin[j][i];
//    if (j == 0) parity = par[j] ^ par[j + 1];
//    else parity ^= parity[j + 1];
//  }
//  result[i] = parity;
//}
//alert(result);
}

toBin(str) {           // This function get ASCII value and return 8bit binary number of it. 
  var st, i, j, d;
  var arr = [];
  var len = str.length;
  for (i = 1; i <= len; i++) {
  //reverse so its like a stack
    d = str.charCodeAt(len - i);
    for (j = 0; j < 8; j++) {
      arr.push(d % 2);
      d = Math.floor(d / 2);
    }
  }
  //reverse all bits again.
  return arr.reverse().join("");
}

Line8的for循环运行良好,然后我编写了Line18的循环,因为我需要得到8位xor变量,但它不起作用。

它给了我this error

这段代码很简单,但我还在徘徊。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

for (let i = 0; i < 8; i++) {
  for (let j = 0; j < 3; j++) {
    bin[j] = this.toBin(str[j][i]);

从你的循环j上升到7str中的所有字符串都是4个字符长。 str[0][7]未定义。

&#13;
&#13;
var str = ["abcd", "efgh", "ijkl"];
console.log(str[0][0]);
console.log(str[0][7]);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这是你的问题

str[j][0]返回undefined,因为str不是二维数组

从阵列中删除第二次访问[0]

请查看包含这些修补程序的代码段

&#13;
&#13;
function doParity() {
  var str = ["abcd", "efgh", "ijkl"];
  var arr = str[0] + str[1] + str[2]; // arr = "aei"

  var bin = [];
  var par = [];
  var parity;
  var result = [];
  // line 8
  for (let j = 0; j < 3; j++) {
    bin[j] = this.toBin(str[j]); // bin[j] is 8bit binary number
    par[j] = bin[j]; // when j=0, str[j][0] = 'a',
    //           bin[j] = 01100001,
    //           par[j] = 0 
    if (j == 0) parity = par[j] ^ par[j + 1];
    else parity ^= parity[j + 1];
    alert(parity);
  }
  //line 18
  //for (let i = 0; i < 8; i++) {
  //  for (let j = 0; j < 3; j++) {
  //    bin[j] = this.toBin(str[j][i]);
  //    par[j] = bin[j][i];
  //    if (j == 0) parity = par[j] ^ par[j + 1];
  //    else parity ^= parity[j + 1];
  //  }
  //  result[i] = parity;
  //}
  //alert(result);
}

function toBin(str) { // This function get ASCII value and return 8bit binary number of it. 
  var st, i, j, d;
  var arr = [];
  var len = str.length;
  for (i = 1; i <= len; i++) {
    //reverse so its like a stack
    d = str.charCodeAt(len - i);
    for (j = 0; j < 8; j++) {
      arr.push(d % 2);
      d = Math.floor(d / 2);
    }
  }
  //reverse all bits again.
  return arr.reverse().join("");
}

doParity();
&#13;
&#13;
&#13;

答案 2 :(得分:0)

关于str [j] [0]错误的答案,因为str不是2d数组是半错误的。虽然它是一个字符串的1d数组,如果你对字符串执行[index],你将获得该索引处的char,因此str [j] [0]不会返回undefined,因此你可以对它执行.length(虽然它总是1):它返回第j个字符串的第一个字符。我运行了你编写的代码并且它可以运行&#34;很好&#34;对我来说:我收到了3个提醒,其中包括&#39; 0&#39;作为消息。因此,尽管您的方法逻辑存在缺陷,但代码应该可以正常运行。