本文只涉及到一些基本的概念,适合初学者学习。更高级别的话题,比如类,原型,构造器等建议参考书籍《JavaScript: The Definitive Guide》
类型,值和变量
javascript在整型值和浮点型值之间没有区别,javascript中所有的值都是浮点类型的值。采用64位浮点格式,遵循IEEE754标准。因此最大值为±1.7976931348623157 × 10^308 最小值为±5 × 10^?324. javascript允许你定义精确的整数范围为?9007199254740992 (?2^53) 和9007199254740992 (2^53),
十进制写法
0
3
100000
十六进制写法
0xff
0xCAFE911
浮点数字写法
3.14
.333333333
6.02e23
1.143822E-32
Infinity 和NaN
javascript定义全局变量Infinity 和NaN
Infinity 表示正无穷大,NaN表示not a number
Number.POSITIVE_INFINITY==1/0==Number.MAX_VALUE + 1==Infinity
Number.NEGATIVE_INFINITY==-1/0==-Number.MAX_VALUE - 1==-Infinity
Number.NaN==0/0=NaN
NaN有特殊的之处。它和任何值都不相等,即使是和自己。因此不能用x==NaN来判断x是不是NaN,只能用x!=x来判断是不是NaN,返回true就表明是NaN。也可以用方法isNaN()。
isFinite()方法范虎true,当且仅当参数不是NaN,Infinity或者 -Infinity 的时候。
null和undefined
null表示空值,可以认为是一个特殊的对象值,表示无对象。和其他语言中的null一样的意思。
undefined表示变量值没有初始化,或者这个要查询的值不存在。函数没有返回值的时候也返回undefined。
alert(null == undefined); //true
alert(null === undefined); //false
全局对象
全局属性:undefined, Infinity, and NaN
全局方法:isNaN(), parseInt() (§3.8.2), and eval()
构造函数:Date(), RegExp(), String(), Object(), Array()
全局对象:Math,JSON
全局变量作为属性
当定义一个全局变量,其实是在使用全局对象的一个属性。如果使用var声明变量,那么这个属性是不可配置的,意思就是不能通过delete操作删除它。
var c = 0;
p = 4; //没有使用var
alert(this.c);
alert(this.p);
alert(delete c);//false 不可以删除
alert(delete p);//true 可以删除
alert(c); 删除失败还可以访问
alert(p);不可以访问
var关键字
var定义在函数内部的,那么作用域也就是在函数内部。
var定义在外部的,那么就是全局对象的属性,并且不可被删除。
var定义的变量,如果未初始化,那么他的值就是undefined。
允许多次定义同一个var变量。
function
函数的定义方式
var f1 = function(x) { return x+1; }
function f2(x) { return x+1; }
var f3 = function f4(x) { return x+2; } //很罕见
alert(f1(1));//2
alert(f2(1));//2
alert(f3(1));//3
alert(f4("2"));//"22"
f1=f3;//函数类似委托那样赋值。
alert(f1(1));//3
try/catch/finally和throw
使用方法和C#中的类似。
try {
// Ask the user to enter a number
var n = Number(prompt("Please enter a positive integer", ""));
// Compute the factorial of the number, assuming the input is valid
var f = factorial(n);
// Display the result
alert(n + "! = " + f);
throw ("pppp");
}
catch (ex) { // If the user's input was not valid, we end up here
alert("error"+ex); // Tell the user what the error is
}
Javascript中的一些运算符
instanceof运算符,判断是不是对象的一个实例。
var d = new Date(); // Create a new object with the Date() constructor
d instanceof Date; // Evaluates to true; d was created with Date()
d instanceof Object; // Evaluates to true; all objects are instances of Object
d instanceof Number; // Evaluates to false; d is not a Number object
var a = [1, 2, 3]; // Create an array with array literal syntax
a instanceof Array; // Evaluates to true; a is an array
a instanceof Object; // Evaluates to true; all arrays are objects
a instanceof RegExp; // Evaluates to false; arrays are not regular expressions
所有的对象都是instances of Object。
eval()演算运算符,转换string到javascript代码,并运行。
eval("function f(x) { return x+1; }");
alert(f(2)); //3
typeof运算符,得到type。
x typeof x
undefined "undefined"
null "object"
true or false "boolean"
any number or NaN "number"
any string " string"
any function "function"
any nonfunction native object "object"
any host object An implementation-defined string, but not “undefined”, “boolean”, “number”, or “string”.
void运算符
比较特殊,它总是舍弃运算数的值,返回undefined。它的常用方式也就是在客户端javascript中 javascript: URL
<a href="javascript:void window.open();">Open New Window</a>
delete操作符
删除对象属性或者数组元素
var o = { x: 1, y: 2}; // Start with an object
delete o.x; // Delete one of its properties
"x" in o // => false: the property does not exist anymore
var a = [1,2,3]; // Start with an array
delete a[2]; // Delete the last element of the array
a.length // => 2: array only has two elements now
Javascript中的对象
Javascript的基本数据类型就是object。
一个对象是一组属性的集合, 每个属性都是一对键值对。属性名都是string。
任何不是string,number,布尔,null,undefined的值都是object类型。
javascript的对象是动态属性的,可以被增加或者删除。
属性可以包含空字符串,但是不能由2个相同的属性。
javascript对象的种类
本地对象是由ECMAScript定义的类或对象,数组,行数,日期,正则表达式之类的都是本地对象
宿主对象则是由宿主环境,比如浏览器提供的,其内部内嵌了javascript解释器。
垃圾回收
Javascript解释器实现了自动垃圾回收,程序员不需要考虑内存回收。当一个对象不再可达的时候,解释器知道如何回收它。类似C#中的垃圾回收机制。
Javascript中的对象的创建。
一种就是采用键值对的方式创建。var empty = {}; // An object with no properties
var point = { x:0, y:0 }; // Two properties
var point2 = { x:point.x, y:point.y+1 }; // More complex values
var book = {
"main title": "JavaScript", // Property names include spaces,
'sub-title': "The Definitive Guide", // and hyphens, so use string literals
"for": "all audiences", // for is a reserved word, so quote
author: { // The value of this property is
firstname: "David", // itself an object. Note that
surname: "Flanagan" // these property names are unquoted.
}
};
另一种就是采用new
var o = new Object(); // Create an empty object: same as {}.
var a = new Array(); // Create an empty array: same as [].
var d = new Date(); // Create a Date object representing the current time
var r = new RegExp("js"); // Create a RegExp object for pattern matching.
对象中属性的访问方式
对象中属性的访问方式,可以用.访问,也可以用类似数组的方式访问。
alert(book.author.firstname);
alert(book["author"]["surname"]);
alert(book["author"].surname);
alert(book["main title"]);
属性的赋值和读取方式,可以采用for的方式。属性可以随时增加或者删除。
var test = {};
for (i = 0; i < 10; i++) {
test["shuxing" + i] = i;
}
for (var o in test) {
alert(o);//属性名
alert(test[o]);
}
Javascript中的数组
javascript中数组是对象的特殊形式,继承于rray.prototype。元素个数可以不定,随时增加,元素的类型也随意。
var empty = []; // An array with no elements
var primes = [2, 3, 5, 7, 11]; // An array with 5 numeric elements
var misc = [ 1.1, true, "a", ]; // 3 elements of various types + trailing comma
var base = 1024;
var table = [base, base+1, base+2, base+3];
var b = [[1,{x:1, y:2}], [2, {x:3, y:4}]];
var count = [1,,3]; // An array with 3 elements, the middle one undefined.
var undefs = [,,]; // An array with 2 elements, both undefined.
增加删除数组元素
a = [] // Start with an empty array.
a[0] = "zero"; // And add elements to it.
a[1] = "one";
a = []; // Start with an empty array
a.push("zero") // Add a value at the end. a = ["zero"]
a.push("one", "two") // Add two more values. a = ["zero", "one", "two"]
删除元素
a = [1,2,3];
delete a[1]; // a now has no element at index 1
1 in a // => false: no array index 1 is defined
a.length // => 3: delete does not affect array length
删除数组元素类似于将undefined值赋给元素,并不改变数组的length属性。
数组的push,pop方法
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。把指定的值添加到数组后的新长度。
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。
pop() 方法用于删除并返回数组的最后一个元素。
pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
如果数组是空的,那么 shift() 方法将不进行任何操作,返回 undefined 值。请注意,该方法不创建新数组,而是直接修改原有的 arrayObject。
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
unshift() 方法将把它的参数插入 arrayObject 的头部,并将已经存在的元素顺次地移到较高的下标处,以便留出空间。该方法的第一个参数将成为数组的新元素 0,如果还有第二个参数,它将成为新的元素 1,以此类推。
请注意,unshift() 方法不创建新的创建,而是直接修改原有的数组。
注释:该方法会改变数组的长度。
注释:unshift() 方法无法在 Internet Explorer 中正确地工作!
Array 对象方法
方法 描述 FF IE
concat() 连接两个或更多的数组,并返回结果。 1 4
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 4
pop() 删除并返回数组的最后一个元素 1 5.5
push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 5.5
reverse() 颠倒数组中元素的顺序。 1 4
shift() 删除并返回数组的第一个元素 1 5.5
slice() 从某个已有的数组返回选定的元素 1 4
sort() 对数组的元素进行排序 1 4
splice() 删除元素,并向数组添加新元素。 1 5.5
toSource() 返回该对象的源代码。 1 -
toString() 把数组转换为字符串,并返回结果。 1 4
toLocaleString() 把数组转换为本地数组,并返回结果。 1 4
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 6
valueOf() 返回数组对象的原始值 1 4
javascript中的function
javascript中函数是对象,可以由程序操作。可以将function赋值给一个变量,并且传递给另一个函数调用。因此,既然function是对象,你可以为其设置属性,甚至在方法中调用他们,javascript中function可以嵌套function,可以访问在他们生命周期中定义的变量,也就是说javascriptfunction支持闭包的。
函数的定义方式还可以使用Function()构造函数。
例如:
var f = new Function("x", "y", "return x+y;");
alert(f(3, 5));
这种方式和function f(x,y){return x+y;}等价。但是允许你动态的构造函数,而且将定义函数变成定于语句表达式在某些情况下也会更方便。
注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。
Function 类可以表示开发者定义的任何函数。
javascript 定义类的方式,还是用function关键字
ECMAScript是一种由欧洲计算机制造商协会(ECMA)通过ECMA-262标准化的脚本程序设计语言
ECMAScript 最令人感兴趣的可能莫过于函数实际上是功能完整的对象。
例如:
function f(x, y) {
this.X = x;
this.Y = y;
var pp =10;
this.dowork = function () { return this.X + this.Y+pp; };
}
var s = new f(4, 9);
? ? alert(s.X)
alert(s.dowork());
当对象被new的时候,this表示这个对象本身,this.X就好比这个X是public的,可以在下面的s中访问到。f(x, y)本身就相当于与对象f的构造函数,s作为f类的实例,可以这么理解。同样的,s对象的属性也可以随时增加或者删除。
本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/716760,如需转载请自行联系原作者