一、JavaScript中的分号问题
还是来看下面的例子
function nums(a, b) {
if
(a > b)
console.log('a is bigger')
else
console.log('b is bigger')
return
a + b
}
console.log(nums(4, 2))
console.log(nums(1, 2))
此时,输出的是a is bigger, undefined and b is bigger, undefined,这是因为
在JavaScript中,我们不必显式地编写分号(;
),但是JavaScript引擎仍然在语句之后自动添加分号。这称为自动分号插入。例如,一个语句可以是变量,或者像throw
、return
、break
这样的关键字。 在这里,我们在新的一行上写了一个return
语句和另一个值a + b
。然而,由于它是一个新行,引擎并不知道它实际上是我们想要返回的值。相反,它会在return
后面自动添加分号。你可以这样看:
return;
a + b
这意味着永远不会到达a + b
,因为函数在return
关键字之后停止运行。如果没有返回值,就像这里,函数返回undefined
。注意,在if/else
语句之后没有自动插入!
二、||
运算符
还是通过一个例子看来一下
const one = (false || {} || null)
const two = (null || false || "")
const three = ([] || 0 || true)
console.log(one, two, three)
发现此时输出的是{} "" [],这是因为
使用||
运算符,我们可以返回第一个真值。 如果所有值都是假值,则返回最后一个值。 (false || {} || null)
:空对象{}
是一个真值。 这是第一个(也是唯一的)真值,它将被返回。one
等于{}
。 (null || false ||“”)
:所有值都是假值。 这意味着返回传递的值""
。 two
等于""
。 ([] || 0 ||“”)
:空数组[]
是一个真值。 这是第一个返回的真值。 three
等于[]
。
三、splice
下面那些方法修改了原数组?
const emojis = ['✨', '🥑', '😍']
emojis.map(x => x + '✨')
emojis.filter(x => x !== '🥑')
emojis.find(x => x !== '🥑')
emojis.reduce((acc, cur) => acc + '✨')
emojis.slice(1, 2, '✨')
emojis.splice(1, 2, '✨')
在这个里面只有最后一个把原数组改变了,这是因为
使用splice
方法,我们通过删除,替换或添加元素来修改原始数组。 在这种情况下,我们从索引1中删除了2个元素(我们删除了'🥑'
和'😍'
),同时添加了✨emoji表情。 map
,filter
和slice
返回一个新数组,find
返回一个元素,而reduce
返回一个减小的值。
四、JSON.parse()
使用JSON.parse()
方法,我们可以将JSON字符串解析为JavaScript值。
// 将数字字符串化为有效的JSON,然后将JSON字符串解析为JavaScript值:
const jsonNumber = JSON.stringify(4) // '4'
JSON.parse(jsonNumber) // 4
// 将数组值字符串化为有效的JSON,然后将JSON字符串解析为JavaScript值:
const jsonArray = JSON.stringify([1, 2, 3]) // '[1, 2, 3]'
JSON.parse(jsonArray) // [1, 2, 3]
// 将对象字符串化为有效的JSON,然后将JSON字符串解析为JavaScript值:
const jsonArray = JSON.stringify({ name: "Lydia" }) // '{"name":"Lydia"}'
JSON.parse(jsonArray) // { name: 'Lydia' }
五、yield
关键字
先来看一段代码
function* generatorOne() {
yield ['a', 'b', 'c'];
}
function* generatorTwo() {
yield* ['a', 'b', 'c'];
}
const one = generatorOne()
const two = generatorTwo()
console.log(one.next().value)
console.log(two.next().value)
运行一下 ,发现打印出来的是['a', 'b', 'c'] and a,这是因为
通过 yield
关键字, 我们在 Generator
函数里执行yield
表达式. 通过 yield*
关键字, 我们可以在一个Generator
函数里面执行(yield
表达式)另一个 Generator
函数, 或可遍历的对象 (如数组). 在函数 generatorOne
中, 我们通过 yield
关键字 yield 了一个完整的数组 ['a', 'b', 'c']
。函数one
通过next
方法返回的对象的value
属性的值 (one.next().value
) 等价于数组 ['a', 'b', 'c']
.
console.log(one.next().value) // ['a', 'b', 'c']
console.log(one.next().value) // undefined
在函数 generatorTwo
中, 我们使用 yield*
关键字。就相当于函数two
第一个yield
的值, 等价于在迭代器中第一个 yield
的值。数组['a', 'b', 'c']
就是这个迭代器. 第一个 yield
的值就是 a
, 所以我们第一次调用 two.next().value
时, 就返回a
。
console.log(two.next().value) // 'a'
console.log(two.next().value) // 'b'
console.log(two.next().value) // 'c'
console.log(two.next().value) // undefined
六、通过 ES10 或 TS3.7+可选链操作符 ?.
const person = {
firstName: "Lydia",
lastName: "Hallie",
pet: {
name: "Mara",
breed: "Dutch Tulip Hound"
},
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
};
console.log(person.pet?.name);
console.log(person.pet?.family?.name);
console.log(person.getFullName?.());
console.log(member.getLastName?.());
七、Setters
const config = {
languages: [],
set language(lang) {
return this.languages.push(lang);
}
};
console.log(config.language);
方法 language
是一个 setter
。Setters 并不保存一个实际值,它们的使命在于 修改 属性。当调用方法 setter
, 返回 undefined
。
八、Intl.NumberFormat
详细内容请参考
九、Number.isNaN与isNaN
来看一个例子
const name = "Lydia Hallie";
const age = 21;
console.log(Number.isNaN(name));
console.log(Number.isNaN(age));
console.log(isNaN(name));
console.log(isNaN(age));
运行后输出false false true false,这是因为
通过方法 Number.isNaN
,你可以检测你传递的值是否为 数字值 并且是否等价于 NaN
。name
不是一个数字值,因此 Number.isNaN(name)
返回 false
。age
是一个数字值,但它不等价于 NaN
,因此 Number.isNaN(age)
返回 false
. 通过方法 isNaN
, 你可以检测你传递的值是否一个 number。name
不是一个 number
,因此 isNaN(name)
返回 true
. age
是一个 number
因此 isNaN(age)
返回 false
.
十、flat
const emojis = ["🥑", ["✨", "✨", ["🍕", "🍕"]]];
console.log(emojis.flat(1));
运行这个代码,发现输出['🥑', '✨', '✨', ['🍕', '🍕']],这是因为
通过方法 flat
, 我们可以创建一个新的, 已被扁平化的数组。被扁平化的深度取决于我们传递的值。在这个case里,我们传递了值 1
(并不必要,这是默认值),相当于只有第一层的数组才会被连接。即这个 case 里的 ['🥑']
and ['✨', '✨', ['🍕', '🍕']]
。连接这两个数组得到结果 ['🥑', '✨', '✨', ['🍕', '🍕']]
.