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