有人在JavaScript中指出这个奇怪的数组结果,我希望有人可以解释为什么会发生这种情况。
如果我有这样的数组:
var arr = ["10", "10", "10", "10"];
我尝试将这些" 10"映射到这样的整数:
arr.map(parseInt);
结果将是一个包含值的数组:[10,NaN,2,3](我在Chrome控制台中运行了所有这些代码)
我预计结果为:[10,10,10,10]
我理解JavaScript可以将字符串中的整数解析为不同的编号系统,比如二进制,我认为这解释了2和3三个来自哪个类别。但是为什么parseInt会改变为在不同的基础上解析它们?有人可以解释为什么这是我得到的结果吗?
答案 0 :(得分:4)
Array.prototype.map
接受一个带有3个参数的回调:
parseInt
最多需要两个参数:
因此,在将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