2

When using Jquery's get function I found a code snippet which I have implemented in which data is sent to the server. the data is given to the get function as a dictionary. In this dictionary the keys act as strings yet are not wrapped in quotations. The values in this dictionary are wrapped as strings. Can anyone explain what the difference is? the variable name and time are NOT defined anywhere previously in the script. Included is the entire script below.

<script>
    $(document).ready(function () {
        $.ajaxSetup({ cache: false });
        $('button').click(function () {
            $.get('query.php',{ name: "John", time: "2pm" },function (data) {
                alert(data);
            });
        });
    });
</script>
4

2 回答 2

3

您要询问的代码是 JavaScript 对象文字:

{
    name: "John",
    time: "2pm"
}

你可以这样写对象字面量,这意味着完全相同的事情:

{
    "name": "John",
    "time": "2pm"
}

您在前一行中有另一个对象文字:

$.ajaxSetup({ cache: false });

这意味着它被写成同样的东西:

$.ajaxSetup({ "cache": false });

或者:

$.ajaxSetup({ 'cache': false });

换句话说,对象文字中的属性名称通常不需要引号。如果名称不是有效的 JavaScript 标识符,您只需引用属性名称,例如,如果其中包含空格:

{
    "my name": "John",
    "the time": "2pm"
}

如果你这样写,那将是无效的:

{
    my name: "John",
    the time: "2pm"
}

所以这里需要引号。但是在您使用的对象文字中,它们不是必需的,无论您是否使用它们都意味着相同的事情。

请注意,这与其他一些语言不同,在这些语言中,哈希或映射中带引号的名称或不带引号的名称实际上意味着不同的东西。在 Ruby 中,散列中未加引号的名称是变量引用。在 JSON 中,必须始终引用属性名称。但是在 JavaScript 对象字面量中,当名称是有效的 JavaScript 标识符时,您可以省略引号。

于 2013-09-18T23:17:34.483 回答
2

Object Initialiserliteral中,键不会严格评估为Expressions

相反,它们仅限于 3 个可能的选项:

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral

虽然StringLiterals 和NumberLiterals 将对其值进行正常评估,但 s 将根据IdentifierName其名称进行评估。

因此,在您的代码段中,nametime是属性的实际名称。即使确实存在类似的变量,它们实际上也不会被使用:

var time = 'foo';

console.log({ time: 'bar' });
// { "time": "bar" } rather than { "foo": "bar" }

如果您想使用变量作为键,您实际上需要使用括号成员运算符

var o = {};
o[time] = 'bar';

console.log(o);
// { "foo": "bar" }

另一方面,这些值被评估为普通表达式。因此,变量和其他文字都可以使用。

console.log({ bar: time, baz: true, qux: [ "Lorem", "ipsum" ] });
// { "bar": "foo", "baz": true, qux: [ "Lorem", "ipsum" ] }
于 2013-09-18T23:31:07.433 回答