Javascript Basic
Outline:
- Intro
- Basic
- Function
- ...
Intro
- MDN -> JS
- 廖雪峰 ->JS
Basic
Object
JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成.
JavaScript用一个{...}
表示一个对象,键值对以xxx: xxx
形式申明,用,
隔开。注意,最后一个键值对不需要在末尾加,
,如果加了,有的浏览器(如低版本的IE)将报错.
JS对象的属性的key是一个字符串, value可以是任意类型.
JS中访问不存在的属性会返回undefined
:
成员访问
如果属性名包含特殊字符,就必须用''
括起来:
1 | let xiaohong = { |
xiaohong
的属性名middle-school
不是一个有效的变量,就需要用''
括起来。访问这个属性也无法使用.
操作符,必须用['xxx']
来访问:
1 | xiaohong['middle-school']; // 'No.1 Middle School' |
也可以用xiaohong['name']
来访问xiaohong
的name
属性,不过xiaohong.name
的写法更简洁。我们在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过object.prop
的形式访问一个属性了。
Function
Destructuring
ES6支持解构赋值. 这是对容器、对象等对象赋值的语法糖.
解构赋值可以支持嵌套结构, 只需保持赋值时的嵌套的层次一致
数组的解构赋值
对数组:
1 | let [x, y, z] = ['hello', 'JavaScript', 'ES6']; |
对嵌套的数组元素的解构赋值:
1 | let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']]; |
解构赋值还可以忽略某些元素:
1 | let [, , z] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素 |
对象的解构赋值
对象的解构赋值是按成员名字匹配的:
1 | var person = { |
1 | var person = { |
- 变量名
zip
不匹配对象的address
属性的zipcode
, 所以是undefined
address
没有被赋值为变量
如果要使用的变量名和属性名不一致,可以用下面的语法获取:
1 | var person = { |
解构赋值还可以使用默认值,这样就避免了不存在的属性返回undefined
的问题:
1 | var person = { |
有些时候,如果变量已经被声明了,再次赋值的时候,正确的写法也会报语法错误:
1 | // 声明变量: |
这是因为JavaScript引擎把{
开头的语句当作了块处理,于是=
不再合法。解决方法是用小括号括起来:
1 | ({x, y} = { name: '小明', x: 100, y: 200}); |
应用
假设props
为:
1 | props = { |
React中:
1 | const Hello = (props) => { |
可以更加简化, 在形参中写解构赋值:
1 | const Hello = ({ name, age }) => { |
object spread syntax
ref
Spread syntax (...
) allows an iterable, such as an array or string, to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected. In an object literal, the spread syntax enumerates the properties of an object and adds the key-value pairs to the object being created.
1 | function sum(x, y, z) { |
应用
在React中, useState()
可以和解构赋值结合:
1 | const App = () => { |
注意到, 状态clicks
有两部分: clicks.left
, clicks.right
. 每次更新其中一部分时, 还要写另一部分:
1 | const handleLeftClick = () => { |
这样很冗余,可以用object spread syntax来简化:
1 | const handleLeftClick = () => { |
这里的...clicks
实际上被展开为:
1 | //以handleLeftClick内为例 |
由于JS对象支持重复声明属性, 并且后面的属性会覆盖前面同名的属性, 这样做实际上就保留了left
属性, 只更改right
属性