hasOwnProperty: 判断一个对象是否包含某个属性(私有属性)(不包括原型链上的属性)

  1. const obj = { a: 2 }
  2. obj.hasOwnProperty('a') // true
  3. obj.hasOwnProperty('b') //false
  1. function Fn(x,y){
  2. let sum = 10;
  3. this.total = x + y;
  4. this.say =function(){
  5. console.log(this.total)
  6. }
  7. }
  8. let f1 = new Fn()
  9. let oo = {
  10. name: "oo",
  11. fn: function () {
  12. console.log(this.name);
  13. }
  14. }
  15. console.log(f1.hasOwnProperty('say')) //true say构造时已经是f1的私有属性
  16. console.log(f1.hasOwnProperty('hasOwnPropery')) //false hasOwnPropery是原型链上的共有属性
  17. console.log(f1.hasOwnProperty('sum')); //false
  18. console.log(oo.hasOwnProperty('name')); //true
  19. console.log(oo.hasOwnProperty('fn')); //true
  20. console.log(Fn.prototype.__proto__.hasOwnProperty('hasOwnProperty')); //true 首先Fn是函数它的 __proto__ 是 ƒ () 它的 prototype 是constructor: ƒ Fn(x, y) 和 __proto__: Object => 这里才有hasOwnProperty方法
  21. let obj = new Object(oo)
  22. console.log(obj.hasOwnProperty('name')); //true
  23. console.log(obj.hasOwnProperty('fn')); //true
  24. console.log('name' in obj) //true

isPrototypeOf: 方法用于测试一个对象(是一个对象)是否存在于另一个对象的原型链上。

  1. function fn() {}
  2. _fn1 = new fn() // fn {}
  3. _fn2 = fn() // undefined
  4. console.log(fn.isPrototypeOf(_fn1)) // false
  5. console.log(fn.prototype.isPrototypeOf(_fn1)) // true
  6. console.log(fn.prototype.isPrototypeOf(_fn2)) // false
  7. console.log(Object.prototype.isPrototypeOf(_fn1)) // true
  8. console.log(Object.prototype.isPrototypeOf(_fn2)) // false
  1. function Foo() {}
  2. function Bar() {}
  3. function Baz() {}
  4. Bar.prototype = Object.create(Foo.prototype);
  5. Baz.prototype = Object.create(Bar.prototype);
  6. var baz = new Baz();
  7. console.log(Baz.prototype.isPrototypeOf(baz)); // true
  8. console.log(Bar.prototype.isPrototypeOf(baz)); // true
  9. console.log(Foo.prototype.isPrototypeOf(baz)); // true
  10. console.log(Object.prototype.isPrototypeOf(baz)); // true

in 如果指定的属性在指定的对象或其原型链中(无论是公有还是私有),则in 运算符返回true

  1. const car = { make: 'Honda', model: 'Accord', year: 1998 };
  2. console.log('make' in car);
  3. // expected output: true
  4. delete car.make;
  5. if ('make' in car === false) {
  6. car.make = 'Suzuki';
  7. }
  8. console.log(car.make);
  9. // expected output: "Suzuki"
  1. // 数组
  2. var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
  3. 0 in trees // 返回true
  4. 3 in trees // 返回true
  5. 6 in trees // 返回false 超出长度
  6. "bay" in trees // 返回false (必须使用索引号,而不是数组元素的值)
  7. "length" in trees // 返回true (length是一个数组属性)
  8. Symbol.iterator in trees // 返回true (数组可迭代,只在ES2015+上有效)
  9. // 内置对象
  10. "PI" in Math // 返回true
  11. // 自定义对象
  12. var mycar = {make: "Honda", model: "Accord", year: 1998};
  13. "make" in mycar // 返回true
  14. "model" in mycar // 返回true

in右操作数必须是一个对象值。例如,你可以指定使用String构造函数创建的字符串,但不能指定字符串文字。

  1. var color1 = new String("green"); //new 出来的都是对象
  2. "length" in color1 // 返回true
  3. var color2 = "coral";
  4. "length" in color2 // 报错(color2不是对象)

对被删除或值为 undefined 的属性使用in

如果你使用 [delete](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete) 运算符删除了一个属性,则 in 运算符对所删除属性返回 false

  1. var mycar = {make: "Honda", model: "Accord", year: 1998};
  2. delete mycar.make;
  3. "make" in mycar; // 返回false
  4. var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
  5. delete trees[3];
  6. 3 in trees; // 返回false

如果你只是将一个属性的值赋值为undefined,而没有删除它,则 in 运算仍然会返回true

  1. var mycar = {make: "Honda", model: "Accord", year: 1998};
  2. mycar.make = undefined;
  3. "make" in mycar; // 返回true
  1. var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
  2. trees[3] = undefined;
  3. 3 in trees; // 返回true

继承属性

如果一个属性是从原型链上继承来的,in 运算符也会返回 true

  1. "toString" in {}; // 返回true