1.typeof是操作符,不是函数,不过可以以函数的写法调用。例子:alert(typeof message);alert(typeof(message));
2.js变量类型虽是松散的,但也是有类型的
3.一个变量在定义时被初始化,根据初始化的值,变量的类型就被指明了,比如var message = "some string";此时message是字符串类型,之后也可以赋给它其它类型的值,如message=15,但这样并不推荐
4.js有两个特殊数据类型:undefined类型和null类型
1)undefined类型只有一个值undefined,null类型也只有一个值null
2)undefined类型派生自null类型
3)声明一个未初始化的变量,这个变量的值便是undefined,
如var message,car;
alert(message);//undefined
alert(car);//undefined
alert(message == car);//true
4)一个未声明过的变量,其值也是undefined,
如alert(age);//undefined
5)null表示一个空对象指针,使用typeof查看null类型是object,并不是null
6)null最大的用途是可以用来初始化对象,进而在后续代码中借此判断一个对象是否是有效的,即if(car != null)
5.Number()可以将任何类型转换为数值;parseInt()和parseFloat()只用于将字符串转换为数值;
6.把一个值转换为字符串的函数是.toString()或String()方法
7.toString()和valueOf()都是object类的成员函数
8.js也支持位操作
9.数值和字符串相加,将会把数值转换为字符串,拼接字符串;数值和字符串比较,将会把字符串转换为数值,再进行比较
10.对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。例如:
var person = new Object();
person.name = "Tom";
即,不必像c++样需要先定义好类成员
11.跟c++一样,引用类型的复制,双方指向同一个对象
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "Tom";
alert(obj1.name);// Tom
该规则同样适用于引用类型数据做函数参数时的传参
12.对一个引用类型的对象使用操作符typeof ,总会返回object,并不会返回具体的类型,因此没什么实际意义.可以用另一个操作符instanceof 判断对象是否是某种类型,例如:
alert (person instanceof Object);//变量person是object类型吗
alert (colors instanceof Array);//变量colors是Array类型吗
13.执行环境是一个对象,其中定义的所有变量和函数都属于这个对象,在浏览器中,最外围的执行环境是window 对象
14.当函数被调用的时候,函数被作为对象,被称作活动对象,argument 就是该对象的属性
15.作用域链就是层层嵌套的执行环境链
16.一个变量的作用域只取决于执行环境,而跟花括号无关,这点跟C是不一样的,例如:
if (true) { var color = "blue"; }
alert(color);// 此时是可以访问的
尤其使用for循环的时候易出错:
for (var i = 0; i < 10; i++) {...}
alert(i);//此时i=10
17.除了用new的方法创建object对象,还可以用对象字面量的方法定义,例如:
var person = {
name:"tom",
age:19
};
也可以这样定义
var person = {};
person.name = "tom";
person.age = 19;
18.对象字面量还可以为函数传参,例如:
function displayInfo(args) {
var output = "";
if (typeof args.name == "string") {
output += "Name:" + args.name + "
";
}
if (typeof args.age == "number") {
output += "Age:" + args.age + "
";
}
alert(output);
}
displayInfo({
name: "Tom",
age: 19
});
displayInfo({
name:"John"
});
19.定义数组的各种方式
var colors = new Array(3);//包含3项
var colors = new Array("red","blue","green");
var colors = ["red","blue","green"];
20.js数组可以自动增长
21.对数组执行toString()和valueOf()方法,默认按逗号分隔,如果想按特定符号分隔,可以使用数组的join函数
22.函数的this属性,不是指函数本身,而是函数在执行时所处的执行环境
23.函数的apply方法是相当于在特定的作用域中调用函数,实际上相当于设置函数的this值,call具有同样的作用,它们唯一的区别是,传参方式不一样,前者用数组,后者罗列。这两个函数最大的用处就是扩大函数的作用域。
24.对象有一个重要属性prototype ,函数作为对象,自然也拥有prototype ,prototype中的内容可以视作c++里面的静态成员,即各实例对象共享
25.闭包指有权访问另一个函数作用域中的变量的函数,最常见的形态就是,一个函数中返回值是一个函数,闭包最重要的作用也是可以扩展函数的作用域
27.var val = "false";
if (val) {// 因为字符串"false"不为空,所以隐式转换成布尔类型为真
alert("val是false");
}
if (Boolean(val)){// 仍然为真,并不为false
alert("val是false");
}