Javascript:有一个数字,有阵列推送给我NaN

时间:2017-03-08 16:41:31

标签: javascript google-chrome date internet-explorer internet-explorer-11

我有一个非常奇怪的错误/问题...... IE给我带来了悲伤......我无法理解我做错了什么...... IE的问题是IE11 ......

所以,基本上我有一个日期字符串,IE1 toLocaleDateString给了我(08/03/2017)....我需要一个字符串8/3/2017(Chrome如何给我fe)....所以我我要走得很远,只是为了确保我正在做好一切......

    let date = new Date();
    let dateStr = date.toLocaleDateString();
    console.log("Date string:", dateStr);
    let splitChar = '/';
    let tokens = dateStr.split(splitChar);
    let result = [];

    for( let token of tokens){
        console.log('token', token);
        let t = token.replace(/\b(?:0*(0\.\d+)|0+)/g, '$1');
        let n;
        n = parseInt(t, 10);
        console.log('----- stripped', t);
        console.log('----- number', n);
        if(typeof n === 'number'){
            result.push(n);
            console.log('----- ARRAY', result.toString());
        }
    };

LOG(IE11):

Date string: ‎08‎/‎03‎/‎2017
token ‎08‎
----- stripped ‎8‎
----- number NaN
----- ARRAY NaN
token ‎03‎
----- stripped ‎3‎
----- number NaN
----- ARRAY NaN,NaN
token ‎2017
----- stripped ‎2017
----- number NaN
----- ARRAY NaN,NaN,NaN

LOG(Chrome 40)

Date string: 3/8/2017
token 3
----- stripped 3
----- number 3
----- ARRAY 3
token 8
----- stripped 8
----- number 8
----- ARRAY 3,8
token 2017
----- stripped 2017
----- number 2017
----- ARRAY 3,8,2017

除了IE和Chrome解析不同标准的血腥月份...(IE美国和Chrome欧洲)..

出于某种原因,IE(11)中的parseInt(t,10)给出了NaN ... eventhough t显然是一个数字字符串......

如果我自己输入字符串...就像在

中一样
let dateStr = ‎"08‎/‎03‎/‎2017";

它适用于两种浏览器......

我认为唯一合理的原因是因为IE不会返回实际的数字字符,而是一些看起来像数字但实际上不是

的其他unicode字符

编辑=========================================== ==

我正在检查从 toLocaleDateString()返回的字符的ascii代码

并且可疑,IE不提供实际的正常字符:

let ascii = function(a) { return a.charCodeAt(0); }

let date = new Date();
let dateStr = date.toLocaleDateString();
console.log("Date string", dateStr);
let splitChar = '/';
let tokens = dateStr.split(splitChar);
let result = [];

for( let token of tokens){
    console.log('token', token);
    let t = token.replace(/\b(?:0*(0\.\d+)|0+)/g, '$1');
    let n;
    n = parseInt(t, 10);
    console.log('----- stripped', t);
    console.log('charCode (t):', t.split('').map(ascii));
    console.log('----- number', n);
    if(typeof n === 'number'){
        result.push(n);
        console.log('----- ARRAY', result.toString());
    }
};

IE给出:

Date string ‎08‎/‎03‎/‎2017
token ‎08‎
----- stripped ‎8‎
charCode (t): 8206,56,8206
   "charCode (t):"
   [
      0: 8206,
      1: 56,
      2: 8206,
      length: 3
   ]

----- number NaN
----- ARRAY NaN
token ‎03‎
----- stripped ‎3‎
charCode (t): 8206,51,8206
   "charCode (t):"
   [
      0: 8206,
      1: 51,
      2: 8206,
      length: 3
   ]

----- number NaN
----- ARRAY NaN,NaN
token ‎2017
----- stripped ‎2017
charCode (t): 8206,50,48,49,55
   "charCode (t):"
   [
      0: 8206,
      1: 50,
      2: 48,
      3: 49,
      4: 55,
      length: 5
   ]

----- number NaN
----- ARRAY NaN,NaN,NaN

而Chromne提供正常的ASCII码:

Date string 3/8/2017
token 3
----- stripped 3
charCode (t): [51]
----- number 3
----- ARRAY 3
token 8
----- stripped 8
charCode (t): [56]
----- number 8
----- ARRAY 3,8
token 2017
----- stripped 2017
charCode (t): [50, 48, 49, 55]
----- number 2017
----- ARRAY 3,8,2017

希望它有助于某人

2 个答案:

答案 0 :(得分:0)

尝试使用构造函数创建Date对象,该构造函数可以将每个日期部分作为单独的参数。

答案 1 :(得分:0)

如我的附录中所述,这是一个IE问题,它使用不同的unicode字符来表示日期字符串...所以isNumeric或toInt不起作用