1
0
mirror of https://github.com/apachecn/eloquent-js-3e-zh.git synced 2025-05-23 20:02:20 +00:00
This commit is contained in:
wizardforcel 2018-05-01 12:20:40 +08:00
parent b2f72cf56b
commit cb2041f339

58
4.md
View File

@ -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的表格其中包含两个观测变量所有组合情况的出现次数。我们以吃比萨事件为例并画出如下表格
![](../Images/00125.jpeg)
为了计算两个布尔变量之间的相关性度量,我们可以使用 phi 系数(`φ`)。 这是一个公式,输入为一个频率表格,包含观测变量的不同组合的次数。 公式的输出是 -1 和 1 之间的数字。
可以使用以下公式计算`ϕ`n指的是表格中的数字
我们可以将吃比萨的事件放在这样的频率表中,每个数字表示我们的度量中的组合的出现次数。
![](../Images/00126.jpeg)
符号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指第二个变量是否变成松鼠为假时所有度量值的数量之和。
![](../Images/00126.jpeg)
(如果你现在把这本书放下,专注于十年级数学课的可怕的再现,坚持住!我不打算用无休止的神秘符号折磨你 - 现在只有这一个公式。我们所做的就是把它变成 JavaScript。
符号_n_lt; subgt; 01lt; / subgt;表明, 第一个变量松鼠为假0第二个变量披萨为真1。 在披萨表中_n_lt; subgt; 01lt; / subgt; 是 9。
值_n_lt; subgt; 1lt; / subgt; 表示所有度量之和其中第一个变量为true在示例表中为5。 同样_n_lt; subgt; 0lt; / subgt; 表示所有度量之和,其中第二个变量为假。
因此我们以比萨表为例除法线上方的部分被除数为1×769×4=40而除法线下面的部分除数则是10×80×5×85的平方根也就是![](../Images/00127.jpeg)。计算结果`ϕ`≈0.069,这个结果很小,因此吃比萨对是否变身成松鼠显然没有太大影响。