JavaScript中的冒号(':')有什么作用?

197

我正在学习JavaScript,在浏览jQuery库时看到:(冒号)被频繁使用。在JavaScript中,这用于什么?

// Return an array of filtered elements (r)
// and the modified expression string (t)
   return { r: r, t: t };
11个回答

273
var o = {
    r: 'some value',
    t: 'some other value'
};

等价于该功能

var o = new Object();
o.r = 'some value';
o.t = 'some other value';

16
类似于 C# 的对象初始化语法。谢谢! - Micah
如果没有封闭的对象会怎么样? - theonlygusti
如果我猜的话,我认为那是TypeScript,它是JavaScript的超集。它声明了一个类,其中有一个名为xMin的变量,其类型为浮点数。我相当确定这就是它的意思。 - Molasses

113

同时,冒号也可以用于标记一条语句,例如:

var i = 100, j = 100;
outerloop:
while(i>0) {
  while(j>0) {
   j++

   if(j>50) {
     break outerloop;
   }
  }
i++

}

1
一个goto语句是无法掩盖的:你只需要打破它,就会发现它! ;) - Andrew
2
MDN JavaScript标签参考页面:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/label - Peter
1
是的,这就是为什么 a=>{b:2} 不会抛出异常并返回 undefined。 - Pavlo D

82

你们忘了冒号也被用在三元运算符中(尽管我不知道jquery是否使用它来做这个目的)。

三元运算符是if/then语句的表达式形式(表达式返回一个值)。它的使用方式如下:

var result = (condition) ? (value1) : (value2) ;

三元运算符也可以用来产生副作用,就像 if/then 一样,但这是极其不良的做法。


3
注:AKA“三元运算符”。请注意,原帖严格仅询问对象字面量的情况。如果我们要超出原帖的问题范围,冒号还可用于标签。 - Ates Goral
16
是的,我就是那个意思。如果我会像那样 flagrantly 错误地识别编程概念,我应该真的远离互联网。 - Breton
能够看到它被用于标签和其他任何地方将是很棒的,这样使用就不会让人感到困惑了。因为我现在仍在通过谷歌搜索这些内容,@AtesGoral。 - Shane
也许列出在Javascript中不使用的事情会更容易些。 - kingfrito_5005

49

':'基本上是键值对的分隔符。在您的示例中,它是JavaScript对象文字符号。

在JavaScript中,对象使用冒号分隔属性标识符和其值进行定义,因此您可以拥有以下内容:

return { 
    Property1 : 125,
    Property2 : "something",
    Method1 : function() { /* do nothing */ },
    array: [5, 3, 6, 7]
};

然后像这样使用:

var o =  { 
    property1 : 125,
    property2 : "something",
    method1 : function() { /* do nothing */ },
    array: [5, 3, 6, 7]
};

alert(o.property1); // Will display "125"

其中的一个子集也被称为JSON(JavaScript对象表示法),它在AJAX调用中非常有用,因为它紧凑且快速解析服务器端语言,并且JavaScript可以轻松地将JSON字符串反序列化为对象。

// The parenthesis '(' & ')' around the object are important here
var o = eval('(' + "{key: \"value\"}" + ')');

如果键名包含特殊字符或空格,您也可以将其放在引号中,但我不建议这样做,因为它会使操作变得更加困难。

请记住,在JavaScript语言中,JavaScript对象字面量表示法与JSON消息传递的标准不同。两者之间的主要区别在于函数和构造函数不是JSON标准的一部分,但是它们允许在JS对象字面量中使用。


2
当我阅读您的回复时,我本来想给它投票支持,但是您说“它也被称为JSON”。对象字面量和JSON绝对不是同一回事,实际上,在您提到JSON之前的示例都不是有效的JSON。 - nnnnnn
@nnnnnn 两者之间的差别非常微妙,但仍然非常重要。我已经更新了我的答案,以更具体地说明这一点。 - Dan Herbert
1
我看到更新了。不错。请注意,JSON 需要使用引号括起来的键名。 - nnnnnn
为什么你要把所有的东西都提两遍?当你说“然后像使用它一样使用它”时。 - Harsha

19

它是对象字面量语法的一部分。基本格式如下:

var obj = { field_name: "field value", other_field: 42 };

然后,您可以使用以下方式访问这些值:

obj.field_name; // -> "field value"
obj["field_name"]; // -> "field value"

你甚至可以将函数作为值,从而获得对象的方法:

obj['func'] = function(a) { return 5 + a;};
obj.func(4);  // -> 9

1
很棒,因为它给了我一个搜索的术语,让我找到更多信息。 - johnny

15

这些通常是 JavaScript 中使用冒号 ':' 的场景:

1- 声明和初始化一个对象

var Car = {model:"2015", color:"blue"}; //car object with model and color properties

2- 设置标签(不推荐,因为它会导致复杂的控制结构和意大利面式代码)

List: 
while(counter < 50)
{
     userInput += userInput;
     counter++;
     if(userInput > 10000)
     {
          break List;
     }
}

3- 在 Switch 语句中

switch (new Date().getDay()) {
    case 6:
        text = "Today is Saturday";
        break; 
    case 0:
        text = "Today is Sunday";
        break; 
    default: 
        text = "Looking forward to the Weekend";
}

4- 在三元运算符中

document.getElementById("demo").innerHTML = age>18? "True" : "False";

3
一个单冒号也可以用于短路求值,代替 ||。例如: var a = false, b = a || '默认值'; 等同于 var a = false, b = a : '默认值'; - Shaun Cockerill

14

它可以用来列出变量中的对象。此外,在 if 语句的速记符号中也略微使用了它:

var something = {face: 'hello',man: 'hey',go: 'sup'};

并且这样调用它。

alert(something.man);

同时,if语句:

function something() {  
  (some) ? doathing() : dostuff(); // if some = true doathing();, else dostuff();
}

11

我们不要忘记 switch 语句,在每个 "case" 后使用冒号。


10
JavaScript中冒号的另一个用法是重命名变量,例如:
const person = { 
    nickNameThatIUseOnStackOverflow: "schlingel",
    age: 30,
    firstName: "John"
};
let { nickNameThatIUseOnStackOverflow: nick } = person; // I take nickNameThatIUseOnStackOverflow but want to refer it as "nick" from now on.
nick = "schling";

如果你使用第三方库返回一些拥有不方便/冗长变量名称的值,而你想在自己的代码中将其重命名,则这很有用。


3
哇!你怎么会知道这个? - Saptadeep
@Saptadeep 我看到过一些使用它的例子,我猜。 - schlingel

8

那是JSON,或JavaScript对象表示法。它是描述对象或哈希映射的快速方式。冒号前面的东西是属性名称,冒号后面的是它的值。所以在这个例子中,有一个名为“r”的属性,其值是变量r中的任何内容。t也是如此。


3
JSON只是JavaScript对象初始化语法的一个子集。'{ a: k() }'中,k是一个函数,这不是JSON,但它是完全合法的JavaScript对象初始化语法。 - yfeldblum
13
严谨地说,这不是“JSON”。它看起来像JSON,但实际上这是JavaScript的本地对象字面语法,并且可以直接出现在代码中。而JSON则是一种数据序列化/交换格式。只有当JSON在传输过程中或尚未解析为真实对象时,它才被称为JSON。 - Ates Goral
3
支持 Ates Goral,但请注意给出的例子甚至看起来都不像 JSON:为了是有效的 JSON 语法,名称必须用双引号括起来。 - NickFitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接