可以't将.length属性与IronJS和ArrayObject一起使用

Can't use the .length property with IronJS and ArrayObject

本文关键字:IronJS ArrayObject 一起 属性 length 可以      更新时间:2023-09-26

我使用的是IronJs的最新版本(0.2.0.1),我的js脚本无法正确检索使用IronJs.Runtime.ArrayObject设置到js引擎的数组的长度。然而,我的变量被很好地识别为数组,如下面的C#代码所示。

var jsCode = @"myArray.length;";
var javascriptEngine = new IronJS.Hosting.CSharp.Context();
var array = new ArrayObject(javascriptEngine.Environment, 2);//array of size 2
array.Put(0, 12.0);//mock values
array.Put(1, 45.1);
javascriptEngine.SetGlobal<ArrayObject>("myArray", array);
var result = javascriptEngine.Execute(jsCode);
Console.WriteLine(result);
var jsCode2 = @"myArray instanceof Array;";
var result2 = javascriptEngine.Execute<bool>(jsCode2);
Console.WriteLine(result2);

我们得到以下输出

undefined
True

这是IronJS Runtime中的一个错误。您应该在相应的GitHub存储库中打开一个问题:https://github.com/fholm/IronJS/

解决方法是强制重新分配整个数组。在这种情况下,.length属性似乎设置正确。实现这一点的一种简单方法是创建一个小于所需的ArrayObject(例如0大小的ArrayObject),然后在其中添加一些值

    [TestMethod]
    public void TestWithZeroSizedArray()
    {
        string jsCode = @"myArray.length;";
        var javascriptEngine = new IronJS.Hosting.CSharp.Context();
        var array = new ArrayObject(javascriptEngine.Environment, 0); // Creates a 0-sized Array
        array.Put(0, 12.0);
        array.Put(1, 45.1);
        javascriptEngine.SetGlobal<ArrayObject>("myArray", array);
        var result = javascriptEngine.Execute(jsCode);
        Assert.AreEqual(2, result);
    }

请记住,底层.NET阵列的多次复制/重新分配将导致性能问题。