深入探究 JavaScript
instanceof
- 运算符用于检测
构造函数
的prototype
属性是否出现在某个实例对象
的原型链
上。
// 手写一个 instanceof
function MyinstanceOf(child, parent) {
if (typeof child != 'object' || child == null) return false;
let proto = Object.getPrototypeOf(child);
while (true) {
if (proto === null) return false;
if (proto === parent.prototype) return true;
proto = Object.getPrototypeOf(proto);
}
}
Object.getPrototypeOf ({})
- 该方法返回
指定对象
的原型
(内部[[Prototype]]
属性的值)。let obj = { name: "小黑", gender: 1, age: 13 } console.log(Object.getPrototypeOf(obj));
Object.defineProperty()
- 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
configurable
该属性的描述符是否可修改enumerable
是否可枚举value
值writable
值是否可修改
// 禁止对 obj 的 name 属性进行描述符设置 Object.defineProperty(obj, 'name', { configurable: false, }) // 设置的 时候报错 Object.defineProperty(obj, 'name', { enumerable: false, })
// 允许 对 obj 的 name 属性进行属性设置 Object.defineProperty(obj, 'name', { configurable: true, }) // obj 的 name 属性不可被枚举 Object.defineProperty(obj, 'name', { enumerable: false, }) for (let item in obj) { console.log(item); // 输出 gender age }
// 允许 对 obj 的 name 属性进行属性设置 Object.defineProperty(obj, 'name', { configurable: true, }) // obj 的 name value 值不可被修改 Object.defineProperty(obj, 'name', { writable: false, }) obj.name = '小白'; console.log(obj);
Object.getOwnPropertyDescriptors()
-
方法用来获取一个对象的所有自身属性的描述符。
console.log(Object.getOwnPropertyDescriptors(obj));
Object.create()
-
方法创建一个新对象,使用现有的对象来提供新创建的对象的
__proto__
。 -
可以用它实现继承。
-
两个参数,一个传入对象,一个传入
Object.getOwnPropertyDescriptors()
的第二个属性,新创建的对象添加指定的属性值和对应的属性描述符let obj2 = Object.create(obj, { addr: { configurable: true, enumerable: false, writable: true, value: 'bj' } })
Reflect.ownKeys()
-
返回一个由目标对象自身的属性键组成的数组。
console.log(Reflect.ownKeys(obj));
slice
-
提取字符串的 一部分 如果是负数 (负数加上字符串长度)
let str = 'hello world'; console.log(str.slice(0,-6)); // hello
数据类型转换
- 强制数据类型转换
Number()
ParentInt()
ParentFloat()
toString()
String()
Boolean()
Number()
方法转换Symbal类型
会报错- 6大假值
null
undefined
''
0
NaN
false
- 隐式类型转换
- == 转换规则
- 其中一边为
null
和undefined
,另一边必须为null
和undefind
否则 返回false
- 其中一边为
boolean
类型 ,那么转换成number
- 如果一边为
object
另一边为string
number
symbol
,把object
转换成 基本数据类型再进行转换 - 如果两边操作值为
number
和string
类型 ,都转成number
进行比较
- 其中一边为
- + 转换规则
- 不能把
BigInt
和Number
类型直接混合相加
- 不能把
- == 转换规则