判断质数
const isPrime = num => { let bount = Math.floor(Math.sqrt(num)) for (let i = 2; i <= bount; i++) { if (num % i === 0) { return false } } return num >= 2 }
getBoundingClientRect
获取页面元素的位置和判断元素是否在可视区域
getBoundingClienetRect
用于获取页面中某个元素的上,下,左,右,分别相对浏览器的位置
- 该函数返回一个object 对象, 改对象有6个属性
top,left,right,bottom,widht,height
- width,height 是元素自身的宽高
const { innerHeight, innerWidth } = window; 视口的宽度,高度
isObject
const isObject = obj => obj === Object(obj); EXAMPLES isObject([1, 2, 3, 4]); // true isObject([]); // true console.log({}===Object({})) //false 其实应该这样理解
Intl.NumberFormat
格式化数据类
const formatter = new Intl.NumberFormat('en'); formatter.format(987654.321); // → '987,654.321' formatter.formatToParts(987654.321); // → [ // → { type: 'integer', value: '987' }, // → { type: 'group', value: ',' }, // → { type: 'integer', value: '654' }, // → { type: 'decimal', value: '.' }, // → { type: 'fraction', value: '321' } // → ]虽然可以通过
Number.prototype.toLocaleString
来实现
紧密计法是使用特定于语言环境的符号来表示大数字。它是科学计数法的一种更人性化的替代方案:
const formatter = new Intl.NumberFormat('en', { notation: 'compact', }); formatter.format(1234.56); // → '1.2K' formatter.format(123456); // → '123K' formatter.format(123456789); // → '123M'
encodeURI 和encodeURIComponent 区别
暂时觉得
encodeURIComponent
是最新的,解决了原有会出现的问题
toPrecision
指定的精度返回该数值对象的字符串
let numObj=5.1234567 console.log(numObj.toPrecision(1)) //5 console.log(numObj.toPrecision(3)) //5.12 console.log(numObj.toPrecision(5)) // 5.1235 会四舍五入 console.log(numObj.toFixed(4)) // 5.1235 跟toFixed 保持一致 let numObj1=51234.21 console.log(numObj1.toPrecision(2)) //5.1e+4 这种情况就以指数表示法返回
**
的优先权比*/
高
2/123**0 // 2
内存换算
const prettyBytes = (num) => { const UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] if (Math.abs(num) < 1) { return num + UNITS[0] } // 指数 const exponent = Math.min(Math.floor(Math.log10(num < 0 ? -num : num) / 1000), UNITS.length - 1) const n=(num<0?-num:num)/1000**exponent.toPrecision(3) return num<0?'-':''+n+UNITS[exponent] }
requestAnimationFrame
重绘后执行的动画,可以做逐帧动画
简单的说调用一次动画,就重绘一次动画
平滑滚动到页面顶部
export const scrollToTop = () => { const c = document.documentElement.scrollTop || document.body.scrollTop; if (c > 0) { window.requestAnimationFrame(scrollToTop); window.scrollTo(0, c - c / 8); } };
滚动到指定元素区域
const smoothScroll = element =>{ document.querySelector(element).scrollIntoView({ behavior: 'smooth' }); };
时间操作
获取当前时间戳
Date.parse(new Date()) //精确到秒 new Date().getTime()
前一天/后一天的时间戳
+new Date()-28*60*60*1000 +new Date()-24*60*60*1000
css 实用属性: pointer-events
当pointer-events:none
,他有如下相关特性
- 阻止用户的点击动画产生任何效果
- 阻止缺省鼠标指针的显示
- 阻止css里的hover和active状态的变化触发事件
- 阻止javascript点击动作触发的事件
可以考虑给页面加一个遮罩的时候使用这个
proxy
let person = { name: 'tom', age: 20, _aaa: 12 } const defaults = (obj, inital) => { return new Proxy(obj, { // get方法有三个参数,目标对象,属性名,proxy实例本身 get(obj, prop) { if (prop[0] === '_') {//属性带有_是私有属性,禁止访问 throw new Error('报错') } if (prop in obj) { return obj[prop] } return inital //设置默认值 } }) } let obj = defaults(person, '默认') //set方法可以拦截对属性的赋值操作, // 接受四个参数,分别是目标对象,属性名,属性值,proxy实例 // 验证规则 const validators = { name: { validate(value) { return value.length > 6 }, message: '用户名长度不能小于六' }, password: { validate(value) { return value.length > 10 }, message: '密码长度不能小于十' }, moblie: { validate(value) { return /^1(3|5|7|8|9)[0-9]{9}$/.test(value) }, message: '手机号格式错误' } } function validator(obj, validators) { return new Proxy(obj, { set(obj, key, value) { const validator = validators[key] if (value == null || value == '') { console.log('输入的不能为空') } else if (validator.validate(value)) { obj[key] = value } else { console.log(validator.message) } } }) } let form = {} form = validator(form, validators) form.name = '' //输入的不能为空 form.name='1' // 用户名长度不能小于六
apply
一般拦截函数的调用,接受三个目标参数,目标对象,上下文对象(this),参数数组
通过
apply
方法可以获取到函数的执行次数function log() {} const func = new Proxy(log, { _count: 0, apply(target, context, args) { target.apply(context, args); console.log(`this function has been called ${++this._count} times`); } }) func()
construct
拦截
new
操作符接受三个参数: 目标对象, 构造函数的参数列表,Proxy对象
function noop() {} const Person = new Proxy(noop, { construct(target, args, newTarget) { return { name: args[0], age: args[1] } } }) const a = new Person('tom', 21); // { name: 'tom', age: 21 }
泛类
function add<T>(a: T): T { return a } // 如果我们想知道传的参数的长度 function add1<T>(a: T[]): T[] { console.log(a.length); return a } // 也可以写成这样 function add2<T>(a: Array<T>): Array<T> { return a } interface Gener { <T>(arg: T): T; } // 赋值 let a: Gener = add; // 一个相似的例子 interface Gener1<T> { (arg: T): T; } let b: Gener1<number> = add;
typescript 使用类型报错问题
类型断言
类型守卫
双重断言
**类型断言** 值 as 类型 function padLeft(value: string, padding: string | number) { // 报错: // types 'string | number' => 'number' return Array(padding + 1).join(" ") + value; } 解决方法 直接强转 function padLef(value: string, padding: string | number) { return Array(+padding + 1).join('') + value } 断言 function padLef(value: string, padding: string | number) { return Array(padding as number + 1).join('') + value }
类型守卫
- typeof: 用于判断 "number","string","boolean"或 "symbol" 四种类型.
- instanceof : 用于判断一个实例是否属于某个类
- in: 用于判断一个属性/方法是否属于某个对象
- 字面量类型保护
function padLeft(value: string, padding: string | number) { if (typeof padding === 'number') { return Array(padding + 1).join(' ') + value; //正常 } if (typeof padding === 'string') { return padding + value; } } class Man { handsome = 'handsome'; } class Woman { beautiful = 'beautiful'; } function Human(arg: Man | Woman) { if (arg instanceof Man) { console.log(arg.handsome); } else { // 这一块中一定是 Woman console.log(arg.beautiful); } } interface B { b: string; } interface A { a: string; } function foo(x: A | B) { if ('a' in x) { return x.a; } return x.b; } 字面量类型保护 type Man = { handsome: 'handsome'; type: 'man'; }; type Woman = { beautiful: 'beautiful'; type: 'woman'; }; function Human(arg: Man | Woman) { if (arg.type === 'man') { console.log(arg.handsome); console.log(arg.beautiful); // error } else { // 这一块中一定是 Woman console.log(arg.beautiful); } }
typescript 在angular中一些新特性
export class NewComponent implements OnInit { public a = {b: 2}; public b; // 空值联合 public c = this.b??'22'; constructor() { }; ngOnInit(): void { console.log(this.a?.b); } }
删去某个属性
let a = { name: 'xxx', age: 123, address: { name: 'xxx' } } let {name, ...g} = a console.log(g) // { age: 123, address: { name: 'xxx' } }
来源:https://www.cnblogs.com/fangdongdemao/p/12572090.html