这件事已经让我伤了一个小时。我正在尝试对字符串执行简单的for循环,并返回当前字符和下一个字符。
var mystring = "abcdef";
for (x in mystring) {
if (mystring[x + 1]) {
console.log(x + ": " + mystring[x] + mystring[x + 1]);
}
else {
console.log("You've reached the end of the string");
}
}
在循环的每次迭代中,“mystring [x + 1]”为false。虽然我希望它对于字符串的前五个字符是正确的。这里发生了什么?有什么关于JavaScript的东西我不明白吗?
答案 0 :(得分:10)
private void treeView_Loaded(object sender, RoutedEventArgs e)
{
//don't know why, but in Windows 10 if this code is as XAML, the app falls with a ComExcpetion
//so the corresponding XAML should be commented out like this:
//...
//<controls:TreeView.ItemTemplate>
// <DataTemplate>
// <!-- <data:DataTemplateExtensions.Hierarchy>
// <data:HierarchicalDataTemplate ItemsSource="{Binding Folders}" />
// </data:DataTemplateExtensions.Hierarchy> -->
// <Grid>
//...
WinRTXamlToolkit.Controls.Data.DataTemplateExtensions.SetHierarchy(treeView.ItemTemplate, new WinRTXamlToolkit.Controls.Data.HierarchicalDataTemplate
{
ItemsSource = new Windows.UI.Xaml.Data.Binding { Path = new PropertyPath("Folders") }
});
}
用于循环对象的可枚举属性的名称。属性名称始终为字符串*。 for-in
使用串联生成字符串(例如,string + number
为"1" + 1
,而不是"11"
)。
因此,如果您首先将属性名称转换为数字,那么它可能最常起作用:
2
...但我会用
x = +x; // Convert to number
if (mystring[x + 1]) {
...来代替。如果我需要支持旧的浏览器,我还会使用for (x = 0; x < mystring.length; ++x) {
而不是.charAt(...)
来获取角色(但我认为那些不支持索引到字符串的浏览器现在已经相当死了)。
只有[...]
的实例:
x = +x
var mystring = "abcdef";
for (x in mystring) {
x = +x;
if (mystring[x + 1]) {
snippet.log(x + ": " + mystring[x] + mystring[x + 1]);
}
else {
snippet.log("You've reached the end of the string");
}
}
* “属性名称始终为字符串”在ES5中也是如此。在ES6 +中,它们也可能是<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
个实例,但Symbol
不会访问非字符串的实例。这与此无关,但我不想在那里留下这样的声明......: - )