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


178

我正在学习JavaScript,并且在浏览jQuery库时发现:(冒号)被大量使用。这在JavaScript中有什么用?

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

Answers:


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

在功能上等同于

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

14
因此类似于C#对象初始化程序语法。谢谢!
米卡

如果没有封闭的对象怎么办?
theonlygusti 2014年

@ FranciscI.B如果我不得不猜测的话,我认为那是TypeScript,它是JavaScript的超集。它在声明一个类,带有一个名为xMin的var,其类型为float。这就是那个意思。
Sal_Vader_808 '17

96

而且,冒号可用于标记语句。例如

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

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

}

1
标签A((声明))
穆罕默德·乌默尔

4
欢迎使用Spagetti代码:)
Leo

goto无法伪装:您只需破坏goto;您已经找到了!;)
安德鲁(Andrew


是的,这就是为什么a => {b:2}不会抛出并返回未定义的原因
Pavlo D

70

你们忘了冒号也用在三元运算符中(尽管我不知道jquery是否为此目的使用了冒号)。

三元运算符是if / then语句的表达式形式(表达式返回一个值)。它的用法是这样的:

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

就像if / then一样,也可以使用三元运算符来产生副作用,但这是非常糟糕的做法。


2
又名“三元运算符”。请注意,OP严格询问对象文字大小写情况。如果我们要超越OP的要求,则在标签中也要使用冒号。
Ates Goral,

14
是的,我确实是那个意思。如果我要四处胡乱地错误地识别这样的编程概念,那我就应该远离互联网。
布列塔尼

看到它可用于标签以及其他任何东西,将真是太棒了,因此不要混淆@AtesGoral的用法,因为我现在仍然在搜索那些。
Shane 2014年

列出Java中未使用的东西也许会更容易。
kingfrito_5005

45

“:”基本上是键值对的定界符。在您的示例中,它是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两者之间的差异非常细微,但仍然很重要。我已经更新了答案,以更具体地说明这一点。
丹·赫伯特

1
我看到了更新。真好 请注意,JSON 要求键名必须用引号引起来。
nnnnnn

为什么您必须两次提及所有这些?当您说“然后使用它”时
Harsha

17

它是对象文字语法的一部分。基本格式为:

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
太好了,因为它给了我一个搜索和查找更多信息的术语。
约翰尼2014年

13

它可以用来列出变量中的对象。此外,它还用于if语句的简写形式:

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

并这样称呼它

alert(something.man);

还有if语句:

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

10

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


10

这些通常是在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 (new Date().getDay()) {
    case 6:
        text = "Today is Saturday";
        break; 
    case 0:
        text = "Today is Sunday";
        break; 
    default: 
        text = "Looking forward to the Weekend";
}

四进位三元运算符

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

1
也可以使用单个冒号代替来进行短路评估||。范例:var a = false, b = a || 'Default value';相当于var a = false, b = a : 'Default value';
Shaun Cockerill '18

7

那是JSON或JavaScript对象符号。这是描述对象或哈希图的快速方法。冒号前的内容是属性名称,冒号后的内容是属性值。因此,在此示例中,有一个属性“ r”,其值等于变量r中的值。相同。


3
JSON只是JavaScript对象初始化语法的子集。'{a:k()}',其中k是一个函数,不是JSON,但它是JavaScript对象初始化语法的最佳选择。
yfeldblum

12
要学究,不,它不是“ JSON”。它看起来像JSON。这是JavaScript固有的对象文字语法,可以直接出现在代码内部。另一方面,JSON是数据序列化/交换格式。JSON仅在“空降”时(即在运输中或尚未解析为真实对象时)才为JSON。
Ates Goral

3
代表Ates Goral +1,但请注意,给出的示例甚至看起来都不像JSON:名称必须用双引号引起来,才是有效的JSON语法。
NickFitz

3

我前一段时间犯的一个愚蠢的错误可能会对某些人有所帮助。

请记住,如果在这样的事件中使用“:”,则该值不会改变

var ondrag = (function(event, ui) {
            ...

            nub0x: event.target.offsetLeft + event.target.clientWidth/2;
            nub0y = event.target.offsetTop + event.target.clientHeight/2;

            ...
        });

因此,“ nub0x”将使用发生的第一个事件进行初始化,并且永远不会更改其值。但是“ nub0y”将在下一个事件中更改。


我想到了这一点,实际上,这里发生的事情是您在声明之前使用了标签。没有进行赋值,但是event.target.offsetLeft + event.target.clientWidth/2;每次您的ondrag方法被调用时该语句都会运行,但是永远不会将值赋给nub0x
kketch

实际上,这被用作评估,并且将:视为||。因此,event.target.offsetLeft + event.target.clientWidth/2;只会在每次提供触发时都nub0x等于false。
Shaun Cockerill '18年

1

JavaScript中冒号的另一种用法是重命名变量,即:

const person = { 
    nickNameThatIUseOnStackOverflow: "schlingel",
    age: 30,
    firstName: "John"
};
const { nickNameThatIUseOnStackOverflow: nick } = person; // I take nickNameThatIUseOnStackOverflow but want to refer it as "nick" from now on.
nick = "schling";

如果您使用第三方库返回具有要在代码中重命名的笨拙/长变量名的值,这将很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.