JavaScript 对象 属性 赋值
JavaScript object property assignment
在此页 -> https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript
" 创建后,可以通过以下两种方式之一再次访问对象的属性:
obj.name = "Simon";
var name = obj.name;
obj["name"] = "Simon";
var name = obj["name"];
这些在语义上也是等价的。 第二种方法的优点是 属性 的名称以字符串形式提供,这意味着它可以在 运行 时计算,但使用此方法可以防止一些 JavaScript 正在应用引擎和 minifier 优化."
(IN BOLD) 为什么第二种方法更好?这里提到的 JavaScript 和 minifier 优化是什么?
如果您需要更多信息,请告诉我
第二种方法允许您在运行时动态构造名称:
// something passed in to the context
var name = firstName + "_name";
obj[name] = "some value";
这也支持 JavaScript 代码不支持的字符(如连字符 -
):
obj["some-value"] = "some value";
并且由于缩小工具不会触及字符串文字,因此 "name"
不会被缩小,但 name
可能是:
obj.name = "value";
obj.name = "another value":
// after minification:
obj.n = "value";
obj.n = "another value";
而这不会被触及:
obj["name"] = "value";
obj["name"] = "another value";
没有更好,只是更灵活。考虑一下:
var objects = [
{
x: 2,
y: 3
},
{
x: 32,
y: 64
},
...
];
var sum = 0;
for (var i = 0, len = objects.length; i < len; i++) {
var property;
if (i % 2 == 0) {
property = 'x';
} else {
property = 'y';
}
sum += objects[i][property];
}
这使您可以在 运行 时确定要访问的内容 属性。这阻止的优化是重命名 属性 以使文件更小,并且由于该值是动态的,编译器无法提前预测它将从何处提取值。
第二个不是 'better' 但更安全,因为它允许具有非常规字符的属性。例如:
obj.my-property = true; //parse errror
obj['my-property'] = true; //fine, because property name specified as string
它还允许您构建动态 属性 名称,例如
var prop_name = 'foo';
prop_name += 'bar';
obj[prop_name] = true;
optimisation/minification 点与这样一个事实有关,即大多数(如果不是全部)压缩器都会严格保持字符串不变,原因相当明显。假设你有:
var str = "hello";
即使您缩小了脚本,您也会希望您的字符串保持 "hello"。
所以缩小引擎可能会转
obj.foobar = true;
进入
a.b=true;
但不会改变
obj['foobar'] = true;
进入
a['b']=true;
第二种方法允许使用通常会引发错误的名称:
var obj = {}
//setting
obj.hyphenated-name = 'foo' //throws error
obj['hyphenated-name'] = 'foo' //works
//getting
obj.hyphenated-name //NaN or Undefined depending on your environment
obj['hyphenated-name'] //'foo'
第一种方法可以想到'syntactic sugar'第二种方法
虽然第一种方法可读性更强,输入更少,但第二种方法使您能够动态命名 属性。
您可能会发现这很有用的一个例子是,当您试图避免过长的 switch-cases(if、if-else、if-else、else 等)时。
您可以使用哈希映射来避免这种情况,如下所示:
function getFav(name) {
var favoriteColors = {
"bob": "red",
"jim": "blue",
"ana": "red",
"sue": "purple"
};
// Here we use the second accessor method,
// if 'name' is not inside the favoriteColors, we short-circuit to 'unknown'
return favoriteColors[name] || "unknown";
}
getFav("bob"); // "red"
getFav("ana"); // "red"
getFav("sue"); // "purple"
getFav("dan"); // "unknown"
在此页 -> https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript
" 创建后,可以通过以下两种方式之一再次访问对象的属性:
obj.name = "Simon";
var name = obj.name;
obj["name"] = "Simon";
var name = obj["name"];
这些在语义上也是等价的。 第二种方法的优点是 属性 的名称以字符串形式提供,这意味着它可以在 运行 时计算,但使用此方法可以防止一些 JavaScript 正在应用引擎和 minifier 优化."
(IN BOLD) 为什么第二种方法更好?这里提到的 JavaScript 和 minifier 优化是什么?
如果您需要更多信息,请告诉我
第二种方法允许您在运行时动态构造名称:
// something passed in to the context
var name = firstName + "_name";
obj[name] = "some value";
这也支持 JavaScript 代码不支持的字符(如连字符 -
):
obj["some-value"] = "some value";
并且由于缩小工具不会触及字符串文字,因此 "name"
不会被缩小,但 name
可能是:
obj.name = "value";
obj.name = "another value":
// after minification:
obj.n = "value";
obj.n = "another value";
而这不会被触及:
obj["name"] = "value";
obj["name"] = "another value";
没有更好,只是更灵活。考虑一下:
var objects = [
{
x: 2,
y: 3
},
{
x: 32,
y: 64
},
...
];
var sum = 0;
for (var i = 0, len = objects.length; i < len; i++) {
var property;
if (i % 2 == 0) {
property = 'x';
} else {
property = 'y';
}
sum += objects[i][property];
}
这使您可以在 运行 时确定要访问的内容 属性。这阻止的优化是重命名 属性 以使文件更小,并且由于该值是动态的,编译器无法提前预测它将从何处提取值。
第二个不是 'better' 但更安全,因为它允许具有非常规字符的属性。例如:
obj.my-property = true; //parse errror
obj['my-property'] = true; //fine, because property name specified as string
它还允许您构建动态 属性 名称,例如
var prop_name = 'foo';
prop_name += 'bar';
obj[prop_name] = true;
optimisation/minification 点与这样一个事实有关,即大多数(如果不是全部)压缩器都会严格保持字符串不变,原因相当明显。假设你有:
var str = "hello";
即使您缩小了脚本,您也会希望您的字符串保持 "hello"。
所以缩小引擎可能会转
obj.foobar = true;
进入
a.b=true;
但不会改变
obj['foobar'] = true;
进入
a['b']=true;
第二种方法允许使用通常会引发错误的名称:
var obj = {}
//setting
obj.hyphenated-name = 'foo' //throws error
obj['hyphenated-name'] = 'foo' //works
//getting
obj.hyphenated-name //NaN or Undefined depending on your environment
obj['hyphenated-name'] //'foo'
第一种方法可以想到'syntactic sugar'第二种方法
虽然第一种方法可读性更强,输入更少,但第二种方法使您能够动态命名 属性。
您可能会发现这很有用的一个例子是,当您试图避免过长的 switch-cases(if、if-else、if-else、else 等)时。
您可以使用哈希映射来避免这种情况,如下所示:
function getFav(name) {
var favoriteColors = {
"bob": "red",
"jim": "blue",
"ana": "red",
"sue": "purple"
};
// Here we use the second accessor method,
// if 'name' is not inside the favoriteColors, we short-circuit to 'unknown'
return favoriteColors[name] || "unknown";
}
getFav("bob"); // "red"
getFav("ana"); // "red"
getFav("sue"); // "purple"
getFav("dan"); // "unknown"