JavaScript速查表

news/2024/12/22 0:23:10/文章来源:https://www.cnblogs.com/zhaoqingqing/p/18403172

JavaScript速查表

  • 本手册绝大部分内容是从Airbnb JavaScript Style Guide精简整理,将开发者们都明确的操作去掉,目的为了就是更快的速查。
    此处为源地址。

  • 译制:HaleNing

目录

  • 基础知识
    • 类型
    • 引用
    • 对象
    • 数组
    • 解构
    • 字符串
    • 变量
    • 属性
    • 测试
  • 公共约束
    • 注释
    • 分号
    • 命名规范
    • 标准库
  • 类与函数
    • 函数
    • 箭头函数
    • 类与构造函数
    • 模块
    • 迭代器与生成器
    • 提升
    • 比较运算符与相等
    • 事件
    • 类型转换与强制转换
  • 推荐资源

基础知识

类型

  • 基本类型
    最新的 ECMAScript 标准定义了 8 种数据类型,分别是
    • string
    • number
    • bigint
    • boolean
    • null
    • undefined
    • symbol (ECMAScript 2016新增)

所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。

  • 引用类型
    • Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function)
使用 typeof 运算符检查:undefined:typeof instance === "undefined"
Boolean:typeof instance === "boolean"
Number:typeof instance === "number"
String:typeof instance === "string
BigInt:typeof instance === "bigint"
Symbol :typeof instance === "symbol"
null:typeof instance === "object"。
Object:typeof instance === "object"

引用

推荐常量赋值都使用const, 值可能会发生改变的变量赋值都使用 let

为什么?let const 都是块级作用域,而 var是函数级作用域


// bad
var count = 1;
if (true) {count += 1;
}// good, use the let and const 
let count = 1;
const pi =3.14;
if (true) {count += 1;
}

对象

  • 使用字面语法创建对象:

    // bad
    const item = new Object();// good
    const item = {};
    
  • 在创建具有动态属性名称的对象时使用属性名称:

    
    function getKey(k) {return `a key named ${k}`;
    }// bad
    const obj = {id: 5,name: 'San Francisco',
    };
    obj[getKey('enabled')] = true;// good
    const obj = {id: 5,name: 'San Francisco',[getKey('enabled')]: true,
    };
    
  • 属性值简写,并且推荐将缩写 写在前面 :

    const lukeSkywalker = 'Luke Skywalker';
    //常量名就是你想设置的属性名
    // bad
    const obj = {lukeSkywalker: lukeSkywalker,
    };// good
    const obj = {lukeSkywalker,
    };const anakinSkywalker = 'Anakin Skywalker';
    const lukeSkywalker = 'Luke Skywalker';// good
    const obj = {lukeSkywalker,anakinSkywalker,episodeOne: 1,twoJediWalkIntoACantina: 2,episodeThree: 3,mayTheFourth: 4,
    };
    
  • 不要直接调用 Object.prototype上的方法,如 hasOwnPropertypropertyIsEnumerableisPrototypeOf

    为什么?在一些有问题的对象上,这些方法可能会被屏蔽掉,如:{ hasOwnProperty: false } 或空对象 Object.create(null)

    // bad
    console.log(object.hasOwnProperty(key));// good
    console.log(Object.prototype.hasOwnProperty.call(object, key));// best
    const has = Object.prototype.hasOwnProperty; 
    console.log(has.call(object, key));
    /* or */
    import has from 'has'; // https://www.npmjs.com/package/has
    console.log(has(object, key));
    
  • 对象拷贝时,推荐使用...运算符来代替Object.assign, 获取大对象的多个属性时,也推荐使用...运算符

    // very bad, 因为line2的操作更改了original
    const original = { a: 1, b: 2 };
    const copy = Object.assign(original, { c: 3 }); 
    // 将不需要的属性删除了
    delete copy.a; // bad
    const original = { a: 1, b: 2 };
    const copy = Object.assign({}, original, { c: 3 }); // copy => { a: 1, b: 2, c: 3 }// good 使用 es6 扩展运算符 ...
    const original = { a: 1, b: 2 };
    // 浅拷贝
    const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 }// rest 解构运算符
    const { a, ...noA } = copy; // noA => { b: 2, c: 3 }
    

数组

  • 用扩展运算符做数组浅拷贝,类似上面的对象浅拷贝:

    // bad
    const len = items.length;
    const itemsCopy = [];
    let i;for (i = 0; i < len; i += 1) {itemsCopy[i] = items[i];
    }// good
    const itemsCopy = [...items];
    
  • ... 运算符而不是 Array.from 来将一个可迭代的对象转换成数组:

    const foo = document.querySelectorAll('.foo');// good
    const nodes = Array.from(foo);// best
    const nodes = [...foo];
    
  • 使用 Array.from 而不是 ... 运算符去做 map 遍历。 因为这样可以避免创建一个临时数组:

    // bad
    const baz = [...foo].map(bar);// good
    const baz = Array.from(foo, bar);
    
  • 如果一个数组有很多行,在数组的 [ 后和 ] 前断行 :

    
    // good
    const arr = [[0, 1], [2, 3], [4, 5]];const objectInArray = [{id: 1,},{id: 2,},
    ];const numberInArray = [1,2,
    ];
    

解构

  • 用对象的解构赋值来获取和使用对象某个或多个属性值:

    // bad
    function getFullName(user) {const firstName = user.firstName;const lastName = user.lastName;return `${firstName} ${lastName}`;
    }// good
    function getFullName(user) {const { firstName, lastName } = user;return `${firstName} ${lastName}`;
    }// best
    function getFullName({ firstName, lastName }) {return `${firstName} ${lastName}`;
    }
    
  • 数组解构:

    const arr = [1, 2, 3, 4];// bad
    const first = arr[0];
    const second = arr[1];
    const four = arr[3];// good
    const [first, second, _,four] = arr;
    
  • 多个返回值用对象的解构,而不是数组解构:

    // bad
    function processInput(input) {return [left, right, top, bottom];
    }// 数组解构,必须明确前后顺序
    const [left, __, top] = processInput(input);// good
    function processInput(input) {return { left, right, top, bottom };
    }
    // 只需要关注值,而不用关注顺序
    const { left, top } = processInput(input);
    

字符串

  • 当需要动态生成字符串时,使用模板字符串而不是字符串拼接:

    // bad
    function sayHi(name) {return 'How are you, ' + name + '?';
    }// bad
    function sayHi(name) {return ['How are you, ', name, '?'].join();
    }// good 可读性比上面更强
    function sayHi(name) {return `How are you, ${name}?`;
    }
    
  • 永远不要使用 eval(),该方法有太多漏洞。

变量

  • 不要使用链式变量赋值

因为会产生隐式的全局变量

// bad
(function example() {// JavaScript interprets this as// let a = ( b = ( c = 1 ) );// The let keyword only applies to variable a; variables b and c become// global variables.let a = b = c = 1;
}());console.log(a); // throws ReferenceError
// 在块的外层也访问到了,代表这是一个全局变量。
console.log(b); // 1 
console.log(c); // 1// good
(function example() {let a = 1;let b = a;let c = a;
}());console.log(a); // throws ReferenceError
console.log(b); // throws ReferenceError
console.log(c); // throws ReferenceError// the same applies for `const`
  • 不要使用一元自增自减运算符(++--

    根据 eslint 文档,一元增量和减量语句受到自动分号插入的影响,并且可能会导致应用程序中的值递增或递减的静默错误。 使用 num + = 1 而不是 num ++num ++ 语句也是含义清晰的。

  // badconst array = [1, 2, 3];let num = 1;num++;--num;let sum = 0;let truthyCount = 0;for (let i = 0; i < array.length; i++) {let value = array[i];sum += value;if (value) {truthyCount++;}}// goodconst array = [1, 2, 3];let num = 1;num += 1;num -= 1;const sum = array.reduce((a, b) => a + b, 0);const truthyCount = array.filter(Boolean).length;

属性

  • 访问属性时使用点符号
const luke = {jedi: true,age: 28,
};// bad
const isJedi = luke['jedi'];// good
const isJedi = luke.jedi;
  • 根据表达式访问属性时使用[]
const luke = {jedi: true,age: 28,
};function getProp(prop) {return luke[prop];
}const isJedi = getProp('je'+'di');

测试

  • 无论用哪个测试框架,都需要写测试。
  • 尽量去写很多小而美的函数,减少突变的发生
  • 小心 stub 和 mock —— 这会让你的测试变得容易出现问题。
  • 100% 测试覆盖率是我们努力的目标,即便实际上很少达到。
  • 每当你修了一个 bug, 都要尽量写一个回归测试。 如果一个 bug 修复了,没有回归测试,很可能以后会再次出问题。

公共约束

注释

  • 多行注释用 /** ... */
// bad
// make() returns a new element
// based on the passed in tag name
//
// @param {String} tag
// @return {Element} element
function make(tag) {// ...return element;
}// good
/*** make() returns a new element* based on the passed-in tag name*/
function make(tag) {// ...return element;
}
  • 单行注释用 //
// bad
const active = true;  // is current tab// good
// is current tab
const active = true;// bad
function getType() {console.log('fetching type...');// set the default type to 'no type'const type = this._type || 'no type';return type;
}// good
function getType() {console.log('fetching type...');// set the default type to 'no type'const type = this._type || 'no type';return type;
}// also good
function getType() {// set the default type to 'no type'const type = this._type || 'no type';return type;
}
  • // FIXME: 给问题注释,用 // TODO: 去注释待办

分号

为什么?当 JavaScript 遇到没有分号结尾的一行,它会执行 自动插入分号 这一规则来决定行末是否加分号。如果 JavaScript 在你的断行里错误的插入了分号,就会出现一些古怪的行为。显式配置代码检查去检查没有带分号的地方可以帮助你防止这种错误。

// bad - raises exception
const luke = {}
const leia = {}
[luke, leia].forEach((jedi) => jedi.father = 'vader')// bad - raises exception
const reaction = "No! That’s impossible!"
(async function meanwhileOnTheFalcon() {// handle `leia`, `lando`, `chewie`, `r2`, `c3p0`// ...
}())// bad - returns `undefined` instead of the value on the next line - always happens when `return` is on a line by itself because of ASI!
function foo() {return'search your feelings, you know it to be foo'
}// good
const luke = {};
const leia = {};
[luke, leia].forEach((jedi) => {jedi.father = 'vader';
});// good
const reaction = "No! That’s impossible!";
(async function meanwhileOnTheFalcon() {// handle `leia`, `lando`, `chewie`, `r2`, `c3p0`// ...
}());// good
function foo() {return 'search your feelings, you know it to be foo';
}

命名规范

  • export default 导出模块A,则这个文件名也叫 A.*import 时候的参数也叫 A :
// file 1 contents
class CheckBox {// ...
}
export default CheckBox;// file 2 contents
export default function fortyTwo() { return 42; }// file 3 contents
export default function insideDirectory() {}// in some other file
// bad
import CheckBox from './checkBox'; // PascalCase import/export, camelCase filename
import FortyTwo from './FortyTwo'; // PascalCase import/filename, camelCase export
import InsideDirectory from './InsideDirectory'; // PascalCase import/filename, camelCase export// bad
import CheckBox from './check_box'; // PascalCase import/export, snake_case filename
import forty_two from './forty_two'; // snake_case import/filename, camelCase export
import inside_directory from './inside_directory'; // snake_case import, camelCase export
import index from './inside_directory/index'; // requiring the index file explicitly
import insideDirectory from './insideDirectory/index'; // requiring the index file explicitly// good
import CheckBox from './CheckBox'; // PascalCase export/import/filename
import fortyTwo from './fortyTwo'; // camelCase export/import/filename
import insideDirectory from './insideDirectory'; // camelCase export/import/directory name/implicit "index"
// ^ supports both insideDirectory.js and insideDirectory/index.js
  • 当你export default一个函数时,函数名用小驼峰,文件名和函数名一致, export 一个结构体/类/单例/函数库/对象 时用大驼峰。
function makeStyleGuide() {// ...
}export default makeStyleGuide;const AirbnbStyleGuide = {es6: {}
};export default AirbnbStyleGuide;

标准库

标准库中包含一些由于历史原因遗留的工具类

  • Number.isNaN 代替全局的 isNaN:

    // bad
    isNaN('1.2'); // false
    isNaN('1.2.3'); // true// good
    Number.isNaN('1.2.3'); // false
    Number.isNaN(Number('1.2.3')); // true
    
  • Number.isFinite 代替 isFinite

// bad
isFinite('2e3'); // true// good
Number.isFinite('2e3'); // false
Number.isFinite(parseInt('2e3', 10)); // true

类与函数

函数

  • 使用命名函数表达式而不是函数声明

    为什么?这是因为函数声明会发生提升,这意味着在一个文件里函数很容易在其被定义之前就被引用了。这样伤害了代码可读性和可维护性。如果你发现一个函数又大又复杂,且这个函数妨碍了这个文件其他部分的理解性,你应当单独把这个函数提取成一个单独的模块。不管这个名字是不是由一个确定的变量推断出来的,别忘了给表达式清晰的命名(这在现代浏览器和类似 babel 编译器中很常见)。这消除了由匿名函数在错误调用栈产生的所有假设。 (讨论)

    // bad
    function foo() {// ...
    }// bad
    const foo = function () {// ...
    };// good
    // lexical name distinguished from the variable-referenced invocation(s)
    // 函数表达式名和声明的函数名是不一样的
    const short = function longUniqueMoreDescriptiveLexicalFoo() {// ...
    };
    
  • 把立即执行函数包裹在圆括号里:

    立即执行函数:Immediately Invoked Function expression = IIFE。 为什么?因为这样使代码读起来更清晰(译者注:我咋不觉得)。 另外,在模块化世界里,你几乎用不着 IIFE。

    // immediately-invoked function expression (IIFE)
    ( ()=> {console.log('Welcome to the Internet. Please follow me.');
    }() );
    
  • 不要用 arguments 命名参数。他的优先级高于每个函数作用域自带的 arguments 对象,这会导致函数自带的 arguments 值被覆盖:

    // bad
    function foo(name, options, arguments) {// ...
    }// good
    function foo(name, options, args) {// ...
    }
    
  • 用默认参数语法而不是在函数里对参数重新赋值

    // really bad
    function handleThings(opts) {// 如果 opts 的值为 false, 它会被赋值为 {}// 虽然你想这么写,但是这个会带来一些微妙的 bug。opts = opts || {};// ...
    }// still bad
    function handleThings(opts) {if (opts === void 0) {opts = {};}// ...
    }// good
    function handleThings(opts = {}) {// ...
    }
    
  • 把默认参数赋值放在最后面

    // bad
    function handleThings(opts = {}, name) {// ...
    }// good
    function handleThings(name, opts = {}) {// ...
    }
    
  • 不要修改参数,也不要重新对函数参数赋值:

    容易导致bug,另外重新对参数赋值也会导致优化问题。

    // bad
    function f1(a) {a = 1;// ...
    }function f2(a) {if (!a) { a = 1; }// ...
    }// good
    function f3(a) {const b = a || 1;// ...
    }function f4(a = 1) {// ...
    }
    

箭头函数

  • 当需要使用箭头函数的时候,使用它,但是不要滥用

    当函数逻辑复杂时,不推荐使用箭头函数,而是单独抽出来放在一个函数里。

    // bad
    [1, 2, 3].map(function (x) {const y = x + 1;return x * y;
    });// good
    [1, 2, 3].map((x) => {const y = x + 1;return x * y;
    });
    
  • 避免箭头函数与比较操作符混淆

    // bad
    const itemHeight = (item) => item.height <= 256 ? item.largeSize : item.smallSize;// bad
    const itemHeight = (item) => item.height >= 256 ? item.largeSize : item.smallSize;// good
    const itemHeight = (item) => (item.height <= 256 ? item.largeSize : item.smallSize);// good
    const itemHeight = (item) => {const { height, largeSize, smallSize } = item;return height <= 256 ? largeSize : smallSize;
    };
    

类与构造函数

  • 使用class 语法。避免直接操作 prototype

    // bad
    function Queue(contents = []) {this.queue = [...contents];
    }
    Queue.prototype.pop = function () {const value = this.queue[0];this.queue.splice(0, 1);return value;
    };// good
    class Queue {constructor(contents = []) {this.queue = [...contents];}pop() {const value = this.queue[0];this.queue.splice(0, 1);return value;}
    }
  • extends 实现继承:

    为什么?它是一种内置的方法来继承原型功能而不破坏 instanceof

    // bad
    const inherits = require('inherits');
    function PeekableQueue(contents) {Queue.apply(this, contents);
    }
    inherits(PeekableQueue, Queue);
    PeekableQueue.prototype.peek = function () {return this.queue[0];
    }// good
    class PeekableQueue extends Queue {peek() {return this.queue[0];}
    }
    
  • 方法可以返回 this 来实现链式调用

// bad
Jedi.prototype.jump = function () {this.jumping = true;return true;
};Jedi.prototype.setHeight = function (height) {this.height = height;
};const luke = new Jedi();
luke.jump(); // => true
luke.setHeight(20); // => undefined// good
class Jedi {jump() {this.jumping = true;return this;}setHeight(height) {this.height = height;return this;}
}const luke = new Jedi();luke.jump().setHeight(20);
  • 自定义 toString() 方法是可以的,但需要保证它可以正常工作
class Jedi {constructor(options = {}) {this.name = options.name || 'no name';}getName() {return this.name;}toString() {return `Jedi - ${this.getName()}`;}
}
  • 如果没有特别定义,类有默认的构造方法。一个空的构造函数或只是代表父类的构造函数是不需要写的。
// bad
class Jedi {constructor() {}getName() {return this.name;}
}// bad
class Rey extends Jedi {// 这种构造函数是不需要写的constructor(...args) {super(...args);}
}// good
class Rey extends Jedi {constructor(...args) {super(...args);this.name = 'Rey';}
}

模块

  • 使用(import/export)模块
// bad
const AirbnbStyleGuide = require('./AirbnbStyleGuide');
module.exports = AirbnbStyleGuide.es6;// ok
import AirbnbStyleGuide from './AirbnbStyleGuide';
export default AirbnbStyleGuide.es6;// best
import { es6 } from './AirbnbStyleGuide';
export default es6;
  • 不要导出可变的东西:

变化通常都是需要避免,特别是当你要输出可变的绑定。虽然在某些场景下可能需要这种技术,但总的来说应该导出常量。

// bad
let foo = 3;
export { foo }// good
const foo = 3;
export { foo }
  • import JavaScript文件不用包含扩展名
// bad
import foo from './foo.js';
import bar from './bar.jsx';
import baz from './baz/index.jsx';// good
import foo from './foo';
import bar from './bar';
import baz from './baz';

迭代器与生成器

  • 不要用迭代器。使用 JavaScript 高级函数代替 for-infor-of

    用数组的这些迭代方法: map() / every() / filter() / find() / findIndex() / reduce() / some() / ... , 对象的这些方法 Object.keys() / Object.values() / Object.entries() 得到一个数组,就能去遍历对象。

    const numbers = [1, 2, 3, 4, 5];// bad
    let sum = 0;
    for (let num of numbers) {sum += num;
    }
    sum === 15;// good
    let sum = 0;
    numbers.forEach((num) => sum += num);
    sum === 15;// best (use the functional force)
    const sum = numbers.reduce((total, num) => total + num, 0);
    sum === 15;// bad
    const increasedByOne = [];
    for (let i = 0; i < numbers.length; i++) {increasedByOne.push(numbers[i] + 1);
    }// good
    const increasedByOne = [];
    numbers.forEach((num) => {increasedByOne.push(num + 1);
    });// best (keeping it functional)
    const increasedByOne = numbers.map((num) => num + 1);
    

提升

  • var 声明会被提前到离他最近的作用域的最前面,但是它的赋值语句并没有提前。constlet 被赋予了新的概念 暂时性死区 (TDZ)。 重要的是要知道为什么 typeof 不再安全。
// 我们知道这个不会工作,假设没有定义全局的 notDefined
function example() {console.log(notDefined); // => throws a ReferenceError
}// 在你引用的地方之后声明一个变量,他会正常输出是因为变量提升。
// 注意: declaredButNotAssigned 的值 true 没有被提升。
function example() {console.log(declaredButNotAssigned); // => undefinedvar declaredButNotAssigned = true;
}// 可以写成如下例子, 二者意义相同。
function example() {let declaredButNotAssigned;console.log(declaredButNotAssigned); // => undefineddeclaredButNotAssigned = true;
}// 用 const,let就不一样了。
function example() {console.log(declaredButNotAssigned); // => throws a ReferenceErrorconsole.log(typeof declaredButNotAssigned); // => throws a ReferenceErrorconst declaredButNotAssigned = true;
}
  • 已命名函数表达式提升他的变量名,不是函数名或函数体
function example() {console.log(named); // => undefinednamed(); // => TypeError named is not a functionsuperPower(); // => ReferenceError superPower is not definedvar named = function superPower() {console.log('Flying');};
}// 函数名和变量名一样是也如此。
function example() {console.log(named); // => undefinednamed(); // => TypeError named is not a functionvar named = function named() {console.log('named');};
}

比较运算符与相等

  • ===!== 严格比较而不是 ==!=

  • 条件语句,例如if语句使用coercion与tobooleant抽象方法评估它们的表达式,始终遵循这些简单的规则:

    • Objects evaluate to true
    • Undefined evaluates to false
    • Null evaluates to false
    • Booleans evaluate to the value of the boolean
    • Numbers evaluate to false if +0, -0, or NaN, otherwise true
    • Strings evaluate to false if an empty string '', otherwise true
if ([0] && []) {// true// an array (even an empty one) is an object, objects will evaluate to true
}
  • 三元表达式不应该嵌套,尽量保持单行表达式
// bad
const foo = maybe1 > maybe2? "bar": value1 > value2 ? "baz" : null;// better
const maybeNull = value1 > value2 ? 'baz' : null;const foo = maybe1 > maybe2
? 'bar': maybeNull;// best
const maybeNull = value1 > value2 ? 'baz' : null;const foo = maybe1 > maybe2 ? 'bar' : maybeNull;

事件

  • 当把数据载荷传递给事件时(例如是 DOM 还是像 Backbone 这样有很多属性的事件)。这使得后续的贡献者(程序员)向这个事件添加更多的数据时不用去找或者更新每个处理器。
// bad
$(this).trigger('listingUpdated', listing.id);// ...$(this).on('listingUpdated', (e, listingID) => {// do something with listingID
});

类型转换与强制转换

  • 字符串
// => this.reviewScore = 9;// bad
const totalScore = new String(this.reviewScore); // typeof totalScore is "object" not "string"// bad
const totalScore = this.reviewScore + ''; // bad
const totalScore = this.reviewScore.toString(); // 不保证返回 string// good
const totalScore = String(this.reviewScore);
  • 数字: 用 Number 做类型转换,parseInt 转换 string 应总是带上进制位
const inputValue = '4';// bad
const val = new Number(inputValue);// bad
const val = +inputValue;// bad
const val = inputValue >> 0;// bad
const val = parseInt(inputValue);// good
const val = Number(inputValue);// good
const val = parseInt(inputValue, 10);
  • 移位运算要小心

    移位运算对大于 32 位的整数会导致意外行为。Discussion. 最大的 32 位整数是 2,147,483,647:

2147483647 >> 0 //=> 2147483647
2147483648 >> 0 //=> -2147483648
2147483649 >> 0 //=> -2147483647

推荐资源

  • 网站:

    • MDN: 不管你是仅仅开始入门、学过一点基础或者是个网站开发老手,你都能在这里找到有用的资源。
    • JS周刊 : 你可以在这里,接收到JS社区里最新的动态,其他开发者编写的优秀工具,阅读优秀的文章。
    • 印记中文 : JS及其前端领域的文档集合。
  • 书籍(为了尊重作者的版权,下列书籍仅开源书籍提供链接):

    • JavaScript权威指南(原书第7版)
    • 你不知道的JS
    • Eloquent JavaScript

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794102.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 刷题—树

不会做简单题目的小菜菜!一:树 1、树描述的是一个父子关系;有节点;根节点;叶子节点三个相关的概念 2、树的高度;深度;层 3、二叉树:每个节点最多只有两个孩子 4、完全二叉树:除了叶子节点;每个孩子并不要求都为两个孩子(从上到下,从左到右依次填满节点) 5、满二叉…

软件安装——STM32开发

安装Keil5 MDK 安装器件支持包 软件注册 安装STLINK驱动 安装USB转串口驱动安装Keil5 MDK 下载链接(来自B站江协科技) 通过百度网盘分享的文件:STM32入门教程资料 链接:https://pan.baidu.com/s/17_sbwMXU-xBVFA2sK0smrg?pwd=cgn6 提取码:cgn6 解压并安装Keil5MDK安装包中…

findbi测试连接失败

导入的jar包没问题,然后装一个隔离包如下名字。因为没重启

A Fast and High Quality Multilevel Scheme for Partitioning Irregular Graphs

目录概METISCoarseningPartitioning phaseUncoarsening phaseKarypis G. and Kumar V. A fast and high quality multilevel scheme for partitioning irregular graphs. SIAM, 1998.概 本文提出了一种 multilevel graph partitioning 方法. METISMETIS 的思想比较简单:首先对原…

小猪佩奇学英语——第五天——hide and seek

例句hide and seek,捉迷藏seek,寻找 find,找到了It is Georges turn to hide.Its our turn.用 is 是因为虽然我们是2个以上的人,但是我们是一组,轮到我们的只有一轮,所以是单数。 Its your turn.轮到你们了 Its theri turn.轮到他们了。Its sbs turn to .... 轮到某人做某…

小猪佩奇学英语——第六天——The Playgroup

第六天——The Playgroup 例句George,are you looking forward to the playgroup?乔治,你现在是不是正期待去托儿所。 look forward to sth 期待某物 look forward to doing...期待做某事 用looking表示正期待....maybe George is too small to go to my playgroup?too +形容…

实现人形角色的攀爬

在Unity实现角色攀爬 前言 开放世界类型的游戏近年也热门起来了,自由攀爬也成了这一类游戏的一大特色。攀爬给了玩家更多探索路径的选择,也让地图设计有了更多思路。这次,我们就来尝试在Unity中制作一个人形角色的攀爬。注:攀爬是一个角色完整动作系统的一部分,本文暂且抛…

LVDS(FPGA)

差分输入时钟缓冲器(IBUFDS)点击查看代码// IBUFDS: Differential Input Buffer// 7 Series// Xilinx HDL Language Template, version 2024.1IBUFDS #(.DIFF_TERM("FALSE"), // Differential Termination.IBUF_LOW_PWR("TRUE"), // L…

51nod 石子分配

可以发现步数限制把数轴变为了环。环之间不可以交换,环内相邻两点可以交换,然后我们只需要对每个环操作,最后累加。 对于环上的每个石子堆,我们需要将其石子数调整到均值 \(avg\)。因此,我们首先计算每个堆石子相对于 \(avg\) 的偏差,即 \(nowa[i] - avg\)。 因为相邻节点…

马哥教育C10网络安全课第四周作业2024_0831

网络安全C10-2024.8.31 作业: 1、安装burp并实现抓取HTTP站点的数据包(HTTPS站点暂时不要求) (1)安装Java 1.8.144; 设定操作系统环境变量 - JAVA_HOME jdk文件夹的绝对路径 例: JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144 - CLASSPATH CLASSJPATH=.;%JAVA_HOME%\lib…

十年来(2015-2024)植物/农学领域有哪些学者戴上了杰青帽子?

2024年杰青建****议资助项目申请人名单(部分名单)(注:该表只是统计现公布的名单,欢迎留言补充) 2023年杰青建议资助项目申请人名单2022年杰青建议资助项目申请人名单2020年杰青建议资助项目申请人名单2019杰青建议资助项目申请人名单2018杰青建议资助项目申请人名单2017杰…

Nature Comm. | CoPheScan:一种考虑连锁不平衡的全表型组关联分析

分享一篇最近发表在NC的一篇文章:CoPheScan: phenome-wide association studies accounting for linkage disequilibrium。文章介绍了一种新的贝叶斯方法CoPheScan(Coloc adapted Phenome-wide Scan),用于在考虑连锁不平衡(LD)的情况下进行表型范围关联研究(Phenome-wid…