const arr = Array(n).fill().map((_,i)=>i+1); //初始化一个 1~n 的数组
const arr =[...Array(n).keys()];
const arr = Array.from(Array(n).keys());
Array(n).fill()创建密数组
简单实现加法
function bitAdd(m, n) {
while (m) {
[m, n] = [(m & n) << 1, m ^ n];
}
return n;
}
bitAdd(45, 55); //100
实现乘法
function multiply7(num) {
let sum = 0;
for (var i = 0; i < 7; i++) {
sum = bitAdd(sum, num);
}
return sum;
}
multiply7(7); //49
深克隆(有些特殊情况失效)
function isObj(val) {
return (Object.prototype.toString === "[object Object]"); // 第二个单词要大写
}
function deepClone(val) {
let res = Array.isArray(val) ? [] : {};
for (let e in val) {
res[e] = isObj(e) ? deepClone(val(e)) : val[e];
}
return res;
}
两个对象使用 == 或者 ===会判断它们的内存地址是否相等,使用一个技巧
JSON.stringify(arr)
转换为JSON再判断相等
const fib = (num) => {
if (num === 0 || num === 1) {
return num
} else {
return fib(num - 1) + fib (num -2)
}
}
console.log(fib(10))
这样写,函数重复计算次数太多,不利于性能
todo: 使用函数记忆优化该函数
数组扁平化
const flattenDeep = (arr) => Array.isArray(arr)
? arr.reduce( (a, b) => [...a, ...flattenDeep(b)] , [])
: [arr]
flattenDeep([1, [[2], [3, [4]], 5]])
function flatArray(arr) {
let res = [];
for (let i = 0; i < arr.length; i++) {
// concat()不能改变原数组,可以合并非数组类型
let e = Array.isArray(arr[i]) ? flatArray(arr[i]) :(arr[i]);
res = res.concat(e);
}
return res;
}
function flatArray(arr) {
return arr.reduce((prev, next) =>
prev.concat(Array.isArray(next) ? flatArray(next) : next),[]);
}
const flatArray = (arr) => arr.reduce((prev, next) => prev.concat(Array.isArray(next) ? flatArray(next) : next),[]);
let test = [1, 25, [5, 7, [6,8], 10], 9, []];
console.log(flatArray(test));
console.log(flattenArray(test));
todo: 写注释解释函数
List对象
function List() {
this.val = []
[...arguments].map(item => {
this.val.push(item)
})
this.length = this.val.length
}
List.prototype.add = function () {
[...arguments].map(item => {
this.val.push(item)
})
this.length = this.val.length
}
List.prototype.all = function () {
return this.val
}
题外:
使用for of循环对象
function* objectEntries(obj) {
let propKeys = Reflect.ownKeys(obj);
for (let propKey of propKeys) {
yield [propKey, obj[propKey]];
}
}
let jane = { first: ‘Jane’, last: ‘Doe’ };
for (let [key, value] of objectEntries(jane)) {
console.log(${key}: ${value}
);
}
// first: Jane
// last: Doe
一个很有意思的base标签
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/base
多列等高布局
.Article{
overflow: hidden;
}
.Article>li{
float: left;
margin: 0 10px -9999px 0;
padding-bottom: 9999px;
background: #4577dc;
width: 200px;
color: #fff;
}
.Article>li>p{
padding: 10px;
}