Javascript 高级教程 笔记

数据类型

        console.log(typeof 1);         // number
        console.log(typeof "a");       // string
        console.log(typeof false);     // boolean
        console.log(typeof undefined); // undefined
        console.log(typeof null);      // ----->object
        console.log(null instanceof Object); // ----->false
        console.log(null == undefined); // ---->true
        console.log(null === undefined); // ---->false

        console.log(typeof new Object()); // object
        console.log(typeof new Function()); // function
        console.log(typeof new Array());    // object
  • 为什么 typeof 运算符对于 null 值会返回 "Object"?。 这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
  • undefined 是声明了变量但未对其初始化时赋予该变量的值(提示:值 undefined 并不同于未定义的值。但是,typeof 运算符并不真正区分这两种值),null 则用于表示尚未存在的对象
  • NaN 的另一个奇特之处在于,alert(NaN == NaN); //输出 "false" 不推荐使用 NaN 值本身用函数 isNaN()

slice() 和 substring() 方法的主要不同

对于负数参数,slice() 方法会用字符串的长度加上参数,substring() 方法则将其作为 0 处理

instanceof 运算符

在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object" instanceof 方法要求开发者明确地确认对象为某特定类型

var oStringObject = new String("hello world");
alert(oStringObject instanceof String);	//输出 "true"

混合的构造函数/原型方式

联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
}

Car.prototype.showColor = function() {
  alert(this.color);
};

动态原型方法

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");

  if (typeof Car._initialized == "undefined") {
    Car.prototype.showColor = function() {
      alert(this.color);
    };

    Car._initialized = true;
  }
}

对象冒充

function ClassB(sColor) {
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;
}
function ClassB(sColor, sName) {
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}
var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();	//输出 "blue"
objB.sayColor();	//输出 "red"
objB.sayName();		//输出 "John"

call() 方法

function sayColor(sPrefix,sSuffix) {
    alert(sPrefix + this.color + sSuffix);
};

var obj = new Object();
obj.color = "blue";

sayColor.call(obj, "The color is ", "a very nice color indeed.");

与继承机制的对象冒充方法一起使用该方法

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

apply() 方法

function sayColor(sPrefix,sSuffix) {
    alert(sPrefix + this.color + sSuffix);
};

var obj = new Object();
obj.color = "blue";

sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));

与继承机制的对象冒充方法一起使用该方法

function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.apply(this, new Array(sColor));
    //ClassA.apply(this, arguments);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

Javascript 高级教程 笔记_第1张图片

for in 和 hasOwnProperty

我们不能仅仅使用for-in语句来遍历items对象的所有属性,还需要使用 hasOwnProperty方法(验证items对象是否包含某个属性),因为对象的原型 也会包含对象的其他属性(JavaScript基本的Object类中的属性将会被继承,并 存在于当前对象中,而对于这个数据结构来说,我们并不需要它们)。

转载于:https://my.oschina.net/jasper1987/blog/1476277

你可能感兴趣的:(Javascript 高级教程 笔记)