Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript变量赋值的行为令人惊讶_Javascript_Arrays_Variable Assignment - Fatal编程技术网

JavaScript变量赋值的行为令人惊讶

JavaScript变量赋值的行为令人惊讶,javascript,arrays,variable-assignment,Javascript,Arrays,Variable Assignment,这个问题实际上是另一个问题的结果,对此我做了一些实验,结果让我更加困惑。我期待着能解释内部实际发生的事情的答案 我试过的是 我将此作为基本假设,因为我得到了一些明确的解释 , 测试1 这让我很困惑,因为它将b[0]打印为a并且可以访问length属性,我认为var b可以被视为字符数组,因此我尝试分配另一个值,但没有成功。根据基本假设,如果这一个可以被视为一个字符数组(更一般地说是一个数组),那么赋值应该是成功的。它打破了基本假设 var b = 'abcd'; b['b1'] = []; c

这个问题实际上是另一个问题的结果,对此我做了一些实验,结果让我更加困惑。我期待着能解释内部实际发生的事情的答案

我试过的是

我将此作为基本假设,因为我得到了一些明确的解释 ,

测试1

这让我很困惑,因为它将
b[0]
打印为
a
并且可以访问
length
属性,我认为
var b
可以被视为字符数组,因此我尝试分配另一个值,但没有成功。根据基本假设,如果这一个可以被视为一个字符数组(更一般地说是一个数组),那么赋值应该是成功的。它打破了基本假设

var b = 'abcd';
b['b1'] = [];

console.log(b); // abcd
console.log(b.length); // 4
console.log(b['b1']); // undefined
测试2

但如果我这样创造,任务就会发生

var bb = ['a', 'b', 'c', 'd'];
bb[4] = [];

console.log(bb); // ["a", "b", "c", "d", []]
console.log(bb.length); // 4
console.log(bb[0]); // a
console.log(bb[4]); // []
由此,我认为,
b[4]=[]可能会成功,但是

var b = 'abcd';
b[4] = [];

console.log(b); // abcd
console.log(b.length); // 4
console.log(b[4]); // undefined
我的问题是,为什么这些赋值行为不同,而变量共享一些共同的功能?

这是你的电话号码

有谁能给我一个关于内部实际发生的事情的明确解释吗

额外测试

如果我尝试数字赋值,它的行为与这两种完全不同

var c = 1234;
c[4] = [];

console.log(c); //1234
console.log(c.length); // undefined
console.log(c[0]); //undefined
console.log(c[4]); //undefined   

测试1:
b
在内部是一个字符串,而不是数组,因此不能在
b
位置分配内容

测试2:它当然可以工作,因为现在
bb
是一个数组

我的问题是,为什么这些作业在 共享一些公共功能的变量

因为他们的类型不同

测试3:
c
是一个数字,而不是数组

也许您有一些C背景,其中字符串是以空字符结尾的字符数组(
\0
)。在JavaScript中,字符串是内置的int类型,它们的行为与数组不同。正如Jonathan所说,
[]
操作符只是访问一个特定字符的一种方便。以下是一些链接,请看:


  • 推理

    “基本假设”之所以有效,是因为
    a
    是一个数组。“test2”是您编写的唯一使用数组的其他测试用例,这就是为什么它是唯一有效的其他测试用例

    您似乎假设提供方括号表示法并使用
    length
    方法表示对象是数组。事实并非如此。要测试对象是否为数组,可以使用JavaScript的
    instanceof
    方法,如下所示:

    var a = [];
    var b = 'abcd';
    var bb = ['a', 'b', 'c', 'd'];
    var c = 1234;
    
    a  instanceof Array // => true
    b  instanceof Array // => false
    bb instanceof Array // => true
    c  instanceof Array // => false
    
    请注意,
    instanceof Array
    返回
    true
    的情况正是您期望的情况,因为您正在尝试执行数组操作


    为什么“测试1”失败

    对于“测试1”,字符串的方括号表示法执行字符串类的
    charAt
    函数。给定
    b='abcd'
    执行
    b[0]
    与执行
    b.charAt(0)
    相同。它是只读的,只返回该索引处的字符,即“a”

    有关更多详细信息,请参阅


    为什么“额外测试”失败


    对于您的“额外测试”,整数不提供方括号表示法或长度方法,因此所有这些调用都失败。

    我想我不明白您的问题是什么。Javascript以不同的方式处理字符串、数组和整数。你不应该期望他们以同样的方式行事。另外,javascript中也没有关联数组这样的东西,您的第一个示例将在其中工作。
    a['a1']
    类型的表示法实际上只是访问对象属性的一种替代方法,在字符串上下文中没有任何意义。

    当您访问除对象以外的任何对象时,使用
    []
    ,一个用正确原型实例化的临时对象(如
    字符串
    数字
    )是为您提供的。您可以像读取和写入任何其他对象一样读取和写入此对象的属性-例如,尝试
    alert(3[“constructor”])
    。但是,由于该对象没有在任何地方被引用,所以在对其编制索引之后,它会立即变成垃圾,下次尝试读取刚设置的同一属性时,实际上是在访问新临时对象上的属性,该属性自然是空的。

    假设字符串是字符数组。事实并非如此,因此您从该假设中得出的任何结果都不能保证有效。@Juhana完全不是,假设的,可以被视为一个字符数组,因为结果很混乱。我接受这个推理,但我想知道的是,如果
    b
    c
    不是一种数组,那么赋值是如何成功的,甚至没有抛出任何异常。他们没有失败。虽然文字不提供属性,但自动实例化的对象提供属性。尝试
    警报(42[“构造函数])
    。这些调用没有失败,原因很简单,
    Number
    实例没有任何关于数值属性的有意义的数据。此外,方括号用于索引任何对象,它不是数组独有的。第二行
    b
    应该是
    bb
    var a = [];
    var b = 'abcd';
    var bb = ['a', 'b', 'c', 'd'];
    var c = 1234;
    
    a  instanceof Array // => true
    b  instanceof Array // => false
    bb instanceof Array // => true
    c  instanceof Array // => false