javascript高级程序设计

来源:互联网 发布:java聊天室开源代码 编辑:程序博客网 时间:2024/06/06 14:42

第一章

1.注意标签中的

function sayScript(){    alert('<\/script>');//  如果這樣寫會報錯“alert('</script>')”}

第三章

3.12 标识符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一个或多个字符:

(1)每一个字符必须是字母、下划线(_)或者一个美元符号($);
(2)其他字符可以是字母、下划线、美元符号或数字。
标识符中的字母也可以包含扩展的ASCII或Unicode字母字符(如さ和し),但我们不推荐这样做。
ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个有意义的单词的首字母大写,

    eg:    firsetSecond、myCar、doSomethingImportant

3.4 数据类型

基本数据类型:UndefinedNull、Boolean、NumberString

3.4.3 null 类型

alert(null == undefined); //true

3.4.4Boolean类型

数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 “”(空字符串) Number 任何非零数字值(包括无穷大) 0和NaN Object 任何对象 null Undefined n/a Undefined

3.45 Number类型

1.浮点数数值

var floatNum = 3.125e7//等于31250000var floatNum = 3e-7//等于0.0000003浮点数的计算要注意:0.1+0.2的结果不是0.3所以不要做这样的测试if(a + b == 0.3){    alert(You got 0.3);}

2.数值范围
最小值:Number.MIN_VALUE(在大多数浏览器中,这个值是5e-324)
最大值:Number.MAX_VALUE(在大多数浏览器中,这个值是1.7976931348623157e+308)
如果某次计算的结果超过这个最大值,或者低于这个最小值,那么这个值是正数,则会转正Infinity(正无穷),如果这个值是负数,则会转正-Infinity(负无穷)
如果想确定这个值是不是有穷的,则可以使用isFinite()函数。这个函数在参数位于最小与最大值之前时会返回true,如下面的例子:

    var result = Number.MAX_VALUE+ Number.MAX_VALUE;    alert(isFinite(result)); //false

特殊:访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到负和正的Infinity的值。可以想见,这两个属性中分别保存着-Infinity和Infinity。

4.数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
Number()函数的转换规则如下。
∏如果是Boolean值,true和false将分别被转换为1和0。
∏如果是数字值,只是简单的传入和返回。
∏如果是null值,返回0。
∏如果是undefined,返回NaN。
∏如果是字符串,遵循下列规则:
∏如果是字符串,遵循下列规则:
▆如果字符串中数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成11(注意:前导的零被忽略了);
▆如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零);
▆如果字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值;
▆如果字符串是空的(不包含任何字符),则将其转换为0;
▆如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
∏如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

    eg:        var num1 = Number("Hello world!"); //NaN        var num2 = Number("");             //0        var num3 = Number("000011");       //11        var num4 = Number(true);           //1

parseInt():在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()会返回NaN;也就是说,parseInt()转换空字符串会返回NaN,而用Number()对空字符串返回0.如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有的字符或者遇到了一个非数字字符。例如,”1234blue”会被转换为1234,因为“blue”会被完全忽略,类似的,“22.5”会被转换为22,因为小数点并不是有效的数字字符。
如果字符串中的第一个字符是数字字符,parseInt()也能识别各种整数格式(即十进制、八进制和十六进制数)。也就是说,如果字符串以“0x”开头且后面跟数字字符,就会将其作一个十六进制数;如果字符串以“0”开头且后面跟数字字符,则会将其当作一个八进制数来解析。

    eg:        var num1 = parseInt("1234blue");       //1234        var num2 = parseInt("");               //NaN        var num3 = parseInt("0xA");            //10(十六进制数)        var num4 = parseInt(22.5);             //22        var num5 = parseInt("070");            //56(八进制数)最好不要用这个,因为在ECMAScript3中认为是56(八进制),而在ECMAScript5中认为是0(十进制)        var num7 = parseInt("0xf");            //15(十六进制数)

为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。如果知道要解析的值是十六进制格式的字符串,那么指定基数16作为第二个参数,可以保证得到正确的结果,

    eg:        var num = parseInt("0xAF", 16);   //175        实际上,如果指定了16作为第二个参数,字符串可以不加前面的“0x”,如下例子:        var num1 = parseInt("AF", 16);    //175        var num2 = parseInt("AF");        //NaN    指定基数会影响到转换的输出结果。    eg:        var num1 = parseInt("10", 2);          //2(按二进制解析)        var num2 = parseInt("10", 8);          //8(按八进制解析)        var num3 = parseInt("10", 10);         //10(按十进制解析)        var num4 = parseInt("10", 16);         //16(按十六进制解析)
parseFloat()与parseInt()函数类似,parseFloat()也是从第一个字符(位置为0)开始解析每个字符。而且也是一走解析到字符串尾,或者解析到遇到一个无效的浮点数数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,“22.34.5”将会转换为22.34。除了第一个小数点有效外,parseFloat()与parseInt()的第二个区别在于它始终都会忽略前导零。parseFloat()可以识别前面讨论过的所有浮点数格式,也包括十进制整数格式。但十六进制格式的字符串则始终会转换成0。由于parseFloat()只解析十进制值,因为它没有用到第二个参数指定基数的用法。最后一点要注意:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),parseFloat()会返回整数。以下是使用parseFloat()转换数值的几个典型示例。
    eg:        var num1 = parseFloat("1234blue");      //1234(整数)        var num2 = parseFloat("0xA");           //0        var num3 = parseFloat("22.5");          //22.5        var num4 = parseFloat("22.34.5");       //22.34        var num5 = parseFloat("0908.5");        //908.5        var num6 = parseFloat("3.125e7");       //31250000

3.46 String类型
String类型用于由零或多个16位Unicode字符组成的字符序列,即字符串。

字面量 含义 \n 换行 \t 制表 \b 空格 \r 回车 \|斜杠 \’ 单引号(‘),在用单引号表示的字符串中使用。例如:\’hey.\’ \” 双引号(“),在用双引号表示的字符串中使用。例如:He said,\”hey.\” \xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示“A” \unnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ

3.转换为字符串

 eg:    var age = 11;    var ageAsString = age.toString();              //字符串“11”    var found = true;         var foundAsString = found.toString();          //字符串“true”
数值、布尔值、对象和字符串值都有toString()方法,但是null和undefined值没有这个方法。
    eg:        var num = 10;        alert(num.toString());               //“10”        alert(num.toString(2));              //“1010”        alert(num.toString(8));              //“12”        alert(num.toString(10));             //“10”        alert(num.toString(16));             //“a”
在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能将任何类型的值转换为字符串。String()函数遵循下列转换原则:∏如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;∏如果值是null,则返回“null”;∏如果值是undefined,则返回“undefined”
    eg:        var value1 = 10;        var value2 = true;        var value3 = null;        var value4;        alert(String(value1));       //“10”        alert(String(value2));       //“true”        alert(String(value3));       //“null”        alert(String(value4));       //“undefined”

3.5.1一元操作符

    eg:        var num1 = 2;        var num2 = 20;        var num3 = num1-- + num2;    //等于22        var num4 = num1 + num2;      //等于21
    eg:        var s1 = "2";        var s2 = "z";        var b = false;        var f = 1.1;        var o = {            valueOf:function(){                return -1;            }        };        s1++;                    //值变成数值3        s2++;                    //值变成NaN        b++;                     //值变成数值1        f--;                     //值变成0.10000000000000009(由于浮点传入错误所致)        o--;                     //值变成数值-2

for对应while

for(;;){//无限循环    doSomething();}//只给出控制表达式实际上就把for循环转换成了while循环var count = 10;var i = 0;for(; i<count; ){    alert(i);    i++;}

正则表达式

var mathces = pattern2.exec(text);console.log("matches.index:" + matches.index);console.log("matches[0]:" + matches[0]);console.log("patter2.lastIndex:" + pattern2.lastIndex);
var person = {};Object.defineProperty(person, "name", {    writable: false,    value: "Nicholas"});alert("person.name:" + person.name);person.name = "Greg";alert(person.name);//输出结果为://"Nicholas"//"Nicholas"

判断函数对象是否处于原型中

function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function(){    alert(this.name);}var person1 = new Person();var person2 = new Person();person1.name = "Greg";alert(hasPrototypeProperty(person1, "name"));//falsealert(hasPrototypeProperty(person2, "name"));//truefunction hasPrototypeProperty(object, name){    return !object.hasOwnProperty(name) && (name in object);}

不使用for in遍历函数对象

function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function(){    alert(this.name);}var keys = Object.keys(Person.prototype);alert("keys:" + keys);//"keys:name,age,job,sayName"var p1 = new Person();p1.name = "Rob";p1.age = 31;var p1keys = Object.keys(p1);alert(p1keys);//"name,age"
var book = {    _year: 2004,    edition: 1};Object.defineProperty(book, "year", {    get: function(){        return this._year;    },    set: function(newValue){        if(newValue > 2004){            this._year = newValue;            this.edition += newValue - 2004;        }    }});book.year = 2005;alert(book.edition);//输出结果 2

===============================================================

var book = {};Object.defineProperties(book, {    _year: {        value: 2004    },    edition: {        value: 1    },    year: {        get: function(){            return this._year;        },        set: function(newValue){            if(newValue > 2004){                this._year = newValue;                this.edition += newValue - 2004;            }        }    }});var descriptor = Object.getOwnPropertyDescriptor(book, "_year");alert(descriptor.value);//2004alert(descriptor.configurable);//falsealert(typeof descriptor.get);//"undefined"alert(descriptor.value);//2004alert(descriptor.enumerable);//falsealert(typeof descriptor.get);"undefined"

==============================================================

function createPerson(name, age, job){    var o = new Object();        o.name = name;        o.age = age;        o.job = job;        return o;}var person1 = createPerson("Nicholas", 29, "Software Engineer");var person2 = createPerson("Greg", 27, "Doctor");console.log("person1:" + JSON.stringify(person1));//person1:{"name":"Nicholas","age":29,"job":"Software Engineer"}console.log("person2:" + JSON.stringify(person2));//person2:{"name":"Greg","age":27,"job":"Doctor"}

==============================================================

function Person(name, age, job){    this.name = name;    this.age = age;    this.job = job;    this.sayName = function(){        alert(this.name);    }}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");alert(person1.constructor == Person);//truealert(person2.constructor == Person);//true

==============================================================

function Person(name, age, job){    this.name = name;    this.age = age;    this.job = job;    this.sayName = function(){        alert(this.name);    }}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");alert(person1 instanceof Object);//truealert(person1 instanceof Person);//truealert(person2 instanceof Object);//truealert(person2 instanceof Person);//true

==============================================================

function Person(name, age, job){    this.name = name;    this.age = age;    this.job = job;    this.sayName = function(){        alert(this.name);    }}var person = new Person("Nicholas", 29, "Software Engineer");    person.sayName();//NicholasPerson("Greg", 27, "Doctor");window.sayName();//Gregvar o = new Object();    Person.call(o, "Kristen", 25, "Nurse");    o.sayName();//Kristen

==============================================================

function Person(name, age, job){    this.name = name;    this.age = age;    this.job = job;    this.sayName = function(){        alert(this.name);    }}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");alert(person1 == person2);//false==============================================================
function Person(name, age, job){    this.name = name;    this.age = age;    this.job = job;    this.sayName = new Function(alert(this.name));}function sayName(){    alert(this.name);}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");alert(person1.sayName == person2.sayName);//true
0 0
原创粉丝点击