mirror of
https://github.com/apachecn/eloquent-js-3e-zh.git
synced 2025-05-24 04:22:20 +00:00
4.
This commit is contained in:
parent
b2f72cf56b
commit
cb2041f339
58
4.md
58
4.md
@ -190,16 +190,16 @@ let journal = [
|
||||
|
||||
我们现在即将开始真正的编程。 首先还有一个理论要理解。
|
||||
|
||||
我们已经知道对象的值是可以进行修改的。而我们在前面的章节中讨论的一些值类型比如:数字、字符串和布尔值都是不可变值,我们无法修改这些类型值的内容。你可以将这些值进行组合,也可以通过这些值来产生新值,但当你创建好一个字符串后,这个值就不能再进行任何修改了。字符串中的文本信息无法修改。如果引用了一个包含“cat”的字符串,你不能修改该字符串当中的任一字符,让字符串改写成“rat”。
|
||||
我们看到对象值可以修改。 千米你的章节讨论的值的类型(如数字,字符串和布尔值)都是不可变的 -- 这些类型的值不可能修改。 您可以将它们组合起来并从它们派生新的值,但是当您采用特定的字符串值时,该值将始终保持不变。 里面的文字不能改变。 如果你有一个包含`"cat"`的字符串,其他代码不可能修改你的字符串中的一个字符,来使它变成`"rat"`。
|
||||
|
||||
但对于对象来说,我们可以通过修改其属性来改变对象的内容。
|
||||
对象的工作方式不同。您可以更改其属性,使单个对象值在不同时间具有不同的内容。
|
||||
|
||||
当我们拥有两个数字120和120时,我们可以认为这两个数字是相等的,不管怎么说,它们都引用了真实的位序列。但对于对象来说,引用两个相同的对象和两个不同对象中包含相同属性是有区别的。我们来看以下代码:
|
||||
当我们有两个数字,120 和 120 时,我们可以将它们看作完全相同的数字,不管它们是否指向相同的物理位。 使用对象时,拥有同一个对象的两个引用,和拥有包含相同属性的两个不同的对象,是有区别的。 考虑下面的代码:
|
||||
|
||||
```
|
||||
var object1 = {value: 10};
|
||||
var object2 = object1;
|
||||
var object3 = {value: 10};
|
||||
let object1 = {value: 10};
|
||||
let object2 = object1;
|
||||
let object3 = {value: 10};
|
||||
|
||||
console.log(object1 == object2);
|
||||
// → true
|
||||
@ -213,26 +213,35 @@ console.log(object3.value);
|
||||
// → 10
|
||||
```
|
||||
|
||||
变量object1和object2引用了同一个对象,这就是为什么改变object1时,也会改变object2中的值。而object3变量则引用了不同的对象,虽然其中的属性和object1相同,但它们之间却没有任何直接的联系。
|
||||
`object1`和`object2`绑定持有相同对象,这就是为什么改变`object1`会改变`object2`的值。 据说他们具有相同的身份。 绑定`object3`指向一个不同的对象,它最初包含的属性与`object1`相同,但过着单独的生活。
|
||||
|
||||
在JavaScript中,使用==运算符来比较两个对象时,只有两个对象引用了同一个值,结果才会返回true。比较两个不同的对象将会返回false,哪怕对象内容相同。JavaScript中没有内置深度比较运算符(比较对象内容),但你可以自己编写一个(将会作为本章末尾的习题)。
|
||||
绑定可以是可变的或不变的,但这与它们的值的行为方式是分开的。 即使数值不变,您也可以使用`let`绑定来跟踪一个变化的数字,通过修改绑定所指向的值。与之类似,虽然对象的`const`绑定本身不可改变,并且始终指向相同对象,该对象的内容可能会改变。
|
||||
|
||||
```
|
||||
const score = {visitors: 0, home: 0};
|
||||
// This is okay
|
||||
score.visitors = 1;
|
||||
// This isn't allowed
|
||||
score = {visitors: 1, home: 1};
|
||||
```
|
||||
|
||||
当你用 JavaScript 的`==`运算符比较对象时,它按照身份进行比较:仅当两个对象的值严格相同时才产生`true`。 比较不同的对象会返回`false`,即使它们属性相同。 JavaScript 中没有内置的“深层”比较操作,它按照内容比较对象,但可以自己编写它(这是本章末尾的一个练习)。
|
||||
|
||||
### 松鼠人的记录
|
||||
|
||||
于是,雅克开始了他的JavaScript之旅,并搭建了用于保存每天记录的一套开发环境。
|
||||
|
||||
```
|
||||
var journal = [];
|
||||
let journal = [];
|
||||
|
||||
function addEntry(events, didITurnIntoASquirrel) {
|
||||
journal.push({
|
||||
events: events,
|
||||
squirrel: didITurnIntoASquirrel
|
||||
});
|
||||
function addEntry(events, squirrel) {
|
||||
journal.push({events, squirrel});
|
||||
}
|
||||
```
|
||||
|
||||
然后,在每天晚上的十点钟或第二天早上,从家中的书柜上爬下来后,他就会记录当天的情况。
|
||||
请注意添加到日记中的对象看起来有点奇怪。 它不像`events:events`那样声明属性,只是提供属性名称。 这是一个简写,意思一样 - 如果大括号中的属性名后面没有值,它的值来自相同名称的绑定。
|
||||
|
||||
那么,在每天晚上十点 -- 或者有时候是下一天的早晨,从它的书架顶部爬下来之后 -- 雅克记录了这一天。
|
||||
|
||||
```
|
||||
addEntry(["work", "touched tree", "pizza", "running",
|
||||
@ -243,21 +252,26 @@ addEntry(["weekend", "cycling", "break", "peanuts",
|
||||
"beer"], true);
|
||||
```
|
||||
|
||||
在记录了足够的数据点后,他尝试计算出他的变身与日常事件之间的关联,并想从中获取一些有价值的信息。
|
||||
一旦他有了足够的数据点,他打算使用统计学来找出哪些事件可能与变成松鼠有关。
|
||||
|
||||
关联是变量(这里的变量指的是统计学中的变量,而非JavaScript中的变量)之间依赖性的一种度量方式。通常可以使用一个系数(范围从–1~1)来表示。关联为0时,意味着变量之间毫无关系;而关联为1时,表示两个变量之间密切相关。如果你知道了一个变量,就可以知道另一个变量。关联为–1时,则表示两者关系密切,只不过是负相关。若一个是真,另一个就是假。
|
||||
关联性是统计变量之间的独立性的度量。 统计变量与编程变量不完全相同。 在统计学中,您通常会有一组度量,并且每个变量都根据每个度量来测量。 变量之间的相关性通常表示为从 -1 到 1 的值。 相关性为零意味着变量不相关。 相关性为一表明两者完全相关 - 如果你知道一个,你也知道另一个。 负一意味着它们是完全相关的,但它们是相反的 - 当一个是真的时,另一个是假的。
|
||||
|
||||
对二元(布尔值)变量而言,phi系数(`ϕ`)提供了一种非常好的关联性度量方式。为了计算`ϕ`,我们需要一张长宽为n的表格,其中包含两个观测变量所有组合情况的出现次数。我们以吃比萨事件为例,并画出如下表格:
|
||||
|
||||

|
||||
为了计算两个布尔变量之间的相关性度量,我们可以使用 phi 系数(`φ`)。 这是一个公式,输入为一个频率表格,包含观测变量的不同组合的次数。 公式的输出是 -1 和 1 之间的数字。
|
||||
|
||||
可以使用以下公式计算`ϕ`,n指的是表格中的数字:
|
||||
我们可以将吃比萨的事件放在这样的频率表中,每个数字表示我们的度量中的组合的出现次数。
|
||||
|
||||

|
||||
|
||||
符号n<sub class="calibre4">01</sub>表示所有度量值中,第一个度量值(吃比萨)为假(0),而第二个度量值(是否变为松鼠)为真(1)时的数量。在本例中,n<sub class="calibre4">01</sub>的值为4。
|
||||
如果我们将那个表格称为`n`,我们可以用下列公式自己算`φ`:
|
||||
|
||||
符号n<sub class="calibre4">1</sub>·则指第一个变量为真时,所有度量值数量之和,在示例表格中值为10。类似地,n·0指第二个变量(是否变成松鼠)为假时,所有度量值的数量之和。
|
||||

|
||||
|
||||
(如果你现在把这本书放下,专注于十年级数学课的可怕的再现,坚持住!我不打算用无休止的神秘符号折磨你 - 现在只有这一个公式。我们所做的就是把它变成 JavaScript。)
|
||||
|
||||
符号_n_&lt; sub&gt; 01&lt; / sub&gt;表明, 第一个变量(松鼠)为假(0)时,第二个变量(披萨)为真(1)。 在披萨表中,_n_&lt; sub&gt; 01&lt; / sub&gt; 是 9。
|
||||
|
||||
值_n_&lt; sub&gt; 1&lt; / sub&gt; 表示所有度量之和,其中第一个变量为true,在示例表中为5。 同样,_n_&lt; sub&gt; 0&lt; / sub&gt; 表示所有度量之和,其中第二个变量为假。
|
||||
|
||||
因此,我们以比萨表为例,除法线上方的部分(被除数)为1×76–9×4=40,而除法线下面的部分(除数)则是10×80×5×85的平方根,也就是。计算结果`ϕ`≈0.069,这个结果很小,因此吃比萨对是否变身成松鼠显然没有太大影响。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user