Javascript Array vs Php Array

ele*_*ser 9 javascript php arrays

我在php和javascript中有两个相同代码块的版本.它们的输出略有不同.Javascript输出中有两个"未定义"元素.我知道Javascript数组索引是从0开始的增量,并且不允许我们跳过任何索引号.

有没有解决这个问题,所以Javascript数组输出看起来像Php数组输出?

PHP代码:

$n = array();
$n[0] = 'Apple';
$n[3] = 'Apple';
echo "<pre>";
print_r( $n );
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Apple
    [3] => Apple
)
Run Code Online (Sandbox Code Playgroud)

Javascript代码:

var n = new Array();
n[0] = 'Apple';
n[3] = 'Apple';
n;
Run Code Online (Sandbox Code Playgroud)

输出:

[
    "Apple", 
    undefined, 
    undefined, 
    "Apple"
]
Run Code Online (Sandbox Code Playgroud)

谢谢!!

fjo*_*joe 19

正如您所提到的,JavaScript Arrays具有索引限制.

您可以获得所需输出的最接近方法是使用JavaScript对象.

然后,如果您使用JavaScript JSON stringify将对象转换为格式良好的文本,您将获得几乎相同的输出而不费力.

您可以编写额外的JavaScript以使输出完全镜像PHP输出.但我会把它留给你.

var n = new Object();
n[0] = 'Apple';
n[3] = 'Apple';

var output = JSON.stringify(n, null, 2);

// Output to a pre tag like the PHP example you gave.
document.getElementById("output").innerHTML = output;

// Simple output to the console.
console.log(output);
Run Code Online (Sandbox Code Playgroud)
<pre id="output"></pre>
Run Code Online (Sandbox Code Playgroud)


Tar*_*yan 7

我认为在你的情况下使用object而不是数组更好,例如在JS关联数组中使用相同的对象.铁

var n = {};
n[0] = 'Apple';
n[3] = 'Apple';
console.log(n);
Run Code Online (Sandbox Code Playgroud)

它会输出

Object {0: "Apple", 3: "Apple"}
Run Code Online (Sandbox Code Playgroud)

编辑 您可以从数组中获取对象中的元素:

n[0], n[3]
Run Code Online (Sandbox Code Playgroud)


Ton*_*cas 5

PHP数组是哈希表,Javascript数组是索引列表

简短答案

有没有办法让JavaScript数组的行为很像PHP数组不违反ECMA标准(这将意味着它在技术上不再JavaScript的)。

是。但是只能通过替换内置的Array原型行为。

请参阅ECMA-262第15.4节数组对象

什么是数组?

数组是有序数据 ,仅此而已。尽管数组确实具有index,但不应将数组“索引”的概念与标记数据存储的概念混淆。数组索引始终是顺序的,因为它指向数组中的位置,类似于行中人员的位置。

您无法与第一个人,第四个人和其他人排成一行。 n[0] = 'first'; n[3] = 'fourth;

这是几乎每种编程语言都定义数组的方式,因为它是将数据存储在内存中的方式。

改用对象

这是许多其他人已经对这个问题给出的答案。最终,JavaScript Array只是预定义类型的对象,其行为如上所述。因此,您尝试更改的行为实际上是经过精心设计的行为。

因此,不要使用特殊的“数组”对象,而应使用字符串键(作为名为属性的对象),这样就可以简化整个问题。

注意:本质上,这是此处其他“使用对象”回答的内容,但有一个明显的例外。

n['0'] = 'Apple';
n['3'] = 'Apple';

// OR

n = {
    '0': 'Apple',
    '3': 'Apple',
};

// numeric keys are possible, IFF the var is first explicitly defined as an object.
n = {};
n[0] = 'Apple';
n[3] = 'Apple';
Run Code Online (Sandbox Code Playgroud)

对象还不够,它必须是数组吗?滚动您自己的“数组”容器对象。

这里的缺点是您需要手动定义要传递给数组对象本身的所有方法调用。

var PhpArray = function(ary){
    if (ary instanceof Array) {
        this.ary = ary;
    } else {
        this.ary = new Array(ary);
    }
};

PhpArray.prototype.forEach = function(f){
    for(i in this.ary){
        if (this.ary[i] !== undefined && this.ary[i] !== null) {
            f(i, this.ary[i]);
        }
    }
};

PhpArray.prototype.toString = function(){
    var strResult '';
    this.forEach(function(k, val){
        switch(typeof val) {
            case 'boolean':
            case 'string':
            case 'number':
                strResult += k + ': ' + val;
                break;
            default:
                if (val.toString) {
                    strResult += k + ': ' + val.toString();
                } else {
                    strResult += k + ': ' + typeof val;
                }
        }
    });
};

// Usage:
var n = Array();
n[0] = 'Apple';
n[3] = 'Apple';
var x = new PhpArray(n);
console.log('' + x);

x.ary[5] = 'Pear';
Run Code Online (Sandbox Code Playgroud)

还不够好吗?“更改阵列行为!?” 你说?

是否x[3] = 'Apple';要从上面的示例访问?

或者,也许您真的想覆盖内置的Array原型?

好好扣好安全带Dorothy,因为javascript即将告别。没错,我们正在ECMA上的某个地方,您可以在这里做任何您想做的事情。当然,其他开发人员会讨厌您,并且第三方工具(jQuery)将不再起作用,但至少您会获得不是数组的javascript数组。

不幸的是,我不会帮助您做到这一点。