我比较不喜欢的语言,目前有2个:javascript和shell。但是没有办法啊,web开发javascript是必须的,linux系统管理,系统编程都需要掌握shell。所以生活很常都不能按着自己的意愿来,很多时候必须硬着头皮上。
以下总结一下javascript的基本概念。
一个大原则是:动态语言可以的变量使用几乎可以随心所欲,但是如果太随心所欲,一定会陷入某些陷阱中,所以使用变量前必须先声明,而且能赋初值的一定赋初值,另外,必须清楚变量的类型。
一般变量的声明:
var a, b, c; //分号不是必须的,但是逗号是必须的,写在一行,必须是逗号
数组的声明和赋初值:
1. var arr = new Array(); //这里的声明是必须的
arr[0] = “jonda”;
arr[1] = “zhong”;
arr[2] = 33;
也可以声明时直接赋初值:var arr = new Array(“jonda”, “zhong”, 33);
2. var arr = [“jonda”, “zhong”, 33];
3. javascript里面没有二维数组的概念,但是可以模拟。
var arr2 = new Array();
arr2[0] = new Array();
arr2[1] = new Array();
arr2[2] = new Array();
arr2[0][0] = 3;
arr[0][1] = 4;
arr[1][0] = “nihao”;
…
附:c语言中数组:int arr[3] = {3,4,5};
Php中数组:$arr = array(3,4,5);
Json数据(也就是哈希或者是python,erlang中字典)
var obj = {name:”jonda”, age:22};
可以嵌套使用:var obj = {name:{first:”zhong”, last:”changda”}, age:22};
Json可以和数组混合使用:
var obj = [{name:”jonda”}, {name:”jiang”}, {name:”zhong”}];
访问:obj[0].name或者obj[0][“name”]
var obj = {name:[“jonda”, “jiang”, “zhong”], age:22};
访问:obj.name[0]或者obj[“name”][0]
遍历json数据:
for( var p in obj){
//其中p是索引,所以obj[p]是值
}
闭包:是一种特殊的函数,它嵌入到“其他函数”中,在闭包看来,“其他函数”中的变量是全局的。这种机制主要是使变量隐藏在“其他函数”中,这样封装性,安全性高一些。
面向对象:有如下2种比较优雅的方法。
采用构造函数+原型:构造函数用于属性,原型用于方法
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.setName = function(name){
this.name = name;
}
如下一种是网上看到的:
var Class = {
create: function()
{
return function()
{
this.initialize.apply(this, arguments);
}
}
}
// 这是prototype.js里面的类构造方法,使用方法是:
var myClass = Class.create();
// 这样就可以创建一个类了。
// 继续加入:
myClass.prototype =
{
a : 2,
b : 3,
x : function (m_x)
{
return (this.a * m_x);
},
y : function (m_y)
{
return (this.b + m_y);
},
initialize : function (m_value)
{
alert(m_value + ':' + this.x(2) + this.y(4));
}
}
// 那么,你在实例化该类的时候:
var mclass = new myClass('结果');
以下是一些比较重要的函数:
数组方法:
length slice join concat push pop shift unshift sort reverse splice插入
字符串方法:字符串是不可变的,指针方式存放的
length charAt charCodeAt concat indexOf lastIndexOf localeCompare split
substring负数参数变0 slice toLowerCase
日期方法:
var d1 = new Date(2005, 8,23);
getDate getDay getFullYear getMonth getMinutes
尽量使用encodeURI encodeURIComponent以及相应的decodeURI decodeURIComponent,因为他们会对所有的unicode字符进行编码,而escape和unescape只对ascii编码。。。为什么编码呢,因为uri对某些字符,如空格不能识别,所以通过编码,使之成为合法的uri
eval("alert('hello world')");
var msg = "hello";
eval("alert(msg)");
正则表达式方法:
test()、exec() 以及 compile()。
var patt1=new RegExp("e");
直接量语法
/pattern/attributes 默认是大小写敏感,只匹配一个就结束
创建 RegExp 对象的语法:
new RegExp(pattern, attributes);
document.write(patt1.test("The best things in life are free"));
var str="1 plus 2 equal 3"
document.write(str.match(//d+/g))
name = 'aaa bbb ccc';
uw=name.replace(//b/w+/b/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
);
name = '"a", "b"';
name.replace(/"([^"]*)"/g, "'$1'");
正则表达式中默认的是贪心匹配。如果要实现非贪心匹配,需要使用?
匹配符。