Bladeren bron

LibJS: Add Array.isArray()

Linus Groh 5 jaren geleden
bovenliggende
commit
ca22476d9d

+ 12 - 0
Libraries/LibJS/Runtime/ArrayConstructor.cpp

@@ -41,6 +41,9 @@ ArrayConstructor::ArrayConstructor()
 {
     put("prototype", interpreter().global_object().array_prototype(), 0);
     put("length", Value(1), Attribute::Configurable);
+
+    u8 attr = Attribute::Writable | Attribute::Configurable;
+    put_native_function("isArray", is_array, 1, attr);
 }
 
 ArrayConstructor::~ArrayConstructor()
@@ -74,4 +77,13 @@ Value ArrayConstructor::construct(Interpreter& interpreter)
     return call(interpreter);
 }
 
+Value ArrayConstructor::is_array(Interpreter& interpreter)
+{
+    auto value = interpreter.argument(0);
+    if (!value.is_array())
+        return Value(false);
+    // Exclude TypedArray and similar
+    return Value(StringView(value.as_object().class_name()) == "Array");
+}
+
 }

+ 2 - 0
Libraries/LibJS/Runtime/ArrayConstructor.h

@@ -41,6 +41,8 @@ public:
 private:
     virtual bool has_constructor() const override { return true; }
     virtual const char* class_name() const override { return "ArrayConstructor"; }
+
+    static Value is_array(Interpreter&);
 };
 
 }

+ 28 - 0
Libraries/LibJS/Tests/Array.isArray.js

@@ -0,0 +1,28 @@
+load("test-common.js");
+
+try {
+    assert(Array.isArray.length === 1);
+
+    assert(Array.isArray() === false);
+    assert(Array.isArray("1") === false);
+    assert(Array.isArray("foo") === false);
+    assert(Array.isArray(1) === false);
+    assert(Array.isArray(1, 2, 3) === false);
+    assert(Array.isArray(undefined) === false);
+    assert(Array.isArray(null) === false);
+    assert(Array.isArray(Infinity) === false);
+    assert(Array.isArray({}) === false);
+
+    assert(Array.isArray([]) === true);
+    assert(Array.isArray([1]) === true);
+    assert(Array.isArray([1, 2, 3]) === true);
+    assert(Array.isArray(new Array()) === true);
+    assert(Array.isArray(new Array(10)) === true);
+    assert(Array.isArray(new Array("a", "b", "c")) === true);
+    // FIXME: Array.prototype is supposed to be an array!
+    // assert(Array.isArray(Array.prototype) === true);
+
+    console.log("PASS");
+} catch (e) {
+    console.log("FAIL: " + e);
+}