字符串数组的奇怪Javascript行为

时间:2016-06-01 16:44:56

标签: javascript

有人在JavaScript中指出这个奇怪的数组结果,我希望有人可以解释为什么会发生这种情况。

如果我有这样的数组:

var arr = ["10", "10", "10", "10"];

我尝试将这些" 10"映射到这样的整数:

arr.map(parseInt);

结果将是一个包含值的数组:[10,NaN,2,3](我在Chrome控制台中运行了所有这些代码)

我预计结果为:[10,10,10,10]

我理解JavaScript可以将字符串中的整数解析为不同的编号系统,比如二进制,我认为这解释了2和3三个来自哪个类别。但是为什么parseInt会改变为在不同的基础上解析它们?有人可以解释为什么这是我得到的结果吗?

4 个答案:

答案 0 :(得分:4)

Array.prototype.map接受一个带有3个参数的回调:

  1. 当前元素
  2. 元素的索引
  3. 调用此函数的数组
  4. parseInt最多需要两个参数:

    1. 要解析的字符串
    2. (可选)基数,即数字的基数。
    3. 因此,在将parseInt传递给map时,您基本上会接到以下调用:

      parseInt(arr[0], 0); // if 0, same as default
      parseInt(arr[1], 1); // Parse as base 1
      parseInt(arr[2], 2); // Parse as base 2 or binary
      parseInt(arr[3], 3); // Parse as base 3
      

      更简单有效地完成您正在尝试的内容的方法是使用Number

      var arr = ["10", "10", "10", "10", "23", "74"];
      console.log(arr.map(Number));

答案 1 :(得分:1)

阅读parseInt上的手册页,它需要两个参数。值和基数。

Array.prototype.map发送三个参数: // -- create and set gender picker view if (indexPath.row == SettingsRow.Gender.rawValue) { let genderTextField = cell.rightTextField genderTextField.delegate = self let genderPicker = UIPickerView() genderPicker.accessibilityLabel = "gender_picker" genderPicker.backgroundColor = UIColor.blackColor() genderPicker.delegate = self genderPicker.dataSource = self genderTextField.inputView = genderPicker } // -- create and set birthday picker view if (indexPath.row == SettingsRow.Birthday.rawValue) { let birthDateTextField = cell.rightTextField let datePicker = UIDatePicker() datePicker.accessibilityLabel = "date_of_birth_picker" datePicker.backgroundColor = UIColor.blackColor() datePicker.setValue(UIColor.whiteColor(), forKey: "textColor") datePicker.datePickerMode = .Date datePicker.addTarget(self, action: #selector(SettingsUserProfileViewController.onDatePickerValueChanged(_:)), forControlEvents: UIControlEvents.ValueChanged) let eighteenYears:NSTimeInterval = 60 * 60 * 24 * 365 * 18 datePicker.date = NSDate(timeIntervalSinceNow: -eighteenYears) datePicker.maximumDate = NSDate() birthDateTextField.inputView = datePicker }

使用currentValue, index, array代替

Number

答案 2 :(得分:1)

它以这种方式工作:

 var arr = ["10", "10", "10", "10"];
 var newArr = arr.map(function(num){
    return parseInt(num);
 });

 console.log(newArr);

答案 3 :(得分:0)

您会看到奇怪的行为,因为实际的Parseint将第二个值视为基数

ParseInt语法: parseInt(string,radix);

在developer.mozilla.org

中解释了此行为

供参考 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map