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
}
- css多行文本隐藏
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
- 创建稀疏数组和密集数组
let arr1 = new Array(81)//稀疏属猪不能用forEach、map方法
let arr2 = Array.apply(null,{length: 81})// 直接创建了81个用undefined填充的密集数组,可以使用数组的遍历方法
- object 转map
let o1 = {a:1,b:2}
let map = new Map(Object.entries(o1))
- for...in...循环性能较差,既可以迭代公有的也可以迭代私有的,迭代‘可枚举非Symbol属性’
- 获取对象所有的私有属性,不论是否可枚举, 不论类型的解决方案
- 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
- 为元素设置属性[自定义/内置]
- 方法一: 元素.属性=属性值 (内置的特殊性)
- 这种方式,对于内置属性,是设置在元素的标签上, 对于自定义属性来讲,是给对象的堆内存空间增加新的成员(不会设置在标签上)
- 获取: 元素.属性
- 删除: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)
- 只是不能新增,其余操作都可以进行操作
- "use strict": JS严格模式
fn.call(null) // 如果开启了严格模式this就是null,如果没有开启严格模式就是window
- 双问号 ?? 只处理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'))//后面的代码会继续执行, 但是value是undefined了
// 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()