每日JavaScript - 22(待整理的代码)

本文深入探讨了JavaScript中数组初始化、位运算实现加法与乘法、深克隆的简易实现、斐波那契数列的高效计算以及数组扁平化的多种方法。同时,文章还介绍了List对象的自定义实现及迭代器模式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值