diff --git a/docs/javascript.html b/docs/javascript.html index fdad7d4e..38167bbc 100644 --- a/docs/javascript.html +++ b/docs/javascript.html @@ -142,12 +142,12 @@
const pi = Math.PI; // 3.141592653589793
-Math.round(4.4); // = 4 - 数字四舍五入
-Math.round(4.5); // = 5
-Math.pow(2,8); // = 256 - 2 的 8 次方
-Math.sqrt(49); // = 7 - 平方根
-Math.abs(-3.14); // = 3.14 - 绝对,正值
-Math.ceil(3.14); // = 4 - 返回 >= 最小整数
+Math.round(4.4); // = 4 - 数字四舍五入
+Math.round(4.5); // = 5
+Math.pow(2,8); // = 256 - 2 的 8 次方
+Math.sqrt(49); // = 7 - 平方根
+Math.abs(-3.14); // = 3.14 - 绝对,正值
+Math.ceil(3.14); // = 4 - 返回 >= 最小整数
// = 3 - 返回 <= 最大整数
Math.floor(3.99);
// = 0 - 正弦
@@ -364,16 +364,31 @@
}
function myFunction() {
-
- var pizzaName = "Margarita";
- // 这里的代码可以使用 PizzaName
-
-}
-// 这里的代码不能使用 PizzaName
+ var pizzaName = "Margarita";
+ // 这里的代码可以使用 PizzaName
+
+}
+// ❌ PizzaName 不能在这里使用
-{ }
块内声明的变量
{
+ let x = 2;
+}
+// ❌ x 不能在这里使用
+
+{
+ var x = 2;
+}
+// ✅ x 能在这里使用
+
+var x = 2; // Global scope
+let x = 2; // Global scope
+const x = 2; // Global scope
+
+ES6 引入了两个重要的新 JavaScript 关键字:let 和 const。这两个关键字在 JavaScript 中提供了块作用域。
+const isLoggedIn = true;
if (isLoggedIn == true) {
const statusMessage = 'Logged in.';
@@ -388,7 +403,8 @@
function printColor() {
console.log(color);
}
-printColor(); // => blue
+
+printColor(); // => blue
let
vs var
for (let i = 0; i < 3; i++) {
@@ -559,12 +575,10 @@
for (let i = 0; i < 99; i += 1) {
- if (i > 5) {
- break;
- }
- console.log(i)
-}
-// => 0 1 2 3 4 5
+ if (i > 5) break;
+ console.log(i)
+}
+// => 0 1 2 3 4 5
for (i = 0; i < 10; i++) {
@@ -984,11 +998,44 @@
console.log(myMath.multiply(6, 2)); // 12
console.log(myMath.duplicate(5)) // 10
-创建 promises
+new Promise((resolve, reject) => {
+ if (ok) {
+ resolve(result)
+ } else {
+ reject(error)
+ }
+})
+
+promise
+ .then((result) => { ··· })
+ .catch((error) => { ··· })
+
+Promise.all(···)
+Promise.race(···)
+Promise.reject(···)
+Promise.resolve(···)
+
+const executorFn = (resolve, reject) => {
+ resolve('Resolved!');
+};
+const promise = new Promise(executorFn);
+
+const loginAlert = () => {
+ console.log('Login');
+};
+setTimeout(loginAlert, 6000);
+
+const promise = new Promise((resolve, reject) => {
const res = true;
- // An asynchronous operation.
+ // 一个异步操作。
if (res) {
resolve('Resolved!');
}
@@ -996,19 +1043,10 @@
reject(Error('Error'));
}
});
-promise.then((res) => console.log(res), (err) => console.error(err));
-
-const executorFn = (resolve, reject) => {
- resolve('Resolved!');
-};
-const promise = new Promise(executorFn);
-
-const loginAlert = () =>{
- console.log('Login');
-};
-setTimeout(loginAlert, 6000);
+promise.then(
+ (res) => console.log(res),
+ (err) => console.error(err)
+);
const promise = new Promise((resolve, reject) => {
@@ -1016,26 +1054,30 @@
resolve('Result');
}, 200);
});
-promise.then((res) => {
- console.log(res);
-}, (err) => {
- console.error(err);
-});
-
-const promise = new Promise((resolve, reject) => {
- setTimeout(() => {
- reject(Error('Promise Rejected Unconditionally.'));
- }, 1000);
-});
-promise.then((res) => {
- console.log(value);
-});
-promise.catch((err) => {
+
+promise.then((res) => {
+ console.log(res);
+}, (err) => {
console.error(err);
});
-const promise = new Promise(
+ (resolve, reject) => {
+ setTimeout(() => {
+ reject(Error('Promise 无条件拒绝。'));
+ }, 1000);
+});
+
+promise.then((res) => {
+ console.log(value);
+});
+
+promise.catch((err) => {
+ console.error(err);
+});
+
+const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3);
@@ -1051,7 +1093,24 @@
console.log(res[1]);
});
-const promise = new Promise(
+ resolve =>
+ setTimeout(() => resolve('dAlan'),100)
+);
+
+promise.then(res => {
+ return res === 'Alan'
+ ? Promise.resolve('Hey Alan!')
+ : Promise.reject('Who are you?')
+})
+.then((res) => {
+ console.log(res)
+}, (err) => {
+ console.error(err)
+});
+
+const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('*');
@@ -1069,24 +1128,8 @@
// 将它们链接在一起
promise.then(twoStars).then(oneDot).then(print);
-const executorFn = (resolve, reject) => {
- console.log('The executor function of the promise!');
-};
-const promise = new Promise(executorFn);
-
-const promise = new Promise(resolve => setTimeout(() => resolve('dAlan'), 100));
-promise.then(res => {
- return res === 'Alan' ? Promise.resolve('Hey Alan!') : Promise.reject('Who are you?')
-}).then((res) => {
- console.log(res)
-}, (err) => {
- console.error(err)
-});
-
function helloWorld() {
return new Promise(resolve => {
setTimeout(() => {
@@ -1094,16 +1137,21 @@
}, 2000);
});
}
-const msg = async function() { // 异步函数表达式
- const msg = await helloWorld();
- console.log('Message:', msg);
-}
-const msg1 = async () => { // 异步箭头函数
- const msg = await helloWorld();
- console.log('Message:', msg);
-}
-msg(); // Message: Hello World! <-- 2 秒后
-msg1(); // Message: Hello World! <-- 2 秒后
+
+// 异步函数表达式
+const msg = async function() {
+ const msg = await helloWorld();
+ console.log('Message:', msg);
+}
+
+// 异步箭头函数
+const msg1 = async () => {
+ const msg = await helloWorld();
+ console.log('Message:', msg);
+}
+
+msg(); // Message: Hello World! <-- 2 秒后
+msg1(); // Message: Hello World! <-- 2 秒后
let pro1 = Promise.resolve(5);
@@ -1131,13 +1179,15 @@
msg(); // Message: Hello World! <-- 2 秒后
let json = '{ "age": 30 }'; // 数据不完整
-try {
- let user = JSON.parse(json); // <-- 没有错误
- console.log( user.name ); // no name!
-} catch (e) {
- console.error( "Invalid JSON data!" );
-}
+// 数据不完整
+let json = '{ "age": 30 }';
+
+try {
+ let user = JSON.parse(json); // <-- 没有错误
+ console.log( user.name ); // no name!
+} catch (e) {
+ console.error( "Invalid JSON data!" );
+}
function helloWorld() {
@@ -1176,21 +1226,25 @@
};
req.send();
-const data = {
- fish: 'Salmon',
- weight: '1.5 KG',
- units: 5
-};
-const xhr = new XMLHttpRequest();
-xhr.open('POST', '/inventory/add');
-xhr.responseType = 'json';
-xhr.send(JSON.stringify(data));
+
const data = { weight: '1.5 KG' };
+const xhr = new XMLHttpRequest();
+// 初始化一个请求。
+xhr.open('POST', '/inventory/add');
+// 一个用于定义响应类型的枚举值
+xhr.responseType = 'json';
+// 发送请求以及数据。
+xhr.send(JSON.stringify(data));
+// 请求成功完成时触发。
xhr.onload = () => {
console.log(xhr.response);
-};
+}
+// 当 request 遭遇错误时触发。
+xhr.onerror = () => {
+ console.log(xhr.response);
+}
-fetch(url, {
method: 'POST',
headers: {
@@ -1198,32 +1252,29 @@
'apikey': apiKey
},
body: data
- }).then(response => {
- if (response.ok) {
- return response.json();
- }
- throw new Error('Request failed!');
- }, networkError => {
- console.log(networkError.message)
- })
-}
+}).then(response => {
+ if (response.ok) {
+ return response.json();
+ }
+ throw new Error('Request failed!');
+}, networkError => {
+ console.log(networkError.message)
+})
fetch('url-that-returns-JSON')
-.then(response => response.json())
-.then(jsonResponse => {
- console.log(jsonResponse);
-});
+ .then(response => response.json())
+ .then(jsonResponse => {
+ console.log(jsonResponse);
+ });
fetch('url')
-.then(
- response => {
- console.log(response);
- },
- rejection => {
- console.error(rejection.message);
-);
+ .then(response => {
+ console.log(response);
+ }, rejection => {
+ console.error(rejection.message);
+ });
fetch('https://api-xxx.com/endpoint', {
@@ -1231,16 +1282,16 @@
body: JSON.stringify({id: "200"})
}).then(response => {
if(response.ok){
- return response.json();
+ return response.json();
}
- throw new Error('Request failed!');
+ throw new Error('Request failed!');
}, networkError => {
console.log(networkError.message);
}).then(jsonResponse => {
console.log(jsonResponse);
})
-const getSuggestions = async () => {
const wordQuery = inputField.value;
const endpoint = `${url}${queryParams}${wordQuery}`;
diff --git a/docs/typescript.html b/docs/typescript.html
index ad92ab88..deb5ba9c 100644
--- a/docs/typescript.html
+++ b/docs/typescript.html
@@ -19,10 +19,11 @@
TypeScript 官网
boolean, string, number,
-undefined, null,
-any, unknown, never,
-void, bigint, symbol
+any, void,
+boolean, string, number,
+undefined, null,
+unknown, never,
+bigint, symbol
Date, Error,
@@ -258,7 +259,7 @@
// name: string
// }
-使用 as const
缩小类型
👇 使用 as const
缩小类型 👇
const data2 = {
name: "Zagreus"
} as const
@@ -326,7 +327,24 @@
res // SuccessResponse
-interface A {
+ x: number;
+}
+interface B {
+ y: string;
+}
+
+function doStuff(q: A | B) {
+ if ('x' in q) {
+ // q: A
+ } else {
+ // q: B
+ }
+}
+
+操作符可以安全的检查一个对象上是否存在一个属性,它通常也被作为类型保护使用
+class ABC { ... }
const abc = new ABC()
@@ -776,7 +794,7 @@
const foo = <foo>bar;
-// 不允许在 .tsx 👆 文件中使用尖括号类型断言。
+// ❌ 不允许在 .tsx 👆 文件中使用尖括号类型断言。
const foo = bar as foo;
@@ -833,9 +851,9 @@
side: JSX.Element | string;
}
-function Dog(prop: HomeProps): JSX.Element;
-function Dog(prop: SideProps): JSX.Element;
-function Dog(prop: CeProps): JSX.Element {
+function Dog(prop:HomeProps): JSX.Element;
+function Dog(prop:SideProps): JSX.Element;
+function Dog(prop:CeProps): JSX.Element {
// ...
}
@@ -855,29 +873,10 @@
Menu.Item = MenuItem;
Menu.SubMenu = SubMenu;
-<Menu.Item /> // ok
-<Menu.SubMenu /> // ok
+<Menu.Item /> // ✅ ok
+<Menu.SubMenu /> // ✅ ok
-class MyComponent {
- render() {}
-}
-// 使用构造签名
-const myComponent = new MyComponent();
-// element class type => MyComponent
-// element instance type => { render: () => void }
-
-function MyFactoryFunction() {
- return {
- render: () => {},
- };
-}
-// 使用调用签名
-const myComponent = MyFactoryFunction();
-// element class type => MyFactoryFunction
-// element instance type => { render: () => void }
-
-元素实例类型很有趣,因为它必须可以分配给JSX。ElementClass,否则将导致错误。默认情况下,JSX。ElementClass 是 {},但可以对其进行扩展,以将JSX的使用限制为仅限于符合适当接口的类型。
+declare namespace JSX {
interface ElementClass {
render: any;
@@ -889,15 +888,44 @@
function MyFactoryFunction() {
return { render: () => {} };
}
-<MyComponent />; // ok
-<MyFactoryFunction />; // ok
-
-class NotAValidComponent {}
-function NotAValidFactoryFunction() {
- return {};
-}
-<NotAValidComponent />; // ❌ error
-<NotAValidFactoryFunction />; // ❌ error
+<MyComponent />; // ✅ 有效类组件
+<MyFactoryFunction />; // ✅ 有效函数组件
+
+元素实例类型必须可以分配给 JSX.ElementClass
,否则将导致错误。
class NotAValidComponent {}
+function NotAValidFactoryFunction() {
+ return {};
+}
+<NotAValidComponent />; // ❌ error
+<NotAValidFactoryFunction />; // ❌ error
+
+默认情况下,JSX.ElementClass
是 {},但可以对其进行扩展,以将 JSX
的使用限制为仅限于符合适当接口的类型。
type Props = {
+ header: React.ReactNode;
+ body: React.ReactNode;
+};
+
+class MyComponent extends React.Component<Props, {}> {
+ render() {
+ return (
+ <div>
+ {this.props.header}
+ {this.props.body}
+ </div>
+ );
+ }
+}
+
+<MyComponent header={<h1>Header</h1>} body={<i>body</i>} />
+
+// 一个泛型组件
+type SelectProps<T> = { items: T[] };
+class Select<T> extends React.Component<SelectProps<T>, any> {}
+
+// 使用
+const Form = () => <Select<string> items={['a', 'b']} />;