javascript一些底层方法总结及用法

本地对象:ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
          简单来说,本地对象就是 ECMA-262 定义的类(引用类型)

内置对象:ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,
          在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,
          即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。

宿主对象:所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。
          所有 BOM 和 DOM 对象都是宿主对象。


enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];

// hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
// Ie8以下不支持dom. hasOwnProperty 方法。
// isPrototypeOf是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。

1、hasOwnProperty

作用:是用来判断一个对象是否有你给出名称的属性或对象。

调用方式:object.hasOwnProperty(proName)

参数:object(必须) 对象的实例;proName(必须) 一个属性名称的字符串值

注意:如果 object 具有带指定名称的属性,则 hasOwnProperty 方法返回 true,否则返回 false。
      此方法不会检查对象原型链中的属性。
      该属性必须是对象本身的一个成员。
      Internet Explorer 8 和低于其的版本的宿主对象不支持该属性。

代码举例:
      在下面的示例中,所有 String 对象共享一个公共 split 方法。 下面的代码将显示 false 和 true。
 var s = new String("Sample");
 console.log(s.hasOwnProperty("split"));
 console.log(String.prototype.hasOwnProperty("split"));


2、in 运算符

作用:测试一个对象中是否存在一种属性。

调用方式:result = property in object

参数:result(必须) 任何变量;proName(必须) 计算结果为字符串表达式的表达式;object(必须) 任意对象

注意:in 运算符确定对象中是否有名为 property 的属性。 它还确定属性是否为对象的原型链的一部分。

代码举例:
   code1:
      var myObject = new Object();
          myObject.name = "James";
          myObject.age = "22";
          myObject.phone = "555 0234";

      if ("phone" in myObject) {
         console.log("property is present");
      } else  {
         console.log("property is not present");
      }

  code2:
     console.log("toString" in "zheyang");
     console.log("toString" in new String("zheyang"))

 思考: var aa = "zheyang" 与 aa = new String("zheyang") 的区别 

3、valueOf
    
作用:返回指定对象的原始值。

调用方式:object.valueOf();

注意:在JS里数字其实都是浮点数。

代码举例:
   var aa = 123 
   console.log(aa.valueOf())
   console.log(123.valueOf())
   console.log(123..valueOf())
   console.log((123).valueOf())


4、typeof

作用:返回指定对象的类型。
调用方式:typeof object;

代码举例:
   var aa = 12;
   var bb = new Number(12)
   console.log(typeof aa)
   console.log(typeof bb)

5、instanceof

作用:返回一个布尔值,该值指示一个对象是否为特定类或构造函数的一个实例。

调用方式:object instanceof class;

参数:object(必须) 一个对象;class(必须) 任何对象类或构造函数;

注意:如果 object 是 class 或构造函数的实例,则 instanceof 运算符返回 true。
      如果 object 不是指定类或函数的实例,或者 object 为 null,则返回 false。
      JavaScript Object 很特殊,当且仅当对象用 Object 构造函数构造时,对象才被视为 Object 的实例。

代码举例:
    function ClassA() {

    }

    function ClassB() {
    
    }
    ClassB.prototype = {
        constructor: ClassA
    }

    function ClassC(){
       ClassA.call(this);
    }
    function ClassD(){}

    var obj = new ClassA
    var obj2 = new ClassB;
    var obj3 = new ClassC;
    ClassD.prototype = obj2;
    var obj4 = new ClassD;

    console.log(obj instanceof ClassA)
    console.log(obj2 instanceof ClassB)
    console.log(obj2 instanceof ClassB)
    console.log(obj3 instanceof ClassA)
    console.log(obj4 instanceof ClassA)
    console.log(ClassA instanceof Function)

6、isPrototypeOf

作用:确定一个对象是否存在于另一个对象的原型链中。

调用方式:prototype.isPrototypeOf(object)

参数:prototype(必须) 对象原型;object(必须) 另一个对象,将对其原型链进行检查

注意:如果 object 的原型链中具有 prototype,则 isPrototypeOf 方法返回 true。
      原型链用于在同一个对象类型的不同实例之间共享功能。
      当 object 不是对象或当 prototype 没有出现在 object 的原型链中时,isPrototypeOf 方法返回 false。

代码举例:
    function Rectangle() {}
    var rec = new Rectangle();
    cosole.log(Rectangle.prototype.isPrototypeOf(rec));

7、propertyIsEnumerable

作用:返回布尔值,该值指示指定属性是否为对象的一部分以及该属性是否是可枚举的。

调用方式:object.propertyIsEnumerable(propName)

参数:object(必须) 对象实例;propName(必须) 一个属性名称的字符串值;

注意:如果 propName 存在于 object 中且可以使用一个 For...In 循环枚举出来,则 propertyIsEnumerable 属性将返回 true。
      如果 object 不具有所指定名称的属性或者所指定的属性不是可枚举的,则 propertyIsEnumerable 属性将返回 false。
      通常,预定义的属性不是可枚举的,而用户定义的属性总是可枚举的。
      propertyIsEnumerable 属性不考虑原型链中的对象。

代码举例:
    var a = new Array("apple", "banana", "cactus");
    var s = a.propertyIsEnumerable(1);
    console.log (s);

8、toString / toLocaleString

作用:可把一个对象转换为字符串,并返回结果。

调用方式:object.toString(num)

参数:object(必须) 对象;num(非必须) ;

注意:如果对象是数子,则参数可为要转换的进制数,默认为10
      如果是布尔类型,则会转换为对应的字符串

代码举例:
    
   var aa = 123
   console.log(aa.toString(2))
   var bb = new Boolean(true)
   console.log(bb)

9、constructor

 代码举例: constructor.parent 

10、 Function 与 Object

Function:

首先回顾一下函数对象的概念,函数就是对象,代表函数的对象就是函数对象。
所有的函数对象是被Function这个函数对象构造出来的。
也就是说,Function是最顶层的构造器。
它构造了系统中所有的对象,包括用户自定义对象,系统内置对象,甚至包括它自已。
这也表明Function具有自举性(自已构造自己的能力)。
这也间接决定了Function的[[call]]和[[constructor]]逻辑相同。

Object:
 
对于Object它是最顶层的对象,所有的对象都将继承Object的原型,
但是你也要明确的知道Object也是一个函数对象,
所以说Object是被Function构造出来的。

代码举例:
alert(Function instanceof Function);//true 
alert(Function instanceof Object);//true    
alert(Object instanceof Function);//true 
function Foo() {};
var foo = new Foo();
alert(foo instanceof Foo); // true
alert(foo instanceof Function); // false
alert(foo instanceof Object); // true
alert(Foo instanceof Function); // true
alert(Foo instanceof Object); // true