理解这个语法 if(obj[x])
Understanding this syntax if(obj[x])
所以我正在学习 Udemy 上的一些教程,总的来说它们非常出色,除了现在我正在学习的部分有一位新讲师,他对函数的内部工作原理没有那么描述.
当前示例是一个计算所述字符串中元音迭代次数的函数。
function vowelCount(str){
var splitArr = str.toLowerCase().split("");
var obj = {};
var vowels = "aeiou";
splitArr.forEach(function(letter){
if(vowels.indexOf(letter) !== -1){
if(obj[letter]){
obj[letter]++;
} else{
obj[letter] = 1;
}
}
});
}
vowelCount("abcdefghij")
我个人难倒的部分是if(obj[letter])
在我看来,obj 变量是空的,在这种情况下,[] 中的任何内容都是对索引的引用,我不明白 if 语句正在检查什么我也不太明白obj[letter].
后面的语法
如有任何启发,我们将不胜感激。
就是这样做的:
- 评估
obj[letter]
(更多内容请见 this question's answers):
- 计算
letter
以获得其当前值(例如,"a"
)
- 正在计算
obj
以获取其当前值(对象)
- 获取对象上名为
"a"
(例如)的 属性 的值;如果 属性 不存在,则结果将是值 undefined
- 如果步骤 1 的值为 truthy
,则分支到 if
真实 值是任何非虚假 的值。虚假值是 undefined
、null
、0
、""
、NaN
,当然还有 false
.
基本上,该代码所做的是查看 obj
是否已经有一个 属性 作为字母,如果是,则增加它的值;如果不是,它将其值设置为 1。
不过,不要过度概括该模式。它在这里起作用是因为 属性 的值永远不会是 0
或 ""
或类似的值(存储的值从 1 开始并且只会增加)。但在其他情况下,如果您需要查看对象上是否存在 属性 但其值可能是这些虚假值之一,请使用 obj.hasOwnProperty(letter)
(检查 属性 是否存在在对象本身,而不是它的原型上),letter in obj
如果你想检查对象和它的原型链,或者如果你想对 hasOwnProperty
被重新定义持怀疑态度,请使用 Object.prototype.hasOwnProperty.call(obj, letter)
。 :-)
但是当您知道 属性 不存在或具有真实值时,此 "falsy" 检查非常有用。
所以我正在学习 Udemy 上的一些教程,总的来说它们非常出色,除了现在我正在学习的部分有一位新讲师,他对函数的内部工作原理没有那么描述.
当前示例是一个计算所述字符串中元音迭代次数的函数。
function vowelCount(str){
var splitArr = str.toLowerCase().split("");
var obj = {};
var vowels = "aeiou";
splitArr.forEach(function(letter){
if(vowels.indexOf(letter) !== -1){
if(obj[letter]){
obj[letter]++;
} else{
obj[letter] = 1;
}
}
});
}
vowelCount("abcdefghij")
我个人难倒的部分是if(obj[letter])
在我看来,obj 变量是空的,在这种情况下,[] 中的任何内容都是对索引的引用,我不明白 if 语句正在检查什么我也不太明白obj[letter].
后面的语法如有任何启发,我们将不胜感激。
就是这样做的:
- 评估
obj[letter]
(更多内容请见 this question's answers):- 计算
letter
以获得其当前值(例如,"a"
) - 正在计算
obj
以获取其当前值(对象) - 获取对象上名为
"a"
(例如)的 属性 的值;如果 属性 不存在,则结果将是值undefined
- 计算
- 如果步骤 1 的值为 truthy ,则分支到
if
真实 值是任何非虚假 的值。虚假值是 undefined
、null
、0
、""
、NaN
,当然还有 false
.
基本上,该代码所做的是查看 obj
是否已经有一个 属性 作为字母,如果是,则增加它的值;如果不是,它将其值设置为 1。
不过,不要过度概括该模式。它在这里起作用是因为 属性 的值永远不会是 0
或 ""
或类似的值(存储的值从 1 开始并且只会增加)。但在其他情况下,如果您需要查看对象上是否存在 属性 但其值可能是这些虚假值之一,请使用 obj.hasOwnProperty(letter)
(检查 属性 是否存在在对象本身,而不是它的原型上),letter in obj
如果你想检查对象和它的原型链,或者如果你想对 hasOwnProperty
被重新定义持怀疑态度,请使用 Object.prototype.hasOwnProperty.call(obj, letter)
。 :-)
但是当您知道 属性 不存在或具有真实值时,此 "falsy" 检查非常有用。