木灵鱼儿
阅读:2293
做个笔记 判断对象中是否存在某个属性
本来是一个很简单的需求:
const a = {
b:1
}
本来我的需求是判断,这个a对象里面b是否存在,但是b的值不确定,他可能是布尔值false,也可能是数字0,或者是空字符。
那么if(a.b)
就不太行了,一般来说,老前端一般都是用in
操作符。
"b" in a; //true
但是es6后,一般来说,不建议这样使用的,同时不建议的还有delete
操作符。
于是问了下群友,因为我记得es6有那么一个方法,可以判断一个对象的属性是否存在,并且不会去查prototype上的内容。但是我忘了啥名字来着!
const a = {
b:1
}
a.hasOwnProperty("b"); //true
到这,基本上就行了,函数式操作判断,新的特性,完美达到我的要求!
但是,群友的又开始骚操作了
const a = {
hasOwnProperty: () => '傻了吧',
}
a.hasOwnProperty("b"); //"傻了吧"
好家伙,直接就给覆盖了继承的hasOwnProperty方法,这我就很尴尬了。
最后迫于无奈,为了准确性,我们还得这么写:
Object.prototype.hasOwnProperty.call(target,key);
但是我call基本没怎么用过,是个短板,这个可能也记不住,记个笔记!
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。

相关推荐
Promise失败重试,可指定重试次数
//模拟异步请求 function axiosFn() { return new Promise((resolve, reject) => { const flge = Math.random(); //随机值 setTimeout(() => { //大于0.7就是成功 if (flge > 0.7) { return resolve(flge); } else { return reject(...
animation 动画的三个事件
const div = document.querySelector("div.box"); div.addEventListener("animationstart", function() { //动画开始运行触发 }); div.addEventListener("animationiteration", function() { //动画每执行一次触发一次,适用用多次动画 }); div.addEventListener("animationend", function() { //...
手写Promise
/* * @Author: mulingyuer * @Date: 2021-12-30 22:06:58 * @LastEditTime: 2022-01-03 05:22:30 * @LastEditors: mulingyuer * @Description: 手写promise * @FilePath: \undefinedc:\Users\13219\Desktop\promise.js * 怎么可能会有bug!!! */ /** * @description: 自定义promise * @param {fucntion} executor 执行器函数(同...
深度合并对象的方法
找了很久,现有的库有两个:1. Mergenpm地址: Merge用法:import merge from 'merge'; const obj1 = { name: 2}; const obj2 = { value: 1 }; //合并 merge(obj1,obj2); console.log(obj1); //{name:2,value:1} //克隆合并-与目标对象无关联 const obj3 = merge(true,obj1,obj2); console.log(obj3); //{name:2,value:1} console.log(obj3 === obj1)...
利用JSON过滤对象和数组中指定的key属性
有时候我们在vue中进行for循环,就会涉及到绑定唯一值key的问题,但是并不是任何时候都会存在所谓的唯一值,使用index下标明显是不合适的,官方也不推荐,除非你for循环出来的列表不用变化。所以一般常用的做法就是给for循环的对象添加一个属性,属性的值是随机的uuid或者时间戳。这样前端问题解决了,如果遍历的数据还需要提交到后端,那么不就多了一个属性,这个属性后端不需要的。所以,我们需要在提交数据前,对数据进行过滤。过滤又得for循环删除?那怎么行,有没有那种通用的,简单的方法。过滤方法/** * @description: 过滤对象中指定的属性,也可以拿来浅拷贝 * @para...
Copy 一个复制操作的类
前言js有一个31k多的star的开源复制库:clipboard.js;但是一些简单复制并不想安装一个库来解决,所以就想自己写一个。copy所需要的东西Selection 对象用于获取被用户选中的部分,通过toString()方法可以获取被选中的文本内容,以及js操作选中。MDN文档:SelectionexecCommand 对象用于以命令的形式来操作网页的内容,说白了就是用它来实现复制文本操作,复制的是选中的文本MDN文档:execCommand 需要注意的是,execCommand在未来将会被遗弃,因为这个api本身是从ie浏览器那边继承的,久而久之各大浏览器都对其做了兼容,虽然...
对象扁平化
前言后端返回给前端的数据,有时候会是一个多层级对象,但是我们前端使用的时候,for循环遍历渲染时,多层级对象往往需要进行单独处理,因为还需要判断这个key值是否存在,否则会报错。强行让后端改变数据结构又好像不现实,无奈,只有自己处理了。掘金看到一位大佬文章《【算法】JS 实现对象的扁平化》感觉很合适,逻辑清晰。要求将对象中的层级扁平化,改成如下格式:// 实现一个 flatten 函数,实现如下的转换功能 const obj = { a: 1, b: [1, 2, { c: true }], c: { e: 2, f: 3 }, g: null, }; // 转换为 l...
javascript 生成随机密码,指定位数,难度(大小写、数字、特殊字符)
原理也没啥好藏着掖着的,就是为了保证密码难度,开头的字符一定是满足安全需要的,比如要求大小写数字加特殊字符,那么开头四位就一定是:大写一位、小写一位、数字一位、特殊字符一位;然后剩下的随机。/** * @description: 随机密码 * @param {*} len 密码位数 * @param {*} mode 密码难度:hide(大小写数字特殊字符)、medium(大小写数字)、low(小写数字) * @Date: 2021-07-02 15:52:32 * @Author: mulingyuer */ export const randomPass = functi...
我杰哥
Google Chrome Windows 10到底是哪个群友,发的“傻了吧”
铁牛
Google Chrome Windows 10let a = {
b: 1
}
function hasOwnProperty1 (target, key) {
return Function.prototype.call.bind(Object.prototype.hasOwnProperty)(target, key)
}
function hasOwnProperty2 (target, key) {
return Object.prototype.hasOwnProperty.call(target, key)
}
console.log(hasOwnProperty1(a, 'b'));
console.log(hasOwnProperty2(a, 'b'));[调皮]
木灵鱼儿
FireFox Windows 10好家伙,你用函数对象运行Object的方法???有什么特殊用意吗?[tv_疑问]
铁牛
Google Chrome Windows 10[doge]在这里没啥卵用,但是可以让代码看起来更难懂。
木灵鱼儿
FireFox Windows 10[妙啊]妙啊妙啊。。。
铁牛
Google Chrome Windows 10function hasOwnProperty () {
return Function.prototype.apply.bind(Object.prototype.hasOwnProperty);
}
//使用方法
a.hasOwnProperty('b')
木灵鱼儿
FireFox Windows 10hasOwnProperty 方法都没运行,你a.hasOwnProperty触发的还是原生方法