在Javascript中拆分字符串的奇怪行为

Nic*_*ick 6 javascript parseint internet-explorer-11

我想做一些相对简单的事情.我有这种格式的日期dd/MM/yyyy例如:

var newDate = "?11?/?06?/?2015";
Run Code Online (Sandbox Code Playgroud)

我想将它转换为约会.

此代码仅适用于Chrome和Firefox:

new Date(newDate)
Run Code Online (Sandbox Code Playgroud)

在IE11中,我得到了 Nan

所以我想这样做:

var parts = newDate.split("/");
var year = parts[2].trim();
var month = parts[1].trim();
var day = parts[0].trim();
var dt = new Date(Number(year), Number(month) - 1, Number(day));
Run Code Online (Sandbox Code Playgroud)

哪个应该有效,但我遇到了一个非常奇怪的错误.

如果您尝试此代码:

function myFunction() {
  var newDate = "?11?/?06?/?2015";
  var parts = newDate.split('/');
  var year = parts[2].trim();

  var a = year;
  var b = Number(year);
  var c = parseInt(year, 10);
  var d = parts;
  var n = a + "<br>" + b + "<br>" + c + "<br>" + d;
  document.getElementById("demo").innerHTML = n;
}
Run Code Online (Sandbox Code Playgroud)
<p>Click the button to see the parse error.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>
Run Code Online (Sandbox Code Playgroud)

然后在IE中它添加了一个神秘的角色,它打印出来ý2015并在chrome中打印出来?2015.

事实上,IE中部件的价值是:ý11ý,ý06ý,ý2015 在Chrome中:?11?,?06?,?2015

我无法理解这些神秘人物的来源!我原来的字符串就是"?11?/?06?/?2015"

似乎没有办法做一些如此简单的事情,比如从简单的字符串中解析整数.

小提琴不显示隐藏字符,但我相信他们仍然在那里,因为Number("2015")结果NaN,你可以清楚地看到这里 的任何想法?

UPDATE

字符串中确实隐藏了字符,经过调查后我发现它们是这样创建的:

var date = new Date();
var dateToSave = date.toLocaleDateString();
Run Code Online (Sandbox Code Playgroud)

但仅限于IE.

在Chrome或Firefox中,输出不包含U+200E从左到右的标记,但在IE中它确实存在!

删除toLocaleDateString()并更换它kendo.toString(selectedValue, "dd/MM/yyyy")解决了问题.

为了记录,我还尝试了moment.js和行: moment(selectedValue).format("DD/MM/YYYY")但由于某些原因,在IE11中U+200E,在结果字符串的最开头有一个隐藏字符.

Sci*_*ter 12

"?11?/?06?/?2015".split('').map(function(s){return s.charCodeAt(0)})在控制台中运行(获取Unicode值),发现了一些有趣的东西:[8206, 49, 49, 8206, 47, 8206, 48, 54, 8206, 47, 8206, 50, 48, 49, 53]

你那里有一个U + 200E从左到右的标记.我不知道它是怎么到达那里的.

删除它,你会没事的.

在这里,您可以复制并粘贴我的字符串:"11/06/2015".

  • 您可以使用以下命令删除所有非ASCII字符:`newDate.replace(/ [^\x00-\x7F]/g,"")` (5认同)

Jor*_*ing 5

Scimonster敏锐地发现了您的问题,并且dan解释了如何去除非ASCII字符,但是有一种更简单的方法:只需使用仅与数字匹配的正则表达式即可。这样,你就不必使用splittrim或带任何东西了:

function go() {
  var newDate = "?11?/?06?/?2015";
  var expr = /\d+/g;
  var parts = newDate.match(expr);
  
  document.getElementById("result").innerHTML =
    "Parts: " + parts +
    "<br>Year: " + parts[0] +
    "<br>Month: " + parts[1] +
    "<br>Day: " + parts[2];
}
Run Code Online (Sandbox Code Playgroud)
<button onclick="go()">Try me</button>
<div id="result"/>
Run Code Online (Sandbox Code Playgroud)

这将工作中的字符串是否是"?11?/?06?/?2015""11-6-2015"junk11/06/2016junk