原生js:in 操作符

174 阅读1分钟

一、in 是用来干嘛的?

in操作符用来判断某个索引是否属于某个对象,可以是对象的直接属性,也可以是对象原型上的属性

二、判断索引是否属于数组

1、判断索引值是否属于数组

      const arr = ['a', 'b', 'c']
      arr.length = 4
      console.log(0 in arr) // true
      console.log(1 in arr) // true
      console.log(2 in arr) // true
      console.log(3 in arr) // true
      console.log(4 in arr) // false

2、删除索引值后再使用in查找为false

      const arr = ['a', 'b', 'c']
      delete arr[2] // 或使用arr.splice(2, 1)删除该索引对应的值
      console.log(2 in arr) // false

3、in会查找到原型上的属性

      const arr = ['a', 'b', 'c']
      Array.prototype.aa = 'aa'
      Object.prototype.bb = 'bb'
      console.log('aa' in arr) // true
      console.log('bb' in arr) // true

三、判断索引值是否属于对象

1、判断对象的直接属性是否属于对象

      function Obj() {
        this.name = 'xx'
        this.age = 10
      }
      const obj = new Obj()

      console.log('name' in obj) // true

2、删除索引值后再使用in查找为false

      delete obj.name // 或Reflect.deleteProperty(obj, 'name')
      console.log('name' in obj) // false

如果设置属性值为undefined,还是可以通过in查找到

      obj.name = undefined
      console.log('name' in obj) // true

3、in会查找到原型上的属性

      Obj.prototype.aa = 'aa'
      Object.prototype.bb = 'bb'

      console.log('aa' in obj) // true
      console.log('bb' in obj) // true
      console.log('toString' in obj) // true

四、in的右边必须是一个对象

      console.log(1 in new String('abc')) // true
      console.log(1 in 'abc') // 使用字面量时会报错 Uncaught TypeError: Cannot use 'in' operator to search for '1' in abc