不常用的小方法(整理中)

110 阅读3分钟
  1. JSON.stringify(obj,replacer,1)
let obj = {
  name: 'Bob',
  age: 18
}
// 第三个参数是数字代表缩进多少
console.log(JSON.stringify(obj, replacer, 1))


function replacer(key, value) {
  if (key == 'age') {
    return value + 10
  } else {
    return value;
  }
}
  • 输出:
{
 "name": "Bob",
 "age": 28
}
  1. css多行文本隐藏
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
  1. 创建稀疏数组和密集数组
let arr1 = new Array(81)//稀疏属猪不能用forEach、map方法
let arr2 = Array.apply(null,{length: 81})// 直接创建了81个用undefined填充的密集数组,可以使用数组的遍历方法

  1. object 转map
let o1 = {a:1,b:2}
let map = new Map(Object.entries(o1))
  1. for...in...循环性能较差,既可以迭代公有的也可以迭代私有的,迭代‘可枚举非Symbol属性’
  2. 获取对象所有的私有属性,不论是否可枚举, 不论类型的解决方案
  • Object.getOwnPropertyNames(obj) : 获取对象非Symbol类型的私有属性(无关是否可美剧)
  • Object.getOwnPropertySymbols(obj): 获取Symbol类型的私有属性
//获取所有私有属性
let keys = Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj))
// es6的reflect更加简单
let keys = Reflect.ownKeys(arr)// 不兼容ie
  1. 为元素设置属性[自定义/内置]
  • 方法一: 元素.属性=属性值 (内置的特殊性)
  • 这种方式,对于内置属性,是设置在元素的标签上, 对于自定义属性来讲,是给对象的堆内存空间增加新的成员(不会设置在标签上)
  • 获取: 元素.属性
  • 删除:delete 元素.属性
  • 方法二: 元素.setAttribute(属性,属性值)
  • 这种方式直接写在标签上
  • 获取: getAttribute
  • 删除: removeAttribute

8.对象的冻结、密封、扩展性

  • 1.
    • 冻结:被冻结的对象不能修改成员值,不能新增、不能删除、不能用Object.defineProperty做劫持
Object.freeze(obj) // 冻结对象
Object.isFrozen(obj) // 检测是否被冻结
  • react父组件传给子组件的props就是被冻结了的并且被密封了的
    • 密封: Object.seal(obj)被密封的对象可以修改,但是不能新增,不能删除,也不能用Object.defineProperty做劫持
    • 扩展:把对象设置为不可扩展的: Object.preventExtensions(obj)
    • 检测对象是否可以扩展: Object.isExtensible(obj)
    • 只是不能新增,其余操作都可以进行操作
  1. "use strict": JS严格模式
fn.call(null) // 如果开启了严格模式this就是null,如果没有开启严格模式就是window
  1. 双问号 ?? 只处理null 和 undefined
0 ?? 123 // 0
false ?? 1 // false
undefined ?? 123 //123
null ?? 123 // 123

11.生成器函数

const fn = function * fn() {
  console.log('AA')
  yield 100;
  console.log('BB')
  yield 200;
  console.log('CC');
  yield 300
  console.log('DD')
  return 400
}
let itor = fn()
console.log(itor.next())
console.log(itor.next())
console.log(itor.return('hhh'))//后面的代码会继续执行, 但是valueundefined了
// console.log(itor.throw('停止'))//手动抛出异常,后面的代码不会执行
console.log(itor.next())

const fn = function * fn(...params) {
  console.log('AA')
  let x = yield 100;
  console.log(x)
  console.log('BB')
  let y = yield 200;
  console.log(y)
  console.log('CC');
  yield 300
  console.log('DD')
  return 400
}
let itor = fn(10,20)
console.log(itor.next())
console.log(itor.next('two'))
console.log(itor.next('three'))
const sum = function * sum() {
  yield 300
  yield 400
}
const fn = function * fn(...params) {
  let x = yield 100;
  let y = yield 200;
  yield * sum()
  return 500
}
let itor = fn(10,20)
console.log(itor.next())
console.log(itor.next('two'))
console.log(itor.next('three'))
console.log(itor.next('three'))
console.log(itor.next('three'))

const delay = function(interval) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(`@@${interval}`)
    },interval)
  })
}
console.log(delay(1000))
const handle = function *() {
  console.log('1')
  let x = yield delay(1000)
  console.log(x)
  console.log('2')
  let y = yield delay(2000)
  console.log(y)
  console.log('3')
  return '4'
}
const AsyncFunction = function AsyncFunction(...params) {
  let itor = handle(...params)
  const next = x => {
    let {done,value} = itor.next(x)
    if(done) return
    if(!(value instanceof Promise)) value = Promise.resolve(value)
    value.then(x => next(x))
  }
  next()
}
AsyncFunction()